Flusso dell'operazione WINDOWS Display Driver Model (WDDM)
Il diagramma seguente mostra il flusso delle operazioni WDDM che si verificano da quando viene creato un dispositivo di rendering a quando il contenuto viene presentato alla visualizzazione. Le informazioni che seguono il diagramma descrivono in modo più dettagliato la sequenza ordinata del flusso dell'operazione.
Creazione di un dispositivo di rendering
Dopo che un'applicazione richiede di creare un dispositivo di rendering:
1: Il sottosistema del kernel della grafica DirectX (Dxgkrnl) chiama la funzione DxgkDdiCreateDevice del driver in modalità kernel.
KmD inizializza l'accesso diretto alla memoria (DMA) restituendo un puntatore a una struttura DXGK_DEVICEINFO riempita nel membro pInfo della struttura DXGKARG_CREATEDEVICE.
2: Se la chiamata a DxgkDdiCreateDevice ha esito positivo, il runtime Direct3D chiama la funzione CreateDevice (UMD) del driver di visualizzazione in modalità utente.
3: Nella chiamata CreateDevice, UMD deve chiamare in modo esplicito la funzione pfnCreateContextCb del runtime per creare uno o più contesti GPU, ovvero thread GPU di esecuzione nel dispositivo appena creato. Il runtime restituisce informazioni a UMD nei membri pCommandBuffer e CommandBufferSize della struttura D3DDDICB_CREATECONTEXT per inizializzare il buffer dei comandi.
Creazione di superfici per un dispositivo
Dopo che un'applicazione richiede di creare superfici per il dispositivo di rendering:
4: il runtime Direct3D chiama la funzione CreateResource di UMD.
5: CreateResource chiama la funzione pfnAllocateCb fornita dal runtime.
6: il runtime chiama la funzione DxgkDdiCreateAllocation del KMD, specificando il numero e i tipi di allocazioni da creare. DxgkDdiCreateAllocation restituisce informazioni sulle allocazioni in una matrice di strutture DXGK_ALLOCATIONINFO nel membro pAllocationInfo della struttura DXGKARG_CREATEALLOCATION.
Invio del buffer dei comandi alla modalità kernel
Dopo che un'applicazione richiede di disegnare in una superficie:
7: Il runtime Direct3D chiama la funzione UMD correlata all'operazione di disegno, ad esempio DrawPrimitive2.
8: il runtime Direct3D chiama la funzione Present o Flush di UMD per fare in modo che il buffer dei comandi venga inviato alla modalità kernel. Nota: UMD invia anche il buffer dei comandi quando il buffer dei comandi è pieno.
9: In risposta al passaggio 8, UMD chiama una delle funzioni fornite dal runtime seguenti:
- Funzione pfnPresentCb del runtime se è stato chiamato Present.
- Funzione pfnRenderCb del runtime se Flush è stato chiamato o il buffer dei comandi è pieno.
10: la funzione DxgkDdiPresent di KMD viene chiamata se è stato chiamato pfnPresentCb o la funzione DxgkDdiRender o DxgkDdiRenderKm se è stato chiamato pfnRenderCb. KmD convalida il buffer dei comandi, scrive nel buffer DMA nel formato dell'hardware e produce un elenco di allocazioni che descrive le superfici usate.
Invio del buffer DMA all'hardware
11: Dxgkrnl chiama la funzione DxgkDdiBuildPagingBuffer di KMD per creare buffer DMA speciali che spostano le allocazioni specificate nell'elenco di allocazioni da e verso la memoria accessibile dalla GPU. Questi buffer DMA speciali sono noti come buffer di paging. DxgkDdiBuildPagingBuffer non viene chiamato per ogni fotogramma.
12: Dxgkrnl chiama la funzione DxgkDdiSubmitCommand di KMD per accodare i buffer di paging all'unità di esecuzione GPU.
13: Dxgkrnl chiama la funzione DxgkDdiPatch di KMD per assegnare indirizzi fisici alle risorse nel buffer DMA.
14: Dxgkrnl chiama la funzione DxgkDdiSubmitCommand di KMD per accodare il buffer DMA all'unità di esecuzione GPU. Ogni buffer DMA inviato alla GPU contiene un identificatore di recinto, ovvero un numero. Al termine dell'elaborazione del buffer DMA, la GPU genera un interrupt.
15: KMD riceve una notifica dell'interrupt nella funzione DxgkDdiInterruptRoutine . Il kmD deve leggere, dalla GPU, l'identificatore di isolamento del buffer DMA appena completato.
16: KMD deve chiamare DxgkCbNotifyInterrupt per notificare a DXGK che il buffer DMA è stato completato. KmD deve anche chiamare DxgkCbQueueDpc per accodare una chiamata di procedura posticipata (DPC).