使用E_NOINTERFACE调用D3D12Device的DuplicateOutput失败

时间:2016-10-20 22:54:17

标签: c++ c windows directx directx-12

我一直在努力创建一个利用桌面复制API的应用程序,但是没有使用directx的经验,结果证明这是一个非常大的挑战。一切似乎都有效,直到我调用output1->DuplicateOutput(),此时它返回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;
}

在我的调试窗口中,我注意到在调用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不兼容吗?

1 个答案:

答案 0 :(得分:2)

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

  

请注意,D3D11On12CreateDevice设备应与DXGI DuplicateOutput一起使用,但我自己没有尝试过。