Condividi tramite


Sincronizzazione dei thread e TDR

La figura seguente illustra come funziona la sincronizzazione dei thread per il driver di visualizzazione miniport in modalità kernel (KMD) nel WDDM.

Diagramma che mostra la sincronizzazione dei thread in WDDM.

Se si verifica un timeout hardware, il sistema avvia il processo di Timeout Detection and Recovery (TDR). Il pianificatore GPU chiama la funzione DxgkDdiResetFromTimeout del driver, che reimposta la GPU:

  • DxgkDdiResetFromTimeout viene chiamato in modo sincrono insieme a qualsiasi altra funzione KMD, eccetto le funzioni di gestione energetica del runtime DxgkDdiSetPowerComponentFState e DxgkDdiPowerRuntimeControlRequest. Ovvero, il sistema operativo garantisce che nessun altro thread sia in esecuzione nel driver mentre è in esecuzione il thread DxgkDdiResetFromTimeout.
  • Il sistema operativo garantisce anche che le applicazioni non possano accedere al frame buffer durante la chiamata a DxgkDdiResetFromTimeout. Di conseguenza, il driver può reimpostare un phase locked loop (PLL) del controllore di memoria e così via.

Mentre il thread di ripristino viene eseguito DxgkDdiResetFromTimeout, le interruzioni e le chiamate di routine posticipate possono continuare a essere chiamate. La funzione KeSynchronizeExecution può essere usata per sincronizzare parti della procedura di reimpostazione con interruzioni del dispositivo.

Dopo il ritorno del driver da DxgkDdiResetFromTimeout, la maggior parte delle funzioni del driver possono essere richiamate nuovamente e il sistema operativo inizia a liberare le risorse che non sono più necessarie. Durante il periodo di pulizia, vengono chiamate le funzioni driver seguenti per i motivi indicati:

  • Il driver viene chiamato per notificare la rimozione di un'allocazione.

    Ad esempio, se l'allocazione è stata inserita in un segmento di memoria, la funzione DxgkDdiBuildPagingBuffer viene chiamata con il membro Operation della struttura DXGKARG_BUILDPAGINGBUFFER impostato su DXGK_OPERATION_TRANSFER e con il membro Transfer.Size impostato su zero per informare il driver dell'eviction. Non è coinvolto alcun trasferimento di contenuto perché il contenuto è stato perso durante la reimpostazione.

    Se l'allocazione è stata inserita in un segmento dell'apertura, la funzione di DxgkDdiBuildPagingBuffer viene chiamata con il membro Operation di DXGKARG_BUILDPAGINGBUFFER impostato su DXGK_OPERATION_UNMAP_APERTURE_SEGMENT per informare il driver di annullare il mapping dell'allocazione dal segmento dell'apertura.

  • La funzione DxgkDdiReleaseSwizzlingRange del driver viene chiamata per rilasciare un'apertura per il de-swizzling e i segmenti degli intervalli di apertura.

Il driver non deve accedere alla GPU durante le chiamate precedenti, a meno che non sia assolutamente necessario.

Al termine del periodo di pulizia, il sistema operativo chiama la funzione dxgkDdiRestartFromTimeout per informare il driver che la pulizia è completa e che il sistema operativo riprenderà a usare l'adattatore per il rendering.