線程同步處理和 TDR
下圖顯示在WDDM中,核心模式顯示微型港驅動程式(KMD)的執行緒同步運作方式。
如果發生硬體超時,系統會啟動 超時偵測和復原(TDR) 程序。 GPU 排程器會呼叫驅動程式的 DxgkDdiResetFromTimeout 函式,以重設 GPU:
- DxgkDdiResetFromTimeout 會與任何其他 KMD 函式同步呼叫,除了執行時的電源管理功能 DxgkDdiSetPowerComponentFState 和 DxgkDdiPowerRuntimeControlRequest。 也就是說,OS 保證在 DxgkDdiResetFromTimeout 線程執行時,驅動程式中不會執行任何其他線程。
- OS 也保證應用程式無法在呼叫 DxgkDdiResetFromTimeout期間存取框架緩衝區。 因此,驅動程式可以重設記憶體控制器階段鎖定迴圈 (PLL) 等。
當復原執行緒執行 DxgkDdiResetFromTimeout時,可以繼續呼叫中斷和延期程序呼叫。 KeSynchronizeExecution 函式可用來同步重設過程的部分與裝置中斷。
在驅動程式從 DxgkDdiResetFromTimeout返回後,可以再次呼叫大部分驅動程式函式,而作業系統會開始清除不再需要的資源。 在清除期間,會基於指示的原因呼叫下列驅動程式函式:
呼叫驅動程式以通知正在收回的配置。
例如,如果配置分頁於記憶體區段中,則會呼叫驅動程式的 DxgkDdiBuildPagingBuffer 函式,並將 DXGKARG_BUILDPAGINGBUFFER 結構的 Operation 成員設定為 DXGK_OPERATION_TRANSFER,並將 Transfer.Size 成員設定為零,以通知驅動程式收回。 因為內容在重設期間遺失,因此不會涉及任何內容傳輸。
如果配置是分頁在光圈區段,則會呼叫驅動程式的 DxgkDdiBuildPagingBuffer 函式,並將 DXGKARG_BUILDPAGINGBUFFER 的 Operation 成員設為 DXGK_OPERATION_UNMAP_APERTURE_SEGMENT,以通知驅動程式取消從光圈配置的映射。
驅動程式的 DxgkDdiReleaseSwizzlingRange 函式被呼叫來釋放反交錯的通道和區段孔徑範圍。
除非絕對必要,否則驅動程式不應該在上述呼叫期間存取 GPU。
清除期間結束后,OS 會呼叫驅動程式的 DxgkDdiRestartFromTimeout 函式,通知驅動程式清除已完成,而且 OS 將會繼續使用適配卡進行轉譯。