ID3D11On12Device 接口是用于在 Direct3D 11 和 Direct3D 12 之间共享资源的接口,定义在 D3d11on12.h 头文件中。这个接口提供了一系列方法,用于在两个 API 之间共享资源和上下文。

以下是关于 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