DXGI 1.5 DuplicateOutput1 因 DXGI_ERROR_UNSUPPORTED (0x887a0004) 而失败

Posted

技术标签:

【中文标题】DXGI 1.5 DuplicateOutput1 因 DXGI_ERROR_UNSUPPORTED (0x887a0004) 而失败【英文标题】:DXGI 1.5 DuplicateOutput1 fails with DXGI_ERROR_UNSUPPORTED (0x887a0004) 【发布时间】:2018-01-11 12:57:47 【问题描述】:

由于某种原因,DuplicateOutput1 失败,而 DuplicateOutput 没有。

#include <D3D11.h>
#include <DXGI1_5.h>

int main() 
    ID3D11Device *device;
    D3D_FEATURE_LEVEL levels[] =  D3D_FEATURE_LEVEL_11_1 ;
    D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, levels, ARRAYSIZE(levels), D3D11_SDK_VERSION, &device, NULL, NULL);

    IDXGIDevice *dxDevice;
    device->QueryInterface<IDXGIDevice>(&dxDevice);

    IDXGIAdapter *adapter;
    dxDevice->GetAdapter(&adapter);

    IDXGIOutput *output;
    adapter->EnumOutputs(0, &output);

    IDXGIOutput5 *output5;
    output->QueryInterface<IDXGIOutput5>(&output5);

    IDXGIOutputDuplication *outputDuplication;
    auto hr1 = output5->DuplicateOutput(device, &outputDuplication);

S_OK 在这里

    const DXGI_FORMAT formats[] =  DXGI_FORMAT_B8G8R8A8_UNORM ;
    auto hr2 = output5->DuplicateOutput1(device, 0, ARRAYSIZE(formats), formats, &outputDuplication);

0x887a0004 : 此系统不支持指定的设备接口或功能级别。

【问题讨论】:

你碰巧有两个有多个适配器,第一个枚举的可能不符合 DXGI 1.5 标准?基本上你可以adapter-&gt;GetDesc查看实际使用的是什么适配器。 我只有一个适配器,adapter-&gt;GetDesc 显示NVIDIA GeForce GTX 960 我在另一台机器上也有同样的问题Intel(R) HD Graphics 520 我记得我之前无法使用该方法。该文档多次提到“运行全屏应用程序”,并且这种优化方法可能仅适用于这种情况。对于常规应用程序,旧的 DuplicateOutput 可能会被使用。 对于那些将来可能会偶然发现的人,调用 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) 可以让 DuplicateOutput1 成功。不过,我不知道为什么 DuplicateOutput1 会检查进程 dpi 版本。 【参考方案1】:

我会在这里发布@weggo 的答案,因为我差点错过了!

对于那些将来可能会偶然发现这一点的人,请致电 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) 允许 DuplicateOutput1 成功。我不知道为什么 不过,DuplicateOutput1 会检查进程 dpi 版本。

我只想补充一点,您必须在清单设置中的解决方案属性中将 DPI 感知设置为 False,才能使 SetProcessDpiAwarenessContext 工作:)

【讨论】:

【参考方案2】:

如果您在具有集成图形芯片和独立 GPU 的系统上运行,则可能会发生这种情况。见https://support.microsoft.com/en-us/kb/3019314:

很遗憾,出现此问题是因为桌面复制 API 不支持在 Microsoft 混合系统上针对独立 GPU 运行。按照设计,在这种情况下,调用会失败并带有错误代码 DXGI_ERROR_UNSUPPORTED。

要解决此问题,请在集成 GPU 上而不是在 Microsoft 混合系统上的独立 GPU 上运行应用程序。

【讨论】:

只有一个 GPU 适配器,我有这个错误,所以不是这样。 这发生在我身上。我切换到集成显卡后它正在工作。有没有办法在错误发生之前检测到这一点?

以上是关于DXGI 1.5 DuplicateOutput1 因 DXGI_ERROR_UNSUPPORTED (0x887a0004) 而失败的主要内容,如果未能解决你的问题,请参考以下文章

DXGI EnumOutputs - 没有 DXGI_OUTPUT_DESC 和空显示模式数组

DXGI:尝试从输出(监视器)中获取正确的显示模式

Direct3D 和 DXGI 之间的区别

DXGI 文本输出轨迹

我应该如何处理 DXGI 中的多个交换链?

亲爱的 IMGUI 和 DirectX 12 覆盖 (DXGI_ERROR_INVALID_CALL)