1

我在尝试在 HDR 屏幕上复制输出时遇到了一个奇怪的错误,尤其是在启动 Doom Eternal 时会触发此错误。

我通过重置 OutputDuplication 对象来处理 DXGI_ERROR_ACCESS_LOST 错误,如下所示:

_session.Reset();
winrt::check_hresult(_item->DuplicateOutput1(_device.get(), // dxgi device
    0, // reserved, must be zero
    std::size(duplicationFormats),  // number of supported formats
    duplicationFormats,             // pointer to array of supported formats
    _session.GetAddressOf()));

_session 是在类级别定义的,它是一个 WRL::ComPtr,duplicationFormats 是一个具有 DXGI_FORMAT_R16G16B16A16_FLOAT 和 DXGI_FORMAT_B8G8R8A8_UNORM 的数组(根据文档, 应该始终存在)。

通过此设置,我可以在显示设置上随意切换 HDR 模式,并且始终捕获桌面。然而,当我打开游戏时出现 E_INVALIDARG 错误,我激活了 DirectX 调试层,并且在发生这种情况时会打印此消息(由上面的 check_hresult 触发):

D3D11 错误:ID3D11Device::CreateTexture2D:格式无效。不支持 Format(0, UNKNOWN) 作为 D3D11_RESOURCE_MISC_SHARED_NTHANDLE 格式。[STATE_CREATION 错误 #92:CREATETEXTURE2D_UNSUPPORTEDFORMAT]
D3D11 错误:ID3D11Device::CreateTexture2D:返回 E_INVALIDARG,表示传递了无效参数。[状态创建错误#104:CREATETEXTURE2D_INVALIDARG_RETURN]

我认为它拒绝支持的格式,即使我对 HDR 内容使用 >10bpp 格式,令我惊讶的是提到 (0, UNKNOWN) 格式,到目前为止,纹理是由 DXGI 实现在内部创建的正如 MS PDB 所说。

4

0 回答 0