Flusso dell'operazione WDDM (Windows Display Driver Model)

Il diagramma seguente illustra 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.

Diagramma che mostra il flusso dell'operazione WDDM dalla creazione di un dispositivo di rendering alla presentazione del contenuto sullo schermo.

  • Creazione di un dispositivo di rendering

    Dopo che un'applicazione richiede di creare un dispositivo di rendering:

    • 1: Il sottosistema del kernel grafico DirectX (Dxgkrnl) chiama la funzione DxgkDdiCreateDevice del driver miniport (KMD).

      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, che sono 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:

  • 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 in 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 seguenti funzioni fornite dal runtime:

    • 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 allocazione che descrive le superfici usate.

  • Invio del buffer DMA all'hardware

    • 11: Dxgkrnl chiama la funzione DxgkDdiBuildPagingBuffer di KMD per creare buffer DMA per scopi speciali che spostano le allocazioni specificate nell'elenco di allocazione 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 della GPU.

    • 13: Dxgkrnl chiama la funzione DxgkDdiPatch del 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 della 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'interruzione nella funzione DxgkDdiInterruptRoutine . Il kmD deve leggere, dalla GPU, l'identificatore di isolamento del buffer DMA appena completato.

    • 16: KMD deve chiamare la funzione DxgkCbNotifyInterrupt per notificare a DXGK che il buffer DMA è stato completato. Il KMD deve anche chiamare la funzione DxgkCbQueueDpc per accodare una chiamata di procedura posticipata (DPC).