Freigeben über


Threadsynchronisierung und TDR

Die folgende Abbildung zeigt, wie die Threadsynchronisierung für den Anzeigeminiporttreiber im Windows Display Driver Model (WDDM) funktioniert.

Diagramm, das die Threadsynchronisierung in WDDM zeigt.

Wenn ein Hardwaretimeout auftritt, wird der Timeouterkennungs- und Wiederherstellungsprozess (Timeout Detection and Recovery, TDR) initiiert. Der GPU-Scheduler ruft die DxgkDdiResetFromTimeout-Funktion des Treibers auf, die die GPU zurücksetzt. DxgkDdiResetFromTimeout wird synchron mit jeder anderen Anzeige-Miniport-Treiberfunktion aufgerufen, mit Ausnahme der Laufzeit-Energieverwaltungsfunktionen DxgkDdiSetPowerComponentFState und DxgkDdiPowerRuntimeControlRequest. Das heißt, kein anderer Thread wird im Treiber ausgeführt, während der DxgkDdiResetFromTimeout-Thread ausgeführt wird. Das Betriebssystem garantiert außerdem, dass während des Aufrufs von DxgkDdiResetFromTimeout von keiner Anwendung aus auf den Framepuffer zugegriffen werden kann. Daher kann der Treiber eine PLL-Schleife (Phase Locked Loop) des Speichercontrollers usw. zurücksetzen.

Während der Wiederherstellungsthread DxgkDdiResetFromTimeout ausführt, können Interrupts und verzögerte Prozeduraufrufe (DpCs) weiterhin aufgerufen werden. Die KeSynchronizeExecution-Funktion kann verwendet werden, um Teile der Zurücksetzungsprozedur mit Geräteunterbrechungen zu synchronisieren.

Nachdem der Treiber von DxgkDdiResetFromTimeout zurückgegeben wurde, können die meisten Treiberfunktionen wieder aufgerufen werden, und das Betriebssystem beginnt, ressourcen zu sauber, die nicht mehr benötigt werden. Während des Bereinigungszeitraums werden die folgenden Treiberfunktionen aus den angegebenen Gründen aufgerufen:

  • Der Treiber wird aufgerufen, um zu benachrichtigen, dass eine Zuordnung entfernt wird.

    Wenn die Zuordnung beispielsweise in einem Speichersegment ausgelagert wurde, wird die DxgkDdiBuildPagingBuffer-Funktion des Treibers aufgerufen, wobei der Vorgangsmember der DXGKARG_BUILDPAGINGBUFFER-Struktur auf DXGK_OPERATION_TRANSFER und der Transfer.Size-Member auf Null festgelegt ist, um den Treiber über die Entfernung zu informieren. Beachten Sie, dass keine Inhaltsübertragung erforderlich ist, da der Inhalt während des Zurücksetzens verloren gegangen ist.

    Wenn die Zuordnung in einem Blendensegment ausgelagert wurde, wird die DxgkDdiBuildPagingBuffer-Funktion des Treibers aufgerufen, wobei der Vorgangsmember von DXGKARG_BUILDPAGINGBUFFER auf DXGK_OPERATION_UNMAP_APERTURE_SEGMENT festgelegt ist, um den Treiber zu informieren, die Zuordnung aus der Blende aufzuheben.

  • Die DxgkDdiReleaseSwizzlingRange-Funktion des Treibers wird aufgerufen, um einen unwizzling-Blenden- und Segmentöffnungsbereiche freizugeben.

Der Treiber sollte während der vorherigen Aufrufe nicht auf die GPU zugreifen, es sei denn, dies ist absolut erforderlich.

Nach Ablauf des Bereinigungszeitraums ruft das Betriebssystem die DxgkDdiRestartFromTimeout-Funktion des Treibers auf, um den Treiber darüber zu informieren, dass die Bereinigung abgeschlossen ist und dass das Betriebssystem den Adapter zum Rendern wieder verwendet.