ID3D11Device::OpenSharedResource 方法 (d3d11.h)

向设备授予对在不同设备上创建的共享资源的访问权限。

语法

HRESULT OpenSharedResource(
  [in]            HANDLE hResource,
  [in]            REFIID ReturnedInterface,
  [out, optional] void   **ppResource
);

参数

[in] hResource

类型: HANDLE

资源句柄。 请参阅备注。

[in] ReturnedInterface

类型: REFIID

资源接口的全局唯一标识符 (GUID) 。 请参阅备注。

[out, optional] ppResource

类型: void**

指向要访问的资源的指针的地址。

返回值

类型: HRESULT

此方法返回以下 Direct3D 11 返回代码之一

注解

可以使用 __uuidof () 宏获取资源接口的 REFIID 或 GUID。 例如,__uuidof (ID3D11Buffer) 将获取缓冲区资源的接口的 GUID。

资源的唯一句柄的获取方式不同,具体取决于最初创建资源的设备类型。

若要在两个 Direct3D 11 设备之间共享资源,必须使用 D3D11_RESOURCE_MISC_SHARED 标志创建资源(如果它是使用 ID3D11Device 接口创建的)。 如果它是使用 DXGI 设备接口创建的,则始终共享资源。

可以使用 __uuidof () 宏获取资源接口的 REFIID 或 GUID。 例如,__uuidof (ID3D11Buffer) 将获取缓冲区资源的接口的 GUID。

在两个 Direct3D 10/11 设备之间共享资源时,可以通过查询 IDXGIResource 接口的资源,然后调用 GetSharedHandle 来获取资源的唯一句柄。


IDXGIResource* pOtherResource(NULL);
hr = pOtherDeviceResource->QueryInterface( __uuidof(IDXGIResource), (void**)&pOtherResource );
HANDLE sharedHandle;
pOtherResource->GetSharedHandle(&sharedHandle);
      

唯一可以共享的资源是 2D 非误入式纹理。

若要在 Direct3D 9 设备和 Direct3D 11 设备之间共享资源,必须使用 CreateTexturepSharedHandle 参数创建纹理。
然后,共享的 Direct3D 9 句柄将传递到 hResource 参数中的 OpenSharedResource。

以下代码演示了所涉及的方法调用。


sharedHandle = NULL; // must be set to NULL to create, can use a valid handle here to open in D3D9 
pDevice9->CreateTexture(..., pTex2D_9, &sharedHandle); 
... 
pDevice11->OpenSharedResource(sharedHandle, __uuidof(ID3D11Resource), (void**)(&tempResource11)); 
tempResource11->QueryInterface(__uuidof(ID3D11Texture2D), (void**)(&pTex2D_11)); 
tempResource11->Release(); 
// now use pTex2D_11 with pDevice11   
      

从 D3D9 共享到 D3D11 的纹理具有以下限制。

  • 纹理必须是 2D
  • 仅允许 1 个 mip 级别
  • 纹理必须具有默认用法
  • 纹理必须仅写入
  • 不允许使用 MSAA 纹理
  • 绑定标志必须设置SHADER_RESOURCE和RENDER_TARGET
  • 仅允许R10G10B10A2_UNORM、R16G16B16A16_FLOAT和R8G8B8A8_UNORM格式
如果在一台设备上更新了共享纹理,则必须在该设备上调用 ID3D11DeviceContext::Flush

要求

   
目标平台 Windows
标头 d3d11.h
Library D3D11.lib

另请参阅

ID3D11Device