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 帮助程序。 因此,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)。