WDDM 对超时检测和恢复的支持

本文介绍 Windows 显示驱动程序模型(WDDM)如何支持超时检测和恢复(TDR)。 它概述了 TDR 过程,介绍了超时检测在 WDDM 中的工作原理,并描述了从超时恢复所要执行的步骤。

本文的受众是显示/图形驱动程序开发人员。

有关 WDDM 中的 TDR 的详细信息,请参阅以下文章:

概述

TDR 是 Windows 中的一项功能,可检测图形卡何时花费的时间超过预期完成作的时间。 然后,它会重置图形卡,以防止整个系统变得无响应。

当计算机实际处理终端用户命令或操作时,最常见的图形稳定性问题之一是系统会出现“卡死”或完全“冻结”。 许多用户等待几秒钟,然后决定重启计算机。 计算机频繁出现卡顿情况,是因为 GPU 正忙于处理密集的图形操作,通常发生在游戏期间,因此不会更新显示屏幕。 TDR 使得操作系统能够检测到 UI 无响应。

下图显示了 TDR 过程。

显示 GPU 通过 WDDM 进行超时检测和恢复(TDR)过程的关系图。

OS 会尝试检测计算机似乎处于“冻结”状态的情况。 然后,OS 会尝试从冻结的情况下动态恢复,以便桌面再次响应,从而缓解最终用户无需重新启动其系统的情况。

默认情况下,当操作系统在 1 分钟内检测到 5 次或更多 GPU 挂起(0x117)及其后续恢复时,会在第六次(或更多)GPU 挂起时执行计算机错误检查。 有关详细信息,请参阅 TdrLimitCountTdrLimitTime

请注意,引擎超时(0x141)不会导致 GPU 挂起计数,但如果引擎超时失败,OS 可能会将引擎超时提升为 GPU 挂起。 对于引擎超时(0x141),最大数目小于适配器超时(0x117)。 引擎重置进程会阻止导致此类超时的进程进行 GPU 访问,系统日志 0x142 指示这一事实。 这样,故障过程就不会对系统进行 bug 检查。

WDDM 中的超时检测

GPU 计划程序是 DirectX 图形内核子系统(Dxgkrnl.sys)的一部分,它检测到 GPU 花费的时间超过执行特定任务所允许的时间。 然后,GPU 调度程序尝试抢占此特定任务。 抢占操作具有一个“等待”超时,即实际的 TDR 超时。 Windows Vista 和更高版本中的默认超时期限为 2 秒。 如果 GPU 无法在 TDR 超时期限内完成或抢占当前任务,则 OS 会诊断 GPU 已冻结。

为防止超时检测发生,硬件供应商应确保在最终用户场景中图形操作(即 DMA 缓冲区完成)不超过 2 秒,例如工作效率和游戏活动。

准备恢复

GPU 计划程序调用显示微型端口驱动程序的 DxgkDdiResetFromTimeout 函数,以通知驱动程序 OS 检测到超时。 然后,驱动程序必须重新初始化自身并重置 GPU。 此外,驱动程序必须停止访问内存,并且不应访问硬件。 OS 和驱动程序收集硬件和其他状态信息,这些信息可用于恢复后诊断。

有关详细信息,请参阅 Windows 8 及更高版本中的 TDR

桌面恢复

OS 会重置图形堆栈的相应状态。 视频内存管理器也是 Dxgkrnl.sys的一 部分,从视频内存中清除所有分配。 显示微型端口驱动程序会重置 GPU 硬件状态。 图形堆栈执行最终作并将桌面还原到响应状态。

从卡顿检测到恢复的过程中,唯一可见的现象是屏幕闪烁。 当 OS 重置图形堆栈的某些部分时,此闪烁结果会导致屏幕重绘。 显示微型端口驱动程序可以在符合 WDDM 1.2 及更高版本时消除此重绘(请参阅 在 WDDM 1.2 及更高版本中提供无缝状态转换)。

当 OS 成功恢复桌面时,它将完成以下作:

  • 向最终用户显示信息性消息,指出“显示驱动程序已停止响应并已恢复”。
  • 在事件查看器应用程序中记录上述消息,并收集调试报告形式的诊断信息。 如果最终用户选择提供反馈,操作系统会通过联机崩溃分析(OCA)机制将此调试报告返回给 Microsoft。

某些旧版 DirectX 应用程序可能只是在此恢复结束时呈现黑色,这要求最终用户重启这些应用程序。 编写良好并处理设备移除技术的 DirectX 9Ex 和 DirectX 10 及更高版本的应用程序能够持续正常运行。 应用程序必须释放并重新创建其Microsoft Direct3D 设备和所有设备的对象。

线程同步和 TDR

有关详细信息,请参阅 线程同步和 TDR

测试和调试 TDR

有关详细信息,请参阅 测试和调试 TDR