執行緒同步處理和 TDR

下圖顯示執行緒同步處理如何適用于 Windows 顯示驅動程式模型 (WDDM) 的顯示迷你埠驅動程式。

顯示 WDDM 中線程同步處理的圖表。

如果發生硬體逾時, 就會起始逾時偵測和復原 (TDR) 程式。 GPU 排程器會呼叫驅動程式的 DxgkDdiResetFromTimeout 函式,以重設 GPU。 除了執行時間電源管理功能DxgkDdiSetPowerComponentFStateDxgkDdiPowerRuntimeControlRequest以外,DxgkDdiResetFromTimeout會以同步方式呼叫 DxgkDdiTimeout。 也就是說, 當 DxgkDdiResetFromTimeout 執行緒執行時,驅動程式中不會執行任何其他執行緒。 作業系統也保證在呼叫 DxgkDdiResetFromTimeout期間,無法從任何應用程式存取畫面緩衝區;因此,驅動程式可以重設記憶體控制器階段鎖定迴圈, (PLL) 等等。

當復原執行緒執行 DxgkDdiResetFromTimeout時, (DPC 中斷和延後程序呼叫) 可以繼續呼叫。 KeSynchronizeExecution函式可用來同步處理重設程式的部分與裝置中斷。

驅動程式從 DxgkDdiResetFromTimeout傳回之後,可以再次呼叫大部分的驅動程式函式,而且作業系統會開始清除不再需要的資源。 在清除期間,會根據指定的原因呼叫下列驅動程式函式:

  • 系統會呼叫驅動程式,以通知正在收回的配置。

    例如,如果在記憶體區段中分頁配置,則會呼叫驅動程式的 DxgkDdiBuildPagingBuffer 函式,並將 DXGKARG_BUILDPAGINGBUFFER 結構的 Operation 成員設定為 DXGK_OPERATION_TRANSFER ,並將 Transfer.Size 成員設定為零,以通知驅動程式收回。 請注意,因為內容在重設期間遺失,所以不會涉及任何內容傳輸。

    如果配置分頁于光圈區段,則會呼叫驅動程式的 DxgkDdiBuildPagingBuffer 函 式,並將 DXGKARG_BUILDPAGINGBUFFER 的 Operation 成員設定為 DXGK_OPERATION_UNMAP_APERTURE_SEGMENT,以通知驅動程式從光圈取消對應配置。

  • 系統會呼叫驅動程式的 DxgkDdiReleaseSwizzlingRange 函式來釋放未撥開的光圈和區段光圈範圍。

除非絕對必要,否則驅動程式不應該在上述呼叫期間存取 GPU。

清除期間結束後,作業系統會呼叫驅動程式的 DxgkDdiRestartFromTimeout 函式,通知驅動程式清除已完成,而且作業系統會繼續使用配接器進行轉譯。