本文說明 Windows 顯示驅動程式模型 (WDDM) 如何支援逾時偵測和復原 (TDR) 。 它提供 TDR 程式的概觀、說明逾時偵測在 WDDM 中的運作方式,並描述從逾時復原所採取的步驟。
本文的受眾是顯示和圖形驅動程式開發人員。
如需 WDDM 中 TDR 的詳細資訊,請參閱下列文章:
概觀
TDR 是 Windows 中的一項功能,可偵測顯示卡何時需要比預期更長的時間才能完成操作。 然後重置顯示卡以防止整個系統無回應。
圖形中最常見的穩定性問題之一發生在計算機在實際處理最終用戶命令或操作時似乎“當機”或完全“凍結”時。 許多用戶等待幾秒鐘,然後決定重新啟動電腦。 電腦畫面凍結的狀況經常發生,原因是 GPU 忙於處理密集的圖形運算,通常在玩遊戲時,因此不會更新顯示畫面。 TDR 可讓作業系統偵測 UI 沒有回應。
下圖顯示 TDR 程序。
作業系統會嘗試偵測電腦似乎「凍結」的情況。 然後,作業系統會嘗試從凍結的情況中動態復原,以便桌面再次回應,從而緩解最終使用者不必要地重新啟動系統的情況。
根據預設,當 OS 偵測到在一 (1) 分鐘內發生五 (5) 次或更多次 GPU 當機 (0x117)及後續復原時,會對電腦進行第六次 (或更多次) 錯誤檢查。 如需詳細資訊,請參閱 TdrLimitCount 和 TdrLimitTime。
順便說一句,引擎逾時 (0x141) 不會計入 GPU 當機計數,但如果引擎逾時不成功,OS 可能會將引擎逾時提升為 GPU 當機。 對於引擎逾時 (0x141) ,最大數目比配接卡逾時 (0x117) 少 1。 引擎重設程序會封鎖造成此類逾時的程序的 GPU 存取,而系統記錄 0x142 以指出該事實。 這樣,故障過程就不會對系統進行錯誤檢查。
WDDM 中的逾時偵測
GPU 排程器是 DirectX 圖形核心子系統 (Dxgkrnl.sys) 的一部分,會偵測 GPU 何時花費超過允許的時間來執行特定工作。 然後,GPU 排程器會嘗試搶佔這個特定任務。 搶佔作業有一個「等待」的逾時設定,這是實際的 TDR 逾時。 Windows 中的預設逾時期間為兩秒。 如果 GPU 無法在 TDR 時間限制內完成或搶佔目前的工作,作業系統會診斷 GPU 已凍結。
若要防止發生逾時偵測,硬體廠商應該確保在生產力和遊戲等使用情境中,圖形運算(即 DMA 緩衝區的完成)所需的時間不超過兩秒。
恢復準備
GPU 排程器會呼叫顯示迷你埠驅動程式的 DxgkDdiResetFromTimeout 函式,以通知驅動程式 OS 偵測到逾時。 然後,驅動程式必須重新初始化本身並重設 GPU。 此外,驅動程式必須停止存取記憶體,而且不應該存取硬體。 OS 和驅動程式會收集硬體和其他狀態資訊,這些資訊可用於復原後診斷。
如需詳細資訊,請參閱 Windows 8 和更新版本中的 TDR。
桌面復原
OS 會重設圖形堆疊的適當狀態。 視訊記憶體管理器也是 Dxgkrnl.sys的一部分,會清除視訊記憶體中的所有分配。 顯示迷你埠驅動程式會重設 GPU 硬體狀態。 圖形堆疊會採取最終動作,並將桌面還原至回應式狀態。
從掛起偵測到恢復過程中,螢幕閃爍是唯一可見的跡象。 當 OS 重設圖形堆疊的某些部分時,就會產生此閃爍,這會導致螢幕重新繪製。 顯示微型埠驅動程式在符合 WDDM 1.2 及更高版本時,可以消除此重繪(請參閱 在 WDDM 1.2 及更高版本中提供順暢的狀態轉換)。
當作業系統成功復原桌面時,它會完成下列動作:
- 向使用者顯示資訊訊息,指出「顯示驅動程式停止回應並已復原」。
- 在「事件檢視器」應用程式中記載上述訊息,並以除錯報告的形式收集診斷資訊。 如果終端使用者選擇加入提供意見反應,OS 會透過線上損毀分析 (OCA) 機制將此偵錯報告傳回給 Microsoft。
某些舊版 DirectX 應用程式可能只會在此復原結束時轉譯為黑色,這需要使用者重新啟動這些應用程式。 撰寫良好的 DirectX 9Ex 和 DirectX 10 及其更新版本的應用程式在處理裝置移除技術時會繼續正常運作。 應用程式必須先釋放其 Microsoft Direct3D 裝置及其所有物件,然後重新建立。
執行緒同步處理和 TDR
如需詳細資料,請參閱 執行緒同步處理和 TDR 。
測試和偵錯 TDR
如需詳細資訊,請參閱 測試和偵錯 TDR。