window显示驱动开发—在注册表中设置 DXGI 信息
DXGI 和参考光栅器使用以下注册表项:
DWORD Software\Microsoft\DXGI\DisableFullscreenWatchdog
设置为 1 可禁用监视器线程。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\FlushOften
设置为 1 以经常刷新。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\FenceEachEntryPoint
设置为 1 以使用 GPU 对 DDI 函数围栏进行每次调用。 使用 GPU 进行隔离意味着刷新命令批处理和块,直到 GPU 处于空闲状态。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\Debug
将 设置为 1 以:
-
经常刷新,并使用 GPU 对 DDI 函数围栏进行每次调用。
-
(RefRast) 单线程运行引用光栅器。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\D3D10RefGdiDisplayMask
如果设置为 1) ,则 DWORD 掩码中的每个位都会启用 (;如果设置为 0,则禁用 () 显示监视器(由引用设备控制)。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\SingleThreaded
设置为 1 以启用运行 RefRast 单线程。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\ForceHeapAlloc
设置为 1 可使引用设备使用常规进程堆创建资源,而不是使用其他分配机制。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\AllowAsync
设置为 1 以允许引用设备的第二个线程异步运行 (也就是说,允许多个命令缓冲区) 未完成。
引用硬件通常在第二个线程中运行;但是,此第二个线程在主线程可以继续之前完成其所有工作。
DWORD Software\Microsoft\Direct3D\ReferenceDevice\SimulateInfinitelyFastHW
设置为 1 可使引用设备的模拟硬件进程仅执行几个有限的命令,使引用设备看起来非常快速 (,实质上不执行任何) 。
驱动程序可以将此密钥用作性能工具。
1. DXGI 相关注册表项
(1) DisableFullscreenWatchdog
- 路径: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DXGI\DisableFullscreenWatchdog
- 类型: DWORD
- 作用:
- 默认行为: DXGI 会启动一个监视器线程(Watchdog Thread),检测全屏应用的响应性。若应用阻塞(如死循环),DXGI 会强制恢复窗口模式。
- 设置为 1: 禁用此监视器线程,适用于需要独占全屏控制的场景(如游戏或专业图形应用)。
- 风险: 禁用后,应用崩溃可能导致显示模式无法自动恢复,需手动干预。
2. 参考光栅器(RefRast)调试与性能控制
参考光栅器是微软提供的软件实现的 D3D 设备,用于功能验证和调试。以下注册表项均位于:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Direct3D\ReferenceDevice\
(1) FlushOften
- 类型: DWORD
- 作用:
- 设置为 1: 强制 RefRast 频繁刷新命令队列(类似手动调用 ID3D11DeviceContext::Flush)。
- 用途: 检测命令提交间的资源依赖问题,但会显著降低性能。
(2) FenceEachEntryPoint
- 类型: DWORD
- 作用:
- 设置为 1: 对每个 DDI 函数调用插入 GPU 围栏(Fence),强制等待 GPU 空闲后再继续。
- 用途: 精确调试 GPU 命令顺序问题,但会引入极高延迟。
(3) Debug
- 类型: DWORD
- 作用:
- 设置为 1: 组合以下行为:
- 启用 FlushOften 和 FenceEachEntryPoint。
- 强制 RefRast 单线程运行(禁用并行命令处理)。
- 用途: 简化调试复现问题,牺牲性能换取确定性。
(4) D3D10RefGdiDisplayMask
- 类型: DWORD
- 作用:
- 按位掩码控制 RefRast 输出的显示监视器(如 0x1 表示仅主显示器)。
- 用途: 多显示器环境下隔离测试目标。
(5) SingleThreaded
- 类型: DWORD
- 作用:
- 设置为 1: 强制 RefRast 单线程运行,禁用异步命令处理。
- 用途: 排查多线程同步问题。
(6) ForceHeapAlloc
- 类型: DWORD
- 作用:
- 设置为 1: 使用进程堆(HeapAlloc)而非专用内存池分配资源。
- 用途: 检测内存管理问题(如泄漏或越界访问)。
(7) AllowAsync
- 类型: DWORD
- 作用:
- 设置为 1: 允许 RefRast 的异步线程处理命令缓冲区(模拟真实硬件行为)。
- 默认行为: 异步线程需完成所有工作后主线程才继续。
- 用途: 测试多线程命令提交的稳定性。
(8) SimulateInfinitelyFastHW
- 类型: DWORD
- 作用:
- 设置为 1: RefRast 跳过实际渲染操作,仅模拟命令提交流程。
- 用途:
- 性能工具: 测量 CPU 端驱动开销(如 API 调用延迟)。
快速验证应用逻辑,忽略 GPU 执行时间。
- 3. 典型应用场景
(1) 驱动开发调试
- 问题复现: 启用 Debug=1 + SingleThreaded=1 简化多线程问题定位。
- GPU 同步验证: 使用 FenceEachEntryPoint=1 检查命令提交顺序错误。
(2) 应用兼容性测试
- 内存问题检测: 设置 ForceHeapAlloc=1 结合工具(如 DrMemory)捕捉泄漏。
- 多显示器隔离: 通过 D3D10RefGdiDisplayMask 限制输出到特定显示器。
(3) 性能分析
- CPU 开销测量: 启用 SimulateInfinitelyFastHW=1 剥离 GPU 时间,专注驱动逻辑耗时。
- 异步行为验证: 对比 AllowAsync=0 和 AllowAsync=1 的性能差异。