以下是关于 ID3D11On12Device 接口的一些基本信息:
1. 接口定义:
DECLARE_INTERFACE(ID3D11On12Device)
{
STDMETHOD(Create11DeviceFromID3D12)(
_In_ IUnknown *pDevice,
UINT Flags,
_In_reads_opt_ (NumQueues) D3D12_COMMAND_QUEUE_DESC1 *pQueueDescList,
UINT NumQueues,
_In_reads_opt_ (NumNodeMasks) const UINT *pNodeMaskList,
UINT NumNodeMasks,
_Out_ ID3D11Device **ppDevice,
_Out_ ID3D11DeviceContext **ppImmediateContext,
_Out_opt_ D3D11On12DDI_DEVICE_FUNCS *pChosen11On12,
_Out_opt_ D3D12_COMMAND_QUEUE_DESC1 *pChosenQueueDesc
) PURE;
STDMETHOD(GetD3D12Device)(
_Outptr_ IUnknown **ppDevice
) PURE;
STDMETHOD(UnwrapUnderlyingResource)(
_In_ ID3D12Resource *pResource,
REFIID riid,
_COM_Outptr_opt_ void **ppvResource12
) PURE;
STDMETHOD(ReturnUnderlyingResource)(
_In_ ID3D12Resource *pResource,
_Out_opt_ LONG *pRefCount
) PURE;
STDMETHOD(WaitForCompletion)(
_In_ ID3D12Fence *pFence,
_In_ HANDLE hEvent
) PURE;
STDMETHOD(GetCommandQueue)(
_Outptr_ ID3D12CommandQueue **ppQueue
) PURE;
STDMETHOD(GetResourceAllocationInfo)(
_In_ UINT visibleMask,
_In_ UINT numResourceDescs,
_In_reads_ (numResourceDescs) D3D12_RESOURCE_DESC *pResourceDescs,
_Out_writes_ (numResourceDescs) D3D11_RESOURCE_ALLOCATION_INFO1 *pResourceAllocationInfo1
) PURE;
};
2. 方法说明:
- Create11DeviceFromID3D12: 从给定的 Direct3D 12 设备创建一个 Direct3D 11 设备。这个方法允许在两个 API 之间进行资源的共享。
- GetD3D12Device: 获取底层的 Direct3D 12 设备。
- UnwrapUnderlyingResource: 将 Direct3D 12 资源解封装为指定的接口。
- ReturnUnderlyingResource: 返回 Direct3D 12 资源,并可选择返回引用计数。
- WaitForCompletion: 等待 Direct3D 12 栅栏完成。
- GetCommandQueue: 获取底层的 Direct3D 12 命令队列。
- GetResourceAllocationInfo: 获取资源的分配信息。
3. 使用示例:
// 假设已经创建了一个 Direct3D 12 设备 pD3D12Device
ID3D11Device* pD3D11Device = nullptr;
ID3D11DeviceContext* pD3D11DeviceContext = nullptr;
D3D11On12DDI_DEVICE_FUNCS deviceFuncs;
D3D12_COMMAND_QUEUE_DESC1 chosenQueueDesc;
// 创建 ID3D11Device 和 ID3D11DeviceContext
HRESULT hr = pD3D11On12Device->Create11DeviceFromID3D12(
pD3D12Device,
D3D11_CREATE_DEVICE_BGRA_SUPPORT, // 可根据需要设置其他标志
queueDescList, // 命令队列描述符列表
numQueues, // 命令队列数量
nodeMaskArray, // 节点掩码数组
numNodeMasks, // 节点掩码数量
&pD3D11Device,
&pD3D11DeviceContext,
&deviceFuncs,
&chosenQueueDesc
);
if (SUCCEEDED(hr))
{
// 成功创建了共享资源的 Direct3D 11 设备和上下文
}
在这个示例中,通过 Create11DeviceFromID3D12 方法,我们从 Direct3D 12 设备创建了一个共享资源的 Direct3D 11 设备和上下文。这使得我们可以在两个 API 之间无缝地共享资源。
转载请注明出处:http://www.zyzy.cn/article/detail/25867/Win32 API/D3d11on12.h/ID3D11On12Device