遇DXGI_ERROR_DEVICE_HUNG崩溃,移除三类操作可消除问题
DXGI_ERROR_DEVICE_HUNG 崩溃排查方案
已知触发条件:当同时执行以下三类操作时会触发DXGI_ERROR_DEVICE_HUNG崩溃,移除任意一项即可恢复正常:
- DirectML任务
- 目标为回读缓冲区、源为DirectML任务输出下游资源的
ID3D12GraphicsCommandList::CopyResource操作 - 从映射的回读缓冲区复制数据至
vector的操作
已完成排查:同步机制无问题,已停止渲染任务帧缓冲确保回读缓冲区无并发读写;取消回读缓冲区持久化映射,改为每次读取调用Map;无调试信息及有效DRED诊断数据。
针对该问题,可从以下方向进一步排查:
1. 资源状态转换与队列同步检查
- 确认DirectML任务执行完毕后,其输出资源的状态是否正确转换为
D3D12_RESOURCE_STATE_COPY_SOURCE;CopyResource完成后,回读缓冲区状态是否切换为D3D12_RESOURCE_STATE_READBACK。DirectML可能会隐式修改资源状态,手动显式设置状态转换可能引发冲突。 - 在DirectML执行队列与
CopyResource所在队列之间添加显式的ID3D12Fence同步,部分硬件对跨队列依赖存在隐性要求,即使你认为同步逻辑无误,也可尝试验证。
2. 回读缓冲区配置验证
- 确认回读缓冲区创建参数:必须使用
D3D12_HEAP_TYPE_READBACK,绑定标志为D3D12_RESOURCE_FLAG_NONE,且格式与DirectML输出资源完全匹配。格式不兼容可能导致CopyResource触发硬件未定义行为。 - 尝试缩小回读缓冲区尺寸,或拆分数据为小批量复制,排查是否为大尺寸数据复制引发的硬件挂起。
3. DirectML输出资源生命周期隔离
- 检查DirectML输出的下游资源是否在
CopyResource完成前被其他操作(如残留的视图引用、缓存的命令列表)占用,即使已停止渲染帧缓冲,也需确认无隐式资源引用。 - 新增临时中间资源(非回读类型),先将DirectML输出复制到中间资源,再从中间资源执行
CopyResource到回读缓冲区,隔离DirectML与回读缓冲区的直接交互,验证是否可避免崩溃。
4. 驱动与DirectML版本兼容性排查
- 更新显卡驱动至最新稳定版,
DXGI_ERROR_DEVICE_HUNG常与硬件驱动的DirectML兼容性问题相关。 - 切换DirectML版本(如从预览版换为稳定版),或禁用DirectML优化选项(例如
DML_EXECUTION_FLAGS_DISABLE_META_COMMAND_CACHING),排查是否为特定版本的优化逻辑导致问题。
5. 底层调试工具启用
- 创建D3D12设备时添加
D3D12_CREATE_DEVICE_FLAG_DEBUG标志,启用DXGI_DEBUG_LAYER,仔细检查是否有遗漏的底层警告输出。 - 使用Windows Performance Recorder (WPR)捕获GPU事件,分析崩溃时的GPU指令流,定位具体硬件指令异常。
内容的提问来源于stack exchange,提问作者Tom Huntington
相关产品推荐
相关产品推荐

