TDR 可调试性改进

为了帮助 TDR(超时检测和恢复)分析,OS 传统上会调用内核模式驱动程序的 DxgkddiCollectDbgInfo 回调,以允许驱动程序将自己的有效负载写入系统从客户计算机上传的 TDR 报告中。

从 Windows 11 版本 24H2 (WDDM 3.2) 开始,将提供本文中所述的 TDR 调试改进。 图形驱动程序开发人员应熟悉 Windows 中的 GPU 超时检测和恢复,如超时检测和恢复Windows 8 及更高版本中的 TDR 中所述。

DDI 更改

DxgkddiCollectDbgInfo2

DxgkddiCollectDbgInfo2 已作为 TDR 调试扩展添加。 此回调允许 OS 将有关 TDR 根本原因的更详细信息传递给 KMD。 内核模式驱动程序 (KMD) 反过来可以保存与负责 TDR 的 GPU 部分相关的状态。

DxgkddiCollectDbgInfo2 是现有 DxgkddiCollectDbgInfo 的超集。

  • 实施 DxgkddiCollectDbgInfo2 不需要 WDDM 3.2 驱动程序,在这种情况下 OS 会调用 DxgkddiCollectDbgInfo

  • 如果 KMD 确实实施了 DxgkddiCollectDbgInfo2,则 OS 在所有情况下都会调用它,而不是 DxgkddiCollectDbgInfo

DRIVER_INITIALIZATION_DATA 结构被扩展,以包含指向 DxgkddiCollectDbgInfo2 的指针。

DXGKARG_COLLECTDBGINFO2

OS 会将添加的 DXGKARG_COLLECTDBGINFO2 结构添加到 DxgkddiCollectDbgInfo2

DXGKARG_COLLECTDBGINFO2 的布局与现有 DXGKARG_COLLECTDBGINFO 结构向后兼容,以允许 DxgkDdiCollectDbgInfo2 实施根据需要重复使用现有 DxgkDdiCollectDbgInfo 帮助程序。 因此,ReasonpBufferBufferSizepExtension 字段具有相同的语义。

以下其他字段位于 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 将指向的可能有效负载。