TDR 偵錯性改善
為了協助 TDR(逾時偵測和復原)分析,OS 歷來稱為內核模式驅動程式的 DxgkddiCollectDbgInfo 回呼,讓驅動程式能夠將自己的承載寫入客戶電腦上傳的 TDR 報告。
從 Windows 11 版本 24H2 (WDDM 3.2) 開始,本文所述的 TDR 偵錯改進功能就可供使用。 圖形驅動程式開發人員應該熟悉 Windows 中的 GPU 逾時偵測和復原,如 Windows 8 和更新版本中的逾時偵測和復原和 TDR 中所述。
DDI 變更
DxgkddiCollectDbgInfo2
DxgkddiCollectDbgInfo2 會新增為 TDR 偵錯延伸模組。 此回呼可讓OS將更詳細的信息傳遞至 KMD,以瞭解TDR的根本原因。 接著,核心模式驅動程式 (KMD) 可以儲存與負責 TDR 之 GPU 部分相關的狀態。
DxgkddiCollectDbgInfo2 是現有 DxgkddiCollectDbgInfo 的超集。
不需要 WDDM 3.2 驅動程式來實作 DxgkddiCollectDbgInfo2,在此情況下,OS 會呼叫 DxgkddiCollectDbgInfo。
如果 KMD 確實實 作 DxgkddiCollectDbgInfo2,則 OS 在所有情況下都會叫用它,而不是 DxgkddiCollectDbgInfo 。
DRIVER_INITIALIZATION_DATA 結構會擴充為包含 DxgkddiCollectDbgInfo2 的指標。
DXGKARG_COLLECTDBGINFO2
OS 會將新增DXGKARG_COLLECTDBGINFO2結構傳遞至 DxgkddiCollectDbgInfo2。
DXGKARG_COLLECTDBGINFO2的配置與現有的DXGKARG_COLLECTDBGINFO結構回溯相容,以允許 DxgkDdiCollectDbgInfo2 實作視需要重複使用現有的 DxgkDdiCollectDbgInfo 協助程式。 因此, Reason、 pBuffer、 BufferSize 和 pExtension 欄位具有相同的語意。
下列其他欄位位於 DXGKARG_COLLECTDBGINFO2 中,但在 DXGKARG_COLLECTDBGINFO 中則沒有。
- TdrType
- TdrPayloadSize
- TdrPayload
對於某些 TDR 類型,OS 會在 TdrPayloadSize 位元組的 TdrPayload 緩衝區中提供其他資訊。 它可以是 NULL,而且驅動程式應該會在不當機的情況下處理此案例。
當承載不是 NULL 時,它可以轉換成對應至 TDR 類型的結構。 OS 可能會以回溯相容的方式來成長這些結構,並在結尾新增新的字段。 驅動程式必須先檢查 TdrPayloadSize ,才能存取 TdrPayload 欄位,以確保 OS 實作所需的承載版本或更新版本。
TdrPayload 指向的記憶體只有在 DxgkddiCollectDbgInfo2 呼叫期間才有效。 驅動程式不應該將 TdrPayload 的指標儲存在 DxgkddiCollectDbgInfo2 呼叫的結尾。
從 WDDM 3.2 開始,會新增下列承載結構,讓 TdrPayload 指向 。
引擎逾時承載的DXGK_TDR_PAYLOAD_ENGINE_TIMEOUT (TdrType 等於 DXGK_TDR_TYPE_ENGINE_TIMEOUT)。
DXGK_TDR_PAYLOAD_VSYNC_TIMEOUT VSync 逾時承載 (TdrType 等於 DXGK_TDR_TYPE_VSYNC_TIMEOUT)。