Condividi tramite


Supporto dell'acquisizione video e di altri dispositivi figlio

Un driver miniport di visualizzazione e il driver per un dispositivo di acquisizione video o un altro dispositivo figlio possono definire a vicenda un'interfaccia privata che il driver figlio può usare per comunicare con il dispositivo tramite il driver miniport padre. Un driver di acquisizione video figlio deve essere strettamente associato al driver miniport dello schermo padre. Infatti, l'acquisizione video potrebbe essere implementata come parte del driver miniport di visualizzazione. Un driver di acquisizione video può usare l'interfaccia privata con il driver miniport di visualizzazione per accedere al bus I2C e per altri scopi.

Per inizializzare l'interfaccia privata, il driver di acquisizione video invia una richiesta di IRP_MN_QUERY_INTERFACE al driver della porta di visualizzazione (parte di Dxgkrnl.sys) per il driver miniport di visualizzazione. Dopo che il driver della porta di visualizzazione riceve tale richiesta, chiama la funzione DxgkDdiQueryInterface del driver miniport e passa un puntatore a una struttura QUERY_INTERFACE che contiene informazioni per inizializzare l'interfaccia privata.

Nota Se l'acquisizione video viene implementata come parte del driver miniport di visualizzazione, l'acquisizione video potrebbe chiamare direttamente DxgkDdiQueryInterface .

Ogni driver di un dispositivo figlio (inclusi i dispositivi di acquisizione video) deve restituire il GUID dell'adattatore che indica l'hardware a cui è associato il dispositivo. Il GUID dell'adattatore viene fornito al driver miniport di visualizzazione nel membro AdapterGuid della struttura DXGK_START_INFO a cui punta il parametro DxgkStartInfo della funzione DxgkDdiStartDevice che viene inviata quando viene inizializzata la scheda. I componenti di acquisizione in modalità utente possono successivamente eseguire il mapping di questo GUID dell'adattatore a una scheda di visualizzazione.

In Microsoft Windows 2000 Display Driver Model le applicazioni di acquisizione video inviano buffer di acquisizione della memoria di sistema alla modalità kernel. La modalità kernel descrive quindi i buffer di memoria di sistema usando le strutture MDL (Memory Descriptor List) e invia gli elenchi mdls al driver di acquisizione video. Oltre a supportare l'acquisizione nella memoria di sistema, il modello di driver di visualizzazione di Windows Vista supporta l'acquisizione nella memoria video. Il runtime Direct3D chiama le funzioni directX Video Acceleration 2.0 per indirizzare la GPU a eseguire post-elaborazione sui dati di acquisizione. Invece di inviare mdls per descrivere i buffer di memoria video, il driver di visualizzazione in modalità utente invierà valori di tipo D3DKMT_HANDLE che sono handle per acquisire allocazioni di buffer. Di conseguenza, la combinazione di driver di acquisizione video e miniport di visualizzazione può usare funzioni di callback esistenti come DxgkCbGetHandleData per fare riferimento a dati privati che descrivono il buffer di acquisizione. La combinazione di driver può anche usare la funzione di callback DxgkCbGetCaptureAddress per restituire l'indirizzo fisico del buffer di acquisizione.

Le applicazioni di acquisizione video chiamano nel runtime Direct3D per creare buffer di acquisizione; il runtime chiama successivamente nel driver di visualizzazione in modalità utente. Il runtime chiama la funzione CreateResource del driver di visualizzazione in modalità utente con il flag di campo di bit CaptureBuffer impostato nel membro Flags della struttura D3DDDIARG_CREATERESOURCE per creare buffer di acquisizione. Il driver miniport di visualizzazione deve anche specificare il flag di campo di bit capture per la gestione memoria video quando il gestore della memoria chiama la funzione DxgkDdiCreateAllocation del driver miniport di visualizzazione per creare allocazioni per i buffer di acquisizione. Quando vengono creati i buffer di acquisizione, vengono aggiunti immediatamente in memoria e non vengono rimossi finché non vengono rilasciati. Poiché lo stack di acquisizione deve inviare handle di allocazione in modalità kernel per i buffer di acquisizione al driver di acquisizione, il runtime chiama la funzione GetCaptureAllocationHandle del driver di visualizzazione in modalità utente per eseguire il mapping di ogni handle di risorsa all'handle di allocazione in modalità kernel per tale risorsa.

Il driver di acquisizione può segnalare se supporta l'acquisizione diretta nella memoria di sistema. Se il driver di acquisizione supporta l'acquisizione direttamente nella memoria di sistema, a questo scopo vengono inviati al driver di acquisizione. Se il driver di acquisizione non supporta l'acquisizione diretta nella memoria di sistema, il runtime crea buffer di acquisizione di memoria video e il driver di acquisizione deve riempirli. La funzione CaptureToSysMem del driver di visualizzazione in modalità utente viene chiamata per copiare il contenuto di un buffer di acquisizione in una superficie di memoria di sistema. Il runtime può usare CaptureToSysMem anziché la funzione Blt per sfruttare l'hardware speciale per i trasferimenti di blocchi di bit (bitblt) che non richiedono che il driver di visualizzazione in modalità utente chiami la funzione pfnRenderCb .

Poiché AVStream controlla l'acquisizione video, il sottosistema kernel grafico DirectX non è in grado di rilevare quando si verifica l'acquisizione video. Tuttavia, il sottosistema del kernel grafico riconosce le allocazioni usate come buffer di acquisizione. Quando un buffer di acquisizione sta per essere eliminato definitivamente, il sottosistema del kernel grafico chiama la funzione DxgkDdiStopCapture del driver miniport di visualizzazione per indicare che l'operazione di acquisizione deve interrompere immediatamente l'uso di un'allocazione come buffer di acquisizione. Se l'operazione di acquisizione è già stata arrestata tramite lo stack di acquisizione, il driver può ignorare in modo sicuro la chiamata.