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 设备之间共享资源,必须使用 CreateTexture 的 pSharedHandle 参数创建纹理。
然后,共享的 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格式
要求
目标平台 | Windows |
标头 | d3d11.h |
Library | D3D11.lib |