Übermitteln eines Befehlspuffers
Die folgende Abfolge von Vorgängen muss ausgeführt werden, um einen Befehlspuffer über den Windows Vista-Grafikstapel zu übergeben:
Der Benutzermodusanzeigetreiber initiiert eine Befehlspufferübermittlung, wenn die Direct3D-Runtime eine der folgenden Benutzermodusanzeigetreiberfunktionen aufruft, um den angegebenen Vorgang auszuführen:
- Die Present-Funktion zum Anzeigen von Grafiken.
- Die Flush-Funktion zum Übermitteln von Hardwarebefehlen.
- Die Lock-Funktion zum Sperren einer Ressource, die im aktuellen Befehlsbatch verwendet wird.
Beachten Sie, dass der Benutzermodusanzeigetreiber immer auch eine Befehlspufferübermittlung initiiert, wenn der Befehlspuffer voll ist.
Der Benutzermodusanzeigetreiber ruft die Funktion pfnRenderCb der Direct3D-Runtime auf, um den Befehlspuffer an die Runtime zu übermitteln.
Das DirectX-Grafikkernsubsystem ruft die DxgkDdiRender - oder DxgkDdiRenderKm-Funktion des Anzeigeminiporttreibers auf, um den Befehlspuffer zu überprüfen, einen DMA-Puffer im Hardwareformat zu schreiben und eine Zuordnungsliste zu erstellen, die die verwendeten Oberflächen beschreibt. Beachten Sie, dass der DMA-Puffer noch nicht gepatcht wurde (d. a. zugewiesene physische Adressen). Hinweis Wenn die Runtime die Befehlspufferübermittlung durch Aufrufen der Present-Funktion des Benutzermodusanzeigetreibers initiiert hat, ruft das Grafiksubsystem die DxgkDdiPresent-Funktion des Anzeige-Miniporttreibers anstelle von DxgkDdiRender oder DxgkDdiRenderKm auf.
Der Videospeicher-Manager ruft die DxgkDdiBuildPagingBuffer-Funktion des Anzeigeminiporttreibers auf, um spezielle DMA-Puffer zu erstellen, die als Pagingpuffer bezeichnet werden, die die in der Zuordnungsliste angegebenen Zuordnungen, die den DMA-Puffer begleiten, in und aus gpu-zugänglichem Speicher verschieben. Weitere Informationen finden Sie unter Auslagerung von Videospeicherressourcen.
Der GPU-Planer ruft die DxgkDdiPatch-Funktion des Anzeigeminiporttreibers auf, um den Ressourcen im DMA-Puffer physische Adressen zuzuweisen. Der Scheduler ist jedoch nicht erforderlich, DxgkDdiPatch aufzurufen, um dem Pagingpuffer physische Adressen zuzuweisen, da während des DxgkDdiBuildPagingBuffer-Aufrufs physische Adressen für den Pagingpuffer übergeben und zugewiesen wurden.
Der GPU-Planer ruft die DxgkDdiSubmitCommand-Funktion des Anzeigeminiporttreibers auf, um anzufordern, dass der Treiber den Pagingpuffer in die GPU-Ausführungseinheit einreiht.
Der GPU-Planer ruft die DxgkDdiSubmitCommand-Funktion des Anzeigeminiporttreibers auf, um anzufordern, dass der Treiber den DMA-Puffer in die GPU-Ausführungseinheit einreiht. Jeder an die GPU übermittelte DMA-Puffer enthält einen Zaunbezeichner. Nachdem die GPU die Verarbeitung des DMA-Puffers abgeschlossen hat, generiert die GPU einen Interrupt.
Der Anzeigeminiporttreiber wird über den Interrupt in seiner DxgkDdiInterruptRoutine-Funktion benachrichtigt. Der Anzeigeminiporttreiber sollte aus der GPU den Zaunbezeichner des gerade abgeschlossenen DMA-Puffers lesen.
Der Anzeigeminiporttreiber sollte die DxgkCbNotifyInterrupt-Funktion aufrufen, um den GPU-Planer darüber zu informieren, dass der DMA-Puffer abgeschlossen wurde.
Der Anzeigeminiporttreiber sollte die DxgkCbQueueDpc-Funktion aufrufen, um einen verzögerten Prozeduraufruf (DPC) in die Warteschlange zu stellen.
Der DPC des Anzeigeminiporttreibers wird benachrichtigt, um den Großteil der DMA-Pufferverarbeitung zu verarbeiten.