Вызов DuplicateOutput с D3D12Device сбой с E_NOINTERFACE

Я пытался создать приложение, использующее 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;
}

В моем окне отладки я замечаю, что при вызове я получаю два _com_errors output1->DuplicateOutput,

Обновить:

Я сузил проблему до того факта, что я использую 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

Решение

DXGI DuplicateOutput пока не поддерживает устройства DirectX 12 Поскольку у вас нет опыта использования DirectX, вы все равно должны использовать DirectX 11. DirectX 12 — это API, разработанный для графических экспертов, которые, как предполагается, уже хорошо знакомы с DirectX 11.

Обратите внимание, что D3D11On12CreateDevice устройства должны работать с DXGI DuplicateOutput, но я сам не пробовал.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector