共享ID3D11Buffer和ID3D12Resource

时间:2018-10-18 07:33:54

标签: textures gpu directx-11 direct3d directx-12

在D3D11 / D3D12中,是否有可能以一种或另一种方式与ID3D12Resource共享ID3D11Buffer?我知道可以共享ID3D11Texture2D,但是似乎无法跨API版本共享ID3D11Buffer。我没有没有没有正当的理由为什么不允许使用它,因为ID3D12Resource可以表示缓冲区以及texture2d。

我不太在意共享的方向(D3D11-> D3D12或D3D12-> D3D11很好)。我只需要找到一种共享资源的方法,因为我们现在有一个混合应用程序,并且我们不想无用地复制数据。 Texture2D无法正常工作,因为宽度/高度和颜色格式对于我们的用例而言并没有任何意义。

1 个答案:

答案 0 :(得分:0)

您确实可以在Direct3D 11和Direct3D 12之间共享资源。我可以在VideoTexture示例(UWP版本/ PC版本)中进行共享。

  • 您使用一个API创建资源。
  

如果创建要共享的ID3D12Resource,则在创建资源时需要使用D3D12_HEAP_FLAG_SHARED,并且在资源描述中需要使用D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS。对于Direct3D 11.1创建资源,您需要使用D3D11_RESOURCE_MISC_SHARED_NTHANDLE,因为DirectX 12仅支持更新的“ NT句柄”模型。

  • 然后获取共享句柄。
  

对于Direct3D 12,这是通过Direct3D 12设备上的CreateSharedHandle完成的。对于Direct3D 11.x,必须查询IDXGIResource1接口才能调用此方法。

  • 然后使用共享句柄在另一个API中创建资源实例。
  

对于Direct3D 11.x共享由DirectX 12创建的资源,请使用OpenSharedResource1。对于DirectX 12,请使用OpenSharedResource

请参见docs