TDR デバッグ機能の向上
TDR (タイムアウト検出および回復) 分析を支援するため、OS はこれまでカーネル モード ドライバーの DxgkddiCollectDbgInfo コールバックを呼び出し、ドライバーがユーザーのコンピューターからアップロードされた TDR レポートに独自のペイロードを書き込み可能にしてきました。
この記事で説明されている TDR デバッグ機能の向上は、Windows 11 バージョン 24H2 (WDDM 3.2) 以降で使用できます。 グラフィックス ドライバーの開発者は、「タイムアウトの検出および回復」と「Windows 8 以降における TDR」で説明されている Windows での GPU タイムアウトの検出および回復について理解している必要があります。
DDI の変更内容
DxgkddiCollectDbgInfo2
DxgkddiCollectDbgInfo2 は、TDR デバッグ拡張機能として追加されています。 このコールバックにより、OS は TDR の根本原因に関する詳細情報を KMD に渡すことができます。 言い換えると、カーネル モード ドライバー (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 のレイアウトは、DxgkDdiCollectDbgInfo2 実装が必要に応じて既存の DxgkDdiCollectDbgInfo ヘルパーを再利用できるよう、既存の DXGKARG_COLLECTDBGINFO 構造と下位互換性があります。 このため、Reason、pBuffer、BufferSize、pExtension の各フィールドのセマンティクスは同じです。
以下の他のフィールドは DXGKARG_COLLECTDBGINFO2 にありますが、DXGKARG_COLLECTDBGINFO には含まれていません。
- TdrType
- TdrPayloadSize
- TdrPayload
一部の種類の TDR の場合、OS は TdrPayloadSize バイトの TdrPayload バッファーに追加情報を提供します。 NULL にすることができます。ドライバーはクラッシュすることなくこのケースを処理することが期待されます。
ペイロードが NULL でない場合、TDR の種類に対応する構造にキャストできます。 OS では、下位互換性のある方法によってこれらの構造が拡張され、新しいフィールドが末尾に追加される可能性があります。 ドライバーは、TdrPayload フィールドにアクセスする前に TdrPayloadSize を確認し、OS が目的のペイロード バージョン以降を実装していることを確認する必要があります。
TdrPayload がポイントするメモリは、DxgkddiCollectDbgInfo2 呼び出し時のみ有効です。 このドライバーは、DxgkddiCollectDbgInfo2 呼び出しの末尾より後に TdrPayload へのポインターを格納すべきではありません。
WDDM 3.2 以降、TdrPayload がポイントするペイロードとして、以下のペイロード構造が追加されています。
エンジン タイムアウト ペイロードの DXGK_TDR_PAYLOAD_ENGINE_TIMEOUT (TdrType は DXGK_TDR_TYPE_ENGINE_TIMEOUT と等しくなります)。
VSync タイムアウト ペイロードの DXGK_TDR_PAYLOAD_VSYNC_TIMEOUT (TdrType は DXGK_TDR_TYPE_VSYNC_TIMEOUT と等しくなります)。