Sincronizzazione dei thread e TDR

Nella figura seguente viene illustrato il funzionamento della sincronizzazione dei thread per il driver miniport di visualizzazione nel modello di driver di visualizzazione windows (WDDM).

Diagramma che mostra la sincronizzazione dei thread in WDDM.

Se si verifica un timeout hardware, viene avviato il processo TDR (Timeout Detection and Recovery). L'utilità di pianificazione GPU chiama la funzione DxgkDdiResetFromTimeout del driver, che reimposta la GPU. DxgkDdiResetFromTimeout viene chiamato in modo sincrono con qualsiasi altra funzione del driver miniport di visualizzazione, ad eccezione delle funzioni di risparmio energia di runtime DxgkDdiSetPowerComponentFState e DxgkDdiPowerRuntimeControlRequest. Ovvero, nessun altro thread viene eseguito nel driver mentre viene eseguito il thread DxgkDdiResetFromTimeout . Il sistema operativo garantisce inoltre che nessun accesso al buffer dei frame possa verificarsi da qualsiasi applicazione durante la chiamata a DxgkDdiResetFromTimeout; pertanto, il driver può reimpostare un ciclo PLL (Memory Controller Phase Locked Loop) e così via.

Mentre il thread di ripristino esegue DxgkDdiResetFromTimeout, è possibile chiamare le chiamate di routine interrotte e posticipate. La funzione KeSynchronizeExecution può essere usata per sincronizzare parti della procedura di reimpostazione con interrupt del dispositivo.

Dopo il ritorno del driver da DxgkDdiResetFromTimeout, la maggior parte delle funzioni driver può essere chiamata nuovamente e il sistema operativo inizia a pulire 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 impaginata in un segmento di memoria, la funzione DxgkDdiBuildPagingBuffer del driver viene chiamata con il membro Operation della struttura DXGKARG_BUILDPAGINGBUFFER impostata su DXGK_OPERATION_TRANSFER e con il membro Transfer.Size impostato su zero per informare il driver sull'eliminazione. Si noti che non è coinvolto alcun trasferimento di contenuto perché il contenuto è stato perso durante la reimpostazione.

    Se l'allocazione è stata impaginata in un segmento di apertura, la funzione DxgkDdiBuildPagingBuffer del driver 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 dall'apertura.

  • La funzione DxgkDdiReleaseSwizzlingRange del driver viene chiamata per rilasciare un intervallo di aperture di segmento e aperture di segmento senza problemi.

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

Dopo il periodo di pulizia, il sistema operativo chiama la funzione DxgkDdiRestartFromTimeout del driver per informare il driver che la pulizia è stata completata e che il sistema operativo riprenderà a usare l'adattatore per il rendering.