DirectX 12 和 C++ CLI :无法使用IID_PPV_ARGS

DirectX 12 and C++ CLI : Cannot use IID_PPV_ARGS

本文关键字:IID PPV ARGS C++ CLI DirectX      更新时间:2023-10-16

对于给定的函数如下:

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);