2

我非常喜欢基于几个 DirectX 工具包示例构建的 DirectX 12 桌面 x64 应用程序,但现在还支持用于定向和全向阴影、动态反射、硬件实例化粒子效果系统、FBX 模型骨骼动画的自定义着色器和景深后处理。

在万圣节,Windows Update 将我的系统(英特尔酷睿 i7[第 8 代]/GeForce GTX1050)升级到了 Windows 11。当我运行我的项目时,我收到了以下“源不可用”窗口形式的令人毛骨悚然的惊喜:

在此处输入图像描述

停止调试后,应用程序在Present()调用DeviceResources.cpp时崩溃并生成以下错误:

D3D12 ERROR: ID3D12CommandQueue::Present: Resource state (0x800: D3D12_RESOURCE_STATE_COPY_SOURCE) (promoted from COMMON state) of resource (0x0000011BD5330080:'Render target 0') (subresource: 0) must be in COMMON state when transitioning to use in a different Command List type, because resource state on previous Command List type : D3D12_COMMAND_LIST_TYPE_COPY, is actually incompatible and different from that on the next Command List type : D3D12_COMMAND_LIST_TYPE_DIRECT. [ RESOURCE_MANIPULATION ERROR #990: RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE]
D3D12: **BREAK** enabled for the previous message, which was: [ ERROR RESOURCE_MANIPULATION #990: RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE ]
Exception thrown at 0x00007FFA0F6A466C (KernelBase.dll) in DXTK12 Game.exe: 0x0000087A (parameters: 0x0000000000000001, 0x00000014297FC640, 0x00000014297FE420).
Unhandled exception at 0x00007FFA0F6A466C (KernelBase.dll) in DXTK12 Game.exe: 0x0000087A (parameters: 0x0000000000000001, 0x00000014297FC640, 0x00000014297FE420).

这在 Windows 10 中从未发生过,而且这种崩溃是不稳定的。我的游戏配置为以无边框全屏模式启动,有时会在崩溃前运行几秒钟。如果我有时间 Alt+Enter 进入窗口模式,应用程序仍然会崩溃。

我已更新我的 Nvidia 驱动程序并将项目指向最新的 Windows 11 SDK 版本 (10.0.22000.0),但问题仍然存在。

经过一番谷歌搜索后,有证据表明存在一个已知问题,涉​​及 Windows 11 上不稳定的 DXGI/WDM 行为,用户在模拟全屏(即无边框窗口)模式下运行游戏时报告了该问题。崩溃后我也遇到了错误的 Alt+Tab 窗口切换行为,但这似乎已通过图形驱动程序更新修复。

是否有其他开发人员在 Windows 11 上遇到过 DirectX 12 的稳定性和/或性能问题?还是我应该坐下来等待未来的 Windows 更新以稳定新操作系统?

4

1 回答 1

4

这是 DXGI 调试层与 Windows 11 的 DX12 调试层交互中的一个错误。有一个简单的解决方法是抑制D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE. 该错误本身将在未来的 Windows 更新中得到修复。

调试层在处理“混合图形”系统(即具有英特尔集成和独立 GPU 的笔记本电脑)时总是有一些怪癖,所以我在与它相关的 DeviceResources 实现中有一些抑制:

DXGI_INFO_QUEUE_MESSAGE_ID hide[] =
{
    80 /* IDXGISwapChain::GetContainingOutput: The swapchain's adapter does not control the output on which the swapchain's window resides. */,
};
DXGI_INFO_QUEUE_FILTER filter = {};
filter.DenyList.NumIDs = static_cast<UINT>(std::size(hide));
filter.DenyList.pIDList = hide;
dxgiInfoQueue->AddStorageFilterEntries(DXGI_DEBUG_DXGI, &filter);
D3D12_MESSAGE_ID hide[] =
{
    D3D12_MESSAGE_ID_MAP_INVALID_NULLRANGE,
    D3D12_MESSAGE_ID_UNMAP_INVALID_NULLRANGE,
    // Workarounds for debug layer issues on hybrid-graphics systems
    D3D12_MESSAGE_ID_EXECUTECOMMANDLISTS_WRONGSWAPCHAINBUFFERREFERENCE,
    D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE,
};
D3D12_INFO_QUEUE_FILTER filter = {};
filter.DenyList.NumIDs = static_cast<UINT>(std::size(hide));
filter.DenyList.pIDList = hide;
d3dInfoQueue->AddStorageFilterEntries(&filter);

解决方法包含在我的 Direct3D 游戏模板 VSIX的2021 年 10 月版本中。看到这个提交

D3D12_MESSAGE_ID_EXECUTECOMMANDLISTS_WRONGSWAPCHAINBUFFERREFERENCE错误可能在混合图形系统上的“丢失设备”处理期间触发。此问题是在 Windows 10 (18363) 中引入的。它现在应该已修复,因此理论上您可以删除 Windows 11 的抑制。在此提交中添加了抑制。

Windows 10 (17134) 中引入了“IDXGISwapChain::GetContainingOutput”DXGI 警告。在此提交中添加了抑制。

于 2021-11-04T01:46:47.313 回答