EvtIddCxMonitorAssignSwapChain error handling
Modifica nella gestione degli errori EvtIddCxMonitorAssignSwapChain
Nelle versioni di Windows 10 precedenti alla versione 1903, il resto della composizione desktop non era a conoscenza se EvtIddCxMonitorAssignSwapChain non è riuscito. Ha continuato a eseguire il rendering e presentare fotogrammi che l'adattatore di visualizzazione indiretto non ha elaborato, causando iddCx terminando il driver di visualizzazione indiretto (IDD) dopo qualche tempo.
A partire da Windows 10 versione 1903 (IddCx 1.4), la gestione degli errori IddCx per questo callback è stata modificata per tutte le versioni del driver e ha introdotto il codice di stato STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN . Per informazioni dettagliate, vedere EvtIddCxMonitorAssignSwapChain.
Gestione degli errori nel thread del ciclo di elaborazione dei fotogrammi
Una volta restituito correttamente l'IDD da EvtIddCxMonitorAssignSwapChain, è proprietario dell'oggetto hSwapChain. Se il driver rileva un errore che impedisce di continuare a elaborare il frame, può chiamare WdfObjectDelete per rilasciare la proprietà. Il sistema operativo rileverà l'eliminazione e causerà la creazione di una nuova porta di scambio.
Se il driver sa che non è in grado di eseguire il ripristino da questo errore, deve chiamare IddCxReportCriticalError per arrestare il dispositivo.
Approccio suggerito per gestire gli errori di swapchain
Esistono diversi motivi di errore all'interno del callback EvtIddCxMonitorAssignSwapChain o durante l'elaborazione dei fotogrammi. Le categorizzazioni degli errori includono:
- Problemi temporanei specifici della soluzione, ad esempio un problema temporaneo con l'hardware. Questo tipo di problema può essere risolto con meccanismi di recupero leggeri che non influiscono sull'esperienza utente perché il ripristino avviene rapidamente (in genere ben sotto un secondo in tempo) e non influirà sul contenuto visivo sullo schermo (ad esempio, nessun tocco).
- Problemi permanenti specifici della soluzione, ad esempio un deadlock nel driver o un problema grave con l'hardware. Questo tipo di problema in genere non può essere recuperato rapidamente, se necessario.
- Errori dell'API DirectX causati da eventi esterni al driver. Ad esempio, il driver non ha alcun controllo sugli eventi, ad esempio quando la scheda in cui il dispositivo D3D sta elaborando l'immagine desktop è stata PnpStopped o si è verificato un errore a livello di GPU ed è stato reimpostato.
- Errori dell'API DirectX causati dal driver. I bug del driver possono causare l'errore o il blocco del dispositivo D3D. Ad esempio, la chiamata a CopySubResource con coordinate esterne al limite della trama invierà il dispositivo in uno stato di errore.
- Errori dell'API DirectX causati da un altro driver GPU IHV. Questi errori potrebbero essere il risultato di modelli di chiamata corretti nel IDD che attivano bug del driver GPU IHV.
È difficile per un driver distinguere accuratamente tra i diversi errori DirectX. La differenza principale è che gli errori causati da componenti DirectX esterni sono probabilmente temporanei e il sistema verrà ripristinato in uno stato stabile; mentre, se l'errore è causato dalla visualizzazione indiretta o dal driver GPU, è probabile che si verifichino di nuovo bug.
Per altre informazioni su come propagare questi errori al sistema operativo, vedere EvtIddCxMonitorAssignAssignSwapChain.
Di seguito sono riportate alcune indicazioni su come gestire ogni tipo di errore nel driver.
Problemi temporanei specifici della soluzione
Il driver deve risolvere il problema durante l'elaborazione del frame. Questa azione potrebbe comportare un piccolo ritardo nell'elaborazione del frame. Se l'errore si verifica regolarmente, il driver potrebbe considerare la possibilità di impedire l'errore a un problema permanente.
Problemi permanenti specifici della soluzione
Il driver deve chiamare IddCxReportCriticalError usando un codice principale uguale o superiore a 0x100 e usando codici principali/secondari univoci per rappresentare il tipo di errore per aiutare le indagini di clienti/telemetria.
Errore DirectX
Il modo più semplice per gestire gli errori DirectX consiste nel propagarli nuovamente al sistema operativo in modo da riprovare. Il driver deve restituire STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN da EvtIddCxMonitorAssignSwapChain oppure, se l'errore si verifica durante l'elaborazione di un frame, il driver deve rilasciare la swapchain chiamando WdfObjectDelete.
Questo approccio semplice gestisce gli errori generati da eventi esterni, in quanto il sistema operativo si stabilizzerà e creerà una nuova swapchain (possibilmente in una nuova scheda Dxgi). Se l'uso del driver di DirectX è limitato, questo approccio funziona bene.
Per driver più complessi che potrebbero colpire errori DirectX causati da bug nel IDD o per i driver in esecuzione su driver DirectX obsoleti/buggy, questo approccio potrebbe terminare in un ciclo infinito di errori della swapchain ID. Per evitare un ciclo infinito, l'IDD potrebbe monitorare la frequenza di questi errori e spostarsi nelle fasi di ripristino quando una determinata fase ha raggiunto cicli di errore sufficienti. Se vengono rilevati errori DirectX, è importante che il driver distrugga il dispositivo DX e ne crei uno nuovo, perché una volta che un dispositivo DX è in uno stato di errore, non verrà mai ripristinato e deve essere ricreato.
Fase corrente | Azione del driver se rileva troppi errori DirectX consecutivi |
---|---|
L'adattatore di rendering LUID fornito in EvtIddCxMonitorAssignSwapChain è una scheda hardware | Usare Dxgi per trovare il LUID dell'adattatore software e chiamare IddCxAdapterSetRenderAdapter per richiedere che il sistema operativo usi l'adattatore software per il rendering del desktop. |
L'adattatore di rendering LUID fornito in EvtIddCxMonitorAssignSwapChain è una scheda software | Il driver deve chiamare IddCxReportCriticalError usando un codice principale uguale o superiore 0x100 e usando codici principali/secondari univoci per rappresentare il tipo di errore per aiutare le indagini di clienti/telemetria |
Ad esempio, il driver potrebbe considerare cinque errori DirectX consecutivi in EvtIddCxMonitorAssignSwapChain o cinque errori durante l'elaborazione dei fotogrammi con 1 minuto come criteri per eseguire l'azione di ripristino per la fase corrente nella tabella precedente.