我是一个DirectX 12桌面x64应用程序的相当一种方式,它建立在几个DirectX工具包示例的基础上,但现在还支持定向和全向阴影、动态反射、硬件实例粒子效果系统、FBX模型骨骼动画和字段后处理深度的自定义着色器。
万圣节前夕,Windows将我的系统(Intel Core i78th Gen/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驱动程序,并将项目指向最新的Windows11SDK版本(10.0.22000.0),但问题依然存在。
经过一些谷歌搜索后,有证据表明,在Windows 11上存在一个关于DXGI/WDM异常行为的已知问题,在模拟全屏(即无边界窗口)模式下运行游戏的用户报告了这个问题。在崩溃后,我也遇到了错误的Alt+Tab窗口切换行为,但这似乎已经被图形驱动程序更新修复了。
是否有其他开发人员在Windows11上的DirectX 12中遇到稳定性和/或性能问题?或者,我应该坐等未来的Windows更新来稳定新操作系统吗?
发布于 2021-11-04 01:46:47
这是DXGI调试层与DX12调试层w/ Windows 11交互中的一个bug。有一个简单的解决方法,就是抑制D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE。该错误本身将在未来的Windows更新中修复。
在处理“混合图形”系统(即带有Intel集成和离散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);解决方法包含在我的2021年10月游戏模板VSIX的Direct3D发行版中。请参阅此承诺
在混合图形系统处理“丢失设备”时,
D3D12_MESSAGE_ID_EXECUTECOMMANDLISTS_WRONGSWAPCHAINBUFFERREFERENCE错误可能触发。此问题是在Windows10 (18363)中介绍的。现在应该修复它,所以理论上您可以删除Windows 11的那种抑制。在此承诺中添加了抑制。在Windows 10 (17134)中引入了"IDXGISwapChain::GetContainingOutput“DXGI警告。在此承诺中增加了抑制。
https://stackoverflow.com/questions/69805245
复制相似问题