DirectX 12 和 C++ CLI :无法使用IID_PPV_ARGS
DirectX 12 and C++ CLI : Cannot use IID_PPV_ARGS
对于给定的函数如下:
HRESULT D3D12CreateDevice( IUnknown *pAdapter, D3D_FEATURE_LEVEL 最低功能级别, 雷菲德·里德, 无效 **pp设备 );
使用它的本机C++方法是:
ID3D12Device* d3d12Device;
D3D12CreateDevice(adapter, featureLevel, IID_PPV_ARGS(&d3d12Device));
问题是我无法在/CLI 项目中使用 IID_PPV_ARGS,因为托管代码中存在某种无法访问的宏。
所以我尝试像以前使用 DirectX 11 和 CLI 一样做C++事情,如下所示:
ID3D12Device* d3d12Device;
D3D12CreateDevice(adapter, featureLevel, __uuidof(ID3D12Device), (void**)&d3d12Device);
它不会产生任何编译器错误,但DX对象创建总是失败。它曾经适用于DX 11,但不再适用于DX12。
有人可以告诉我应该如何在 CLI 下初始化 DX12 对象C++?
多谢。
编辑 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 "铸造类型" : 无法将 'cli::interior_ptr' 转换为 'void **'
好的,我找到了方法,如果可以帮助其他人,我将在此处发布示例。
首先,不要像我一样白痴,不要忘记pin_ptr本机对象的指针,否则 GC 会处理它们,并且调试越来越困难:)
DX 12 中的传统资源创建:
pin_ptr<ID3D12CommandQueue*> pCmdQueue = &_commandQueue;
_d3d12Device->CreateCommandQueue(&queueDesc, __uuidof(**(&_commandQueue)), (void**)pCmdQueue);
DX 12 中的查询接口:
pin_ptr<ID3D12DebugDevice1*> pDeviceDebug = &_d3d12DeviceDebug;
_d3d12Device->QueryInterface<ID3D12DebugDevice1>(pDeviceDebug);