Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Wijziging in EvtIddCxMonitorAssignSwapChain-foutafhandeling
In Windows 10-versies vóór versie 1903 was de rest van de bureaubladsamenstelling niet op de hoogte als EvtIddCxMonitorAssignSwapChain mislukte. Het bleef frames weergeven en presenteren die de indirecte beeldschermadapter niet verwerkte, wat ertoe leidde dat IddCx na enige tijd de indirecte beeldschermstuurprogramma (IDD) beëindigde.
Vanaf Windows 10 versie 1903 (IddCx 1.4) is iddCx-foutafhandeling voor deze callback gewijzigd voor alle stuurprogrammaversies en is de STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN statuscode geïntroduceerd. Zie EvtIddCxMonitorAssignSwapChain voor meer informatie.
Afhandeling van fouten in de frameverwerkingsloop-thread
Zodra de IDD succesvol terugkeert van EvtIddCxMonitorAssignSwapChain, bezit het het hSwapChain-object. Als het stuurprogramma een fout tegenkomt die verhindert dat het frame verder wordt verwerkt, kan WdfObjectDelete worden aangeroepen om het eigendom vrij te geven. Het besturingssysteem detecteert de verwijdering en zorgt ervoor dat er een nieuwe swapchain wordt gemaakt.
Als het stuurprogramma weet dat het zich niet kan herstellen van deze fout, moet het IddCxReportCriticalError aanroepen om het apparaat te stoppen.
Voorgestelde benadering voor het afhandelen van wisselhangerfouten
Er zijn verschillende redenen voor falen binnen de EvtIddCxMonitorAssignSwapChain callback of tijdens het verwerken van frames. Foutcategorieën omvatten onder andere:
- Tijdelijke problemen die specifiek zijn voor uw oplossing, zoals een tijdelijk probleem met de hardware. Dit type probleem kan worden opgelost met lichtgewicht herstelmechanismen die geen invloed hebben op de gebruikerservaring, omdat herstel snel plaatsvindt (meestal minder dan een seconde in de tijd) en geen invloed heeft op de visuele inhoud op het scherm (bijvoorbeeld geen flikkeringen).
- Permanente problemen die specifiek zijn voor uw oplossing, zoals een impasse in het stuurprogramma of een ernstig probleem met de hardware. Dit type probleem kan doorgaans niet snel worden hersteld.
- DirectX API-fouten veroorzaakt door gebeurtenissen buiten uw stuurprogramma. Uw stuurprogramma heeft bijvoorbeeld geen controle over gebeurtenissen zoals wanneer de adapter waarop uw D3D-device de bureaubladafbeelding moet verwerken PnpStopped werd, of er een GPU-brede fout optrad en deze werd gereset.
- DirectX API-fouten die worden veroorzaakt door uw stuurprogramma. Stuurprogrammafouten kunnen ertoe leiden dat het D3D-apparaat in een fout wordt geplaatst of vastloopt. Als u bijvoorbeeld CopySubResource aanroept met coördinaten buiten de grenzen van het patroon, krijgt het apparaat een foutstatus.
- DirectX API-fouten veroorzaakt door een ander IHV GPU-stuurprogramma. Deze fouten kunnen het gevolg zijn van de juiste aanroeppatronen in de IDD, die bugs in IHV GPU-stuurprogramma's activeren.
Het is moeilijk voor een stuurprogramma om nauwkeurig onderscheid te maken tussen de verschillende DirectX-fouten. Het belangrijkste verschil is dat fouten die worden veroorzaakt door externe DirectX-onderdelen waarschijnlijk tijdelijk zijn en het systeem in een stabiele status zal herstellen; terwijl, als de fout wordt veroorzaakt door het indirecte beeldscherm of GPU-stuurprogramma, fouten waarschijnlijk opnieuw optreden.
Zie EvtIddCxMonitorAssignSwapChain voor meer informatie over het doorgeven van deze fouten aan het besturingssysteem, zodat het besturingssysteem het opnieuw probeert.
Hieronder vindt u enkele richtlijnen voor het omgaan met elk type fout in uw stuurprogramma.
Tijdelijke problemen die specifiek zijn voor uw oplossing
Het stuurprogramma moet het probleem oplossen tijdens het verwerken van het frame. Deze actie kan leiden tot een kleine vertraging bij het verwerken van het frame. Als de fout regelmatig optreedt, kan de driver overwegen om de fout te beschouwen als een permanente kwestie.
Permanente problemen die specifiek zijn voor uw oplossing
Het stuurprogramma moet IddCxReportCriticalError aanroepen met behulp van een primaire code die gelijk is aan of hoger dan 0x100 en unieke hoofd-/subcodes gebruikt om het type fout aan te geven ter ondersteuning van klant-/telemetrieonderzoeken.
DirectX-fout
De eenvoudigste manier om DirectX-fouten af te handelen, is door ze weer door te geven aan het besturingssysteem, zodat het opnieuw wordt geprobeerd. Het stuurprogramma moet STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN retourneren van EvtIddCxMonitorAssignSwapChain of, als de fout optreedt tijdens het verwerken van een frame, moet het stuurprogramma de swapchain vrijgeven door WdfObjectDelete aan te roepen.
Met deze eenvoudige benadering worden fouten aangepakt die worden geactiveerd door externe gebeurtenissen, omdat het besturingssysteem zal stabiliseren en een nieuwe swapchain zal maken (mogelijk op een nieuwe DXGI-adapter). Als het gebruik van DirectX van het stuurprogramma beperkt is, werkt deze aanpak goed.
Voor complexere stuurprogramma's die directX-fouten kunnen raken die worden veroorzaakt door fouten in de IDD of voor stuurprogramma's die worden uitgevoerd op oude/buggy DirectX-stuurprogramma's, kan deze aanpak eindigen in een eindeloze lus van id-wisselketenfouten. Om een eindeloze lus te voorkomen, kan de IDD de frequentie van deze fouten bewaken en door fasen van herstel gaan wanneer een bepaalde fase voldoende foutcycli heeft bereikt. Als Er DirectX-fouten optreden, is het belangrijk dat het stuurprogramma dat DX-apparaat vernietigt en een nieuw apparaat maakt, omdat zodra een DX-apparaat een foutstatus heeft, het nooit herstelt en opnieuw moet worden gemaakt.
| Huidige fase | Stuurprogramma-actie bij detectie van een teveel aan opeenvolgende swapchain DirectX-fouten |
|---|---|
| Render adapter LUID geleverd in EvtIddCxMonitorAssignSwapChain is een hardwareadapter | Gebruik Dxgi om de LUID van de softwareadapter te vinden en IddCxAdapterSetRenderAdapter aan te roepen om aan te vragen dat het besturingssysteem de softwareadapter gebruikt om het bureaublad weer te geven. |
| Render adapter LUID geleverd in EvtIddCxMonitorAssignSwapChain is een softwareadapter | Het stuurprogramma moet IddCxReportCriticalError aanroepen met behulp van een primaire code die gelijk is aan of boven 0x100 en unieke primaire/secundaire codes gebruikt om het type fout aan te geven om klant-/telemetrieonderzoeken te helpen |
Het stuurprogramma kan bijvoorbeeld vijf opeenvolgende DirectX-fouten in EvtIddCxMonitorAssignSwapChain of vijf fouten overwegen tijdens het verwerken van frames met 1 minuut als criteria om de herstelactie voor de huidige fase in de bovenstaande tabel uit te voeren.