DirectX 12 и C ++ CLI: невозможно использовать IID_PPV_ARGS - PullRequest
0 голосов
/ 06 сентября 2018

Для заданной функции следующим образом:

HRESULT D3D12CreateDevice ( IUnknown * pAdapter, D3D_FEATURE_LEVEL MinimumFeatureLevel, Рефид рид, void ** ppDevice );

Собственный C ++ способ его использования:

ID3D12Device* d3d12Device; 
D3D12CreateDevice(adapter, featureLevel, IID_PPV_ARGS(&d3d12Device));

Проблема в том, что я не могу использовать IID_PPV_ARGS в проекте / CLI, потому что в управляемом коде есть какой-то недоступный макрос.

Поэтому я стараюсь делать то же, что и раньше, используя DirectX 11 и C ++ CLI, следующим образом:

ID3D12Device* d3d12Device; 
D3D12CreateDevice(adapter, featureLevel, __uuidof(ID3D12Device), (void**)&d3d12Device);

Это не приводит к ошибке компилятора, но создание объекта DX всегда завершается неудачей. Раньше он работал с DX 11, но больше не работал с DX12.

Кто-то может сказать мне, как я должен инициализировать объект DX12 в C ++ CLI, пожалуйста?

Большое спасибо.

РЕДАКТИРОВАТЬ 1

D3D12CreateDevice работает со следующим синтаксисом (я что-то делал не так):

ID3D12Device* d3d12Device; 
D3D12CreateDevice(adapter, featureLevel, __uuidof(ID3D12Device), (void**)&d3d12Device);

Но я не могу получить правильный синтаксис для CreateCommandQueue.

HRESULT CreateCommandQueue (const D3D12_COMMAND_QUEUE_DESC * pDesc,
REFIID riid, void ** ppCommandQueue);

Этот синтаксис дает ошибку приведения:

_d3d12Device->CreateCommandQueue(&queueDesc, IID_ID3D12CommandQueue, (void**)&_commandQueue)

C2440 'cast de type': невозможно преобразовать 'cli :: interior_ptr' в 'void **'

1 Ответ

0 голосов
/ 07 сентября 2018

Хорошо, я нашел, как это сделать, я опубликую здесь пример, если это могло бы помочь кому-то еще.

Во-первых, не будьте такими идиотами, как я, и не забудьте pin_ptr указатель вашего нативного объектав противном случае GC позаботится о них, и отладка становится все труднее:)

Традиционное создание ресурсов в DX 12:

pin_ptr<ID3D12CommandQueue*> pCmdQueue = &_commandQueue;
_d3d12Device->CreateCommandQueue(&queueDesc, __uuidof(**(&_commandQueue)), (void**)pCmdQueue);

QueryInterface в DX 12:

pin_ptr<ID3D12DebugDevice1*> pDeviceDebug = &_d3d12DeviceDebug;
_d3d12Device->QueryInterface<ID3D12DebugDevice1>(pDeviceDebug);
...