次の方法で共有


TDR デバッグ機能の向上

この記事では、Windows 11 バージョン 24H2 (WDDM 3.2) 以降で利用可能な TDR (タイムアウト検出と回復) デバッグの機能強化について説明します。 グラフィックス ドライバーの開発者は、Windows 8 以降のタイムアウトの検出と回復と TDR の説明に従って、Windows での GPU タイムアウトの検出と回復について理解している必要があります。

DDI の変更

DxgkddiCollectDbgInfo2

OS は TDR 分析を支援するために、従来、カーネル モード ドライバー (KMD) の DxgkddiCollectDbgInfo コールバックを呼び出し、ドライバーが顧客のコンピューターからシステムによってアップロードされる TDR レポートに独自のペイロードを書き込むことを可能にしていました。

DxgkddiCollectDbgInfo2 は、TDR デバッグ拡張機能として追加されます。 このコールバックにより、OS は TDR の根本原因に関する詳細情報を KMD に渡すことができます。 その後、KMD は、TDR を担当する GPU の部分に関連する状態を保存できます。

DxgkddiCollectDbgInfo2 は、既存の DxgkddiCollectDbgInfo のスーパーセットです。

  • WDDM 3.2 ドライバーは DxgkddiCollectDbgInfo2 を実装する必要はありません。この場合、OS は DxgkddiCollectDbgInfo を呼び出します。

  • KMD で DxgkddiCollectDbgInfo2 が実装されている場合、OS はすべてのケースで DxgkddiCollectDbgInfo の代わりに DxgkddiCollectDbgInfo を 呼び出します。

DRIVER_INITIALIZATION_DATA構造体は、DxgkddiCollectDbgInfo2 へのポインターを含むように拡張されます。

DXGKARG_COLLECTDBGINFO2

OS は、追加された DXGKARG_COLLECTDBGINFO2 構造体を DxgkddiCollectDbgInfo2 に渡します。

DXGKARG_COLLECTDBGINFO2のレイアウトは、DxgkDdiCollectDbgInfo2 実装が必要に応じて既存の DxgkDdiCollectDbgInfo ヘルパーを再利用できるように、既存のDXGKARG_COLLECTDBGINFO構造体と下位互換性があります。 このため、 ReasonpBufferBufferSizeおよび pExtension の各フィールドのセマンティクスは同じです。

次の他のフィールドは DXGKARG_COLLECTDBGINFO2にありますが、 DXGKARG_COLLECTDBGINFOには含まれません。

一部の 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 に等しくなります)。