Windows Display Driver Model (WDDM)-Vorgangsfluss
Das folgende Diagramm zeigt den Fluss von WDDM-Vorgängen, die beim Erstellen eines Renderinggeräts zum Anzeigen des Inhalts auftreten. Die folgenden Informationen beschreiben die sortierte Abfolge des Vorgangsflusses ausführlicher.
Erstellen eines Renderinggeräts
Nachdem eine Anwendung das Erstellen eines Renderinggeräts anfordert:
1: Das DirectX Graphics Kernel Subsystem (Dxgkrnl) ruft die KMD-Funktion des Kernelmodus-Miniporttreibers (KMD) DxgkDdiCreateDevice auf.
KMD initialisiert den direkten Speicherzugriff (Direct Memory Access, DMA), indem ein Zeiger auf eine gefüllte DXGK_DEVICEINFO Struktur im pInfo-Element der DXGKARG_CREATEDEVICE-Struktur zurückgegeben wird.
2: Wenn der Aufruf von DxgkDdiCreateDevice erfolgreich ist, ruft die Direct3D-Laufzeit die CreateDevice-Funktion (CreateDevice) des Anzeigetreibers im Benutzermodus auf.
3: Im CreateDevice-Aufruf muss UMD die pfnCreateContextCb-Funktion der Laufzeit explizit aufrufen, um einen oder mehrere GPU-Kontexte zu erstellen, die GPU-Threads der Ausführung auf dem neu erstellten Gerät sind. Die Laufzeit gibt Informationen an UMD in den Membern pCommandBuffer und CommandBufferSize der D3DDDICB_CREATECONTEXT Struktur zurück, um den Befehlspuffer zu initialisieren.
Erstellen von Surfaces für ein Gerät
Nachdem eine Anwendung die Erstellung von Oberflächen für das Renderinggerät anfordert:
4: Die Direct3D-Laufzeit ruft die CreateResource-Funktion von UMD auf.
5: CreateResource ruft die vom Laufzeit bereitgestellte pfnAllocateCb-Funktion auf.
6: Die Laufzeit ruft die DxgkDdiCreateAllocation-Funktion von KMD auf, wobei die Anzahl und die Typen der zu erstellenden Zuordnungen angegeben werden. DxgkDdiCreateAllocation gibt Informationen über die Zuordnungen in einem Array von DXGK_ALLOCATIONINFO Strukturen im pAllocationInfo-Element der DXGKARG_CREATEALLOCATION-Struktur zurück.
Übermitteln des Befehlspuffers an den Kernelmodus
Nachdem eine Anwendung das Zeichnen auf eine Oberfläche anfordert:
7: Die Direct3D-Laufzeit ruft die UMD-Funktion im Zusammenhang mit dem Zeichnungsvorgang auf, z. B. DrawPrimitive2.
8: Die Direct3D-Laufzeit ruft entweder die UMD-Funktion "Present" oder "Flush" auf, damit der Befehlspuffer an den Kernelmodus übermittelt wird. Hinweis: UMD sendet auch den Befehlspuffer, wenn der Befehlspuffer voll ist.
9: Als Reaktion auf Schritt 8 ruft UMD eine der folgenden vom Laufzeit bereitgestellten Funktionen auf:
10: Die DxgkDdiPresent-Funktion von KMD wird aufgerufen, wenn pfnPresentCb aufgerufen wurde, oder die Funktion DxgkDdiRender oder DxgkDdiRenderKm, wenn pfnRenderCb aufgerufen wurde. KMD überprüft den Befehlspuffer, schreibt in den DMA-Puffer im Hardwareformat und erstellt eine Zuordnungsliste, die die verwendeten Oberflächen beschreibt.
Übermitteln des DMA-Puffers an die Hardware
11: Dxgkrnl ruft die DxgkDdiBuildPagingBuffer-Funktion von KMD auf, um spezielle DMA-Puffer zu erstellen, mit denen die in der Zuordnungsliste angegebenen Zuordnungen in und vom GPU-Speicher verschoben werden. Diese speziellen DMA-Puffer werden als Pagingpuffer bezeichnet. DxgkDdiBuildPagingBuffer wird nicht für jeden Frame aufgerufen.
12: Dxgkrnl ruft die DxgkDdiSubmitCommand-Funktion von KMD auf, um die Pagingpuffer in die GPU-Ausführungseinheit in die Warteschlange zu stellen.
13: Dxgkrnl ruft die DxgkDdiPatch-Funktion von KMD auf, um den Ressourcen im DMA-Puffer physische Adressen zuzuweisen.
14: Dxgkrnl ruft die DxgkDdiSubmitCommand-Funktion von KMD auf, um den DMA-Puffer in die GPU-Ausführungseinheit in die Warteschlange zu stellen. Jeder an die GPU übermittelte DMA-Puffer enthält einen Zaunbezeichner, der eine Zahl ist. Nachdem die GPU die Verarbeitung des DMA-Puffers abgeschlossen hat, generiert die GPU einen Interrupt.
15: KMD wird über den Interrupt in seiner DxgkDdiInterruptRoutine-Funktion benachrichtigt. KMD sollte aus der GPU den Zaunbezeichner des soeben abgeschlossenen DMA-Puffers lesen.
16: KMD sollte dxgkCbNotifyInterrupt aufrufen, um den DXGK zu benachrichtigen, dass der DMA-Puffer abgeschlossen wurde. KMD sollte auch DxgkCbQueueDpc aufrufen, um einen verzögerten Prozeduraufruf (DPC) in die Warteschlange zu stellen.