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->GetDesc
查看实际使用的是什么适配器。
我只有一个适配器,adapter->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) 而失败的主要内容,如果未能解决你的问题,请参考以下文章