使用 D3D12Device 调用 DuplicateOutput 失败 E_NOINTERFACE

Calling DuplicateOutput With D3D12Device Fails With E_NOINTERFACE

我一直在尝试制作一个利用桌面复制的应用程序 api,但我没有使用 directx 的经验,结果证明这是一个相当大的挑战。一切似乎都正常,直到我调用 output1->DuplicateOutput(),此时它 returns E_NOINTERFACE。 msdn 文档中未定义此错误,因此我无法诊断问题。我认为这段代码应该可以工作,但我一定遗漏了一些东西。

#include <windows.h>
#include <d3d12.h>
#include <dxgi1_5.h>

int main()
{
    HRESULT hr;
    ID3D12Debug *debug;
    hr = D3D12GetDebugInterface(IID_PPV_ARGS(&debug));
    debug->EnableDebugLayer();
    IDXGIFactory1 *factory;
    hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
    IDXGIAdapter1 *adapter;
    hr = factory->EnumAdapters1(0, &adapter);
    factory->Release();
    IDXGIOutput *junkput;
    hr = adapter->EnumOutputs(0, &junkput);
    IDXGIOutput1 *output1;
    hr = junkput->QueryInterface(IID_PPV_ARGS(&output1));
    junkput->Release();
    ID3D12Device *device;
    hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));
    IDXGIOutputDuplication *dupl;
    hr = output1->DuplicateOutput(device, &dupl);
    return 0;
}

在我的调试 window 中,我注意到当我调用 output1->DuplicateOutput.

时我得到了两个 _com_errors

更新:

我将问题缩小到我使用的是 ID3D12Device 而不是 ID3D11Device。正如这段代码有效的事实所证明的那样:

ID3D11Device *device;
D3D_FEATURE_LEVEL reallevel;
ID3D11DeviceContext *context;
hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, NULL, featurelevels, ARRAYSIZE(featurelevels), D3D11_SDK_VERSION, &device, &reallevel, &context);
IDXGIOutputDuplication *dupl;
hr = output1->DuplicateOutput(device, &dupl);

我不明白为什么这是个问题。桌面复制 api 不兼容 directx 12 吗?

DXGI DuplicateOutput 尚不支持 DirectX 12 设备。由于您没有使用 DirectX 的经验,无论如何您都应该使用 DirectX 11。 DirectX 12 API 专为假定已经非常熟悉 DirectX 11 的图形专家设计。

Note that D3D11On12CreateDevice devices should work with DXGI DuplicateOutput, but I've not tried it myself.