Freigeben über


EvtIddCxMonitorAssignSwapChain Fehlerbehandlung

Änderung in evtIddCxMonitorAssignSwapChain Fehlerbehandlung

In Windows 10-Versionen vor Version 1903 war der Rest der Desktopkomposition nicht sicher, wenn EvtIddCxMonitorAssignSwapChain fehlgeschlagen ist. Es wurde weiterhin Frames gerendert und dargestellt, die der indirekte Anzeigeadapter nicht verarbeitet hat, was dazu führte, dass iddCx den indirekten Anzeigetreiber (IDD) nach einiger Zeit beendete.

Ab Windows 10, Version 1903 (IddCx 1.4), wurde die IddCx-Fehlerbehandlung für diesen Rückruf für alle Treiberversionen geändert und der STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN Statuscode eingeführt. Weitere Informationen finden Sie unter EvtIddCxMonitorAssignSwapChain.

Behandeln von Fehlern im Frameverarbeitungsschleifenthread

Nachdem die IDD erfolgreich von EvtIddCxMonitorAssignSwapChain zurückgegeben wurde, besitzt sie das hSwapChain-Objekt. Wenn der Treiber auf einen Fehler stößt, der verhindert, dass er den Frame weiter verarbeitet, kann er WdfObjectDelete aufrufen, um den Besitz freizugeben. Das Betriebssystem erkennt den Löschvorgang und bewirkt, dass eine neue Swapchain erstellt wird.

Wenn der Treiber weiß, dass er diesen Fehler nicht wiederherstellen kann, sollte iddCxReportCriticalError aufgerufen werden, um das Gerät zu beenden.

Vorgeschlagene Vorgehensweise zur Behandlung von Swapchainfehlern

Es gibt mehrere Gründe für Fehler innerhalb des EvtIddCxMonitorAssignSwapChain-Rückrufs oder während der Verarbeitung von Frames. Fehlerkategorisierungen umfassen:

  • Vorübergehende Probleme, die für Ihre Lösung spezifisch sind, z. B. ein temporäres Problem mit der Hardware. Diese Art von Problem kann mit einfachen Wiederherstellungsmechanismen behoben werden, die sich nicht auf die Benutzererfahrung auswirken, da die Wiederherstellung schnell (in der Regel gut ein zweites Mal) erfolgt und sich nicht auf den visuellen Inhalt auf dem Bildschirm auswirkt (z. B. keine Flacker).
  • Dauerhafte Probleme, die für Ihre Lösung spezifisch sind, z. B. ein Deadlock im Treiber oder ein schwerwiegendes Problem mit der Hardware. Diese Art von Problem kann in der Regel nicht schnell wiederhergestellt werden, wenn überhaupt.
  • DirectX-API-Fehler, die durch Ereignisse außerhalb Des Treibers verursacht werden. Der Treiber hat beispielsweise keine Kontrolle über Ereignisse wie den Zeitpunkt, an dem das D3D-Gerät das Desktopimage verarbeiten soll, PnpStopped, oder es gab einen GPU-weiten Fehler und wurde zurückgesetzt.
  • Von Ihrem Treiber verursachte DirectX-API-Fehler. Treiberfehler können dazu führen, dass das D3D-Gerät fehlerhaft oder hängen bleibt. Durch das Aufrufen von CopySubResource mit Koordinaten außerhalb der Grenze der Textur wird das Gerät beispielsweise in einen Fehlerzustand versetzt.
  • DirectX-API-Fehler, die durch einen anderen IHV-GPU-Treiber verursacht werden. Diese Fehler können zu korrekten Aufrufmustern in der IDD führen, die IHV-GPU-Treiberfehler auslösen.

Es ist für einen Treiber schwierig, zwischen den verschiedenen DirectX-Fehlern genau zu unterscheiden. Der Standard Unterschied besteht darin, dass Fehler, die durch externe DirectX-Komponenten verursacht werden, vorübergehend sind und das System in einen stabilen Zustand wiederhergestellt wird. Wenn der Fehler durch die indirekte Anzeige oder den GPU-Treiber verursacht wird, treten Fehler wahrscheinlich erneut auf.

Weitere Informationen zum Weitergeben dieser Fehler an das Betriebssystem finden Sie unter EvtIddCxMonitorAssignSwapChain.

Im Folgenden finden Sie einige Anleitungen zum Umgang mit den einzelnen Fehlertypen in Ihrem Treiber.

Vorübergehende Probleme, die für Ihre Lösung spezifisch sind

Der Treiber sollte das Problem beim Verarbeiten des Frames beheben. Diese Aktion kann zu einer geringen Verzögerung bei der Verarbeitung des Frames führen. Wenn der Fehler regelmäßig auftritt, könnte der Treiber in Erwägung ziehen, den Fehler auf ein dauerhaftes Problem zu überdenken.

Dauerhafte Probleme, die für Ihre Lösung spezifisch sind

Der Treiber sollte IddCxReportCriticalError mit einem hauptcode aufrufen, der gleich oder höher 0x100 ist und eindeutige Haupt-/Nebencodes verwendet, um den Typ des Fehlers darzustellen, um Kunden-/Telemetrieuntersuchungen zu unterstützen.

DirectX-Fehler

Die einfachste Möglichkeit zum Behandeln von DirectX-Fehlern besteht darin, sie wieder an das Betriebssystem weiterzuverbreiten, sodass es erneut versucht wird. Der Treiber sollte STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN von EvtIddCxMonitorAssignSwapChain zurückgeben, oder wenn der Fehler während der Verarbeitung eines Frames auftritt, sollte der Treiber die Swapchain freigeben, indem WdfObjectDelete aufgerufen wird.

Dieser einfache Ansatz behandelt Fehler, die durch externe Ereignisse ausgelöst werden, da das Betriebssystem eine neue Swapchain (möglicherweise auf einem neuen Dxgi-Adapter) stabilisiert und erstellt. Wenn die Verwendung von DirectX begrenzt ist, funktioniert dieser Ansatz gut.

Bei komplexeren Treibern, die directX-Fehler verursachen können, die durch Fehler in der IDD oder für Treiber verursacht werden, die auf alten/fehlerhaften DirectX-Treibern ausgeführt werden, kann dieser Ansatz in einer endlosen Schleife von ID-Swapchain-Fehlern enden. Um eine Endlosschleife zu vermeiden, könnte die IDD die Häufigkeit dieser Fehler überwachen und durch Phasen der Wiederherstellung navigieren, wenn eine bestimmte Phase genügend Fehlerzyklen erreicht hat. Wenn DirectX-Fehler auftreten, ist es wichtig, dass der Treiber dieses DX-Gerät zerstört und ein neues erstellt, da ein DX-Gerät in einem Fehlerzustand nie wiederhergestellt wird und neu erstellt werden muss.

Aktuelle Stufe Treiberaktion, wenn zu viele aufeinander folgende Swapchain-DirectX-Fehler erkannt werden
Renderadapter-LUID in EvtIddCxMonitorAssignSwapChain ist ein Hardwareadapter Verwenden Sie Dxgi, um die LUID des Softwareadapters zu finden und IddCxAdapterSetRenderAdapter aufzurufen, um anzufordern, dass das Betriebssystem den Softwareadapter zum Rendern des Desktops verwendet.
Renderadapter LUID in EvtIddCxMonitorAssignSwapChain ist ein Softwareadapter Der Treiber sollte IddCxReportCriticalError mit einem hauptcode gleich oder über 0x100 aufrufen und eindeutige Haupt-/Nebencodes verwenden, um den Typ des Fehlers darzustellen, um Kunden-/Telemetrieuntersuchungen zu unterstützen.

Beispielsweise könnte der Treiber fünf aufeinander folgende DirectX-Fehler in EvtIddCxMonitorAssignSwapChain oder fünf Fehlern beim Verarbeiten von Frames mit 1 Minute als Kriterien berücksichtigen, um die Wiederherstellungsaktion für die aktuelle Phase in tabelle oben auszuführen.