如何将纹理从上下文复制到 GPU 内的另一个上下文?

How to copy texture from context to another context inside GPU?

例如,texA是在threadA中的deviceA上创建的,texB是在threadB中的deviceB上创建的,deviceA和deviceB使用相同的GPU,那么如何使用ID3D11DeviceContext::CopyResource()(或CopySubresourceRegion())将 texA 复制到 GPU 中的 texB?

创建其中一个纹理,以便跨设备共享。

如果您只支持 Win8 和更新版本,并且两个设备都是 D3D 11.1,推荐的方法是在 [=13= 的 MiscFlags 字段中指定 D3D11_RESOURCE_MISC_SHARED_NTHANDLED3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 标志].

一旦创建,IDXGIResource1 接口的QueryInterface。在该接口上调用 IDXGIResource1::CreateSharedHandle。你不需要名字,通过nullptr。如果您要从该纹理复制到另一个设备,请指定 DXGI_SHARED_RESOURCE_READ,或者如果您要将内容从另一个设备复制到该纹理,请指定 DXGI_SHARED_RESOURCE_WRITE

您将获得一个 HANDLE 值。然后,在第二台设备上调用 ID3D11Device1::OpenSharedResource1,传递该句柄。如果成功,您将获得该纹理的 ID3D11Texture2D 指针,共享到第二个 D3D 设备。然后您可以在第二个设备上调用 CopyResource 或任何其他 D3D API,以在纹理之间复制数据。在第二台设备上打开该纹理后,别忘了 CloseHandle

如果您有 D3D 11.0 或仍然支持 Windows 7,则工作流程略有不同。创建资源时使用D3D11_RESOURCE_MISC_SHARED资源标志,调用IDXGIResource::GetSharedHandle获取句柄,调用ID3D11Device::OpenSharedResource在另一个设备上打开该纹理,不要在该句柄上调用CloseHandle .