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.

Diagramm, das den WDDM-Vorgangsfluss zeigt, von der Erstellung eines Renderinggeräts bis zur Darstellung von Inhalten auf dem Display.

  • 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:

  • Ü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:

      • Die pfnPresentCb-Funktion der Laufzeit, wenn Present aufgerufen wurde.
      • Die pfnRenderCb-Funktion der Laufzeit, wenn Flush aufgerufen wurde oder der Befehlspuffer voll ist.
    • 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.