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

时间:2019-07-03 05:28:10

标签: multithreading directx textures

例如,在线程A的deviceA上创建texA,在线程B的deviceB上创建texB,deviceA和deviceB使用同一GPU,因此如何使用ID3D11DeviceContext :: CopyResource()(或CopySubresourceRegion())来复制texA到GPU中的texB?

1 个答案:

答案 0 :(得分:0)

创建一种纹理,以便可以在设备之间共享。

如果仅支持Win8和更高版本,并且两个设备均为D3D 11.1,建议的方法是在D3D11_RESOURCE_MISC_SHARED_NTHANDLE的{​​{1}}字段中指定D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEXMiscFlags标志。

一旦创建,IDXGIResource1接口的QueryInterface。在该界面上调用D3D11_TEXTURE2D_DESC。您不需要名称,请传递IDXGIResource1::CreateSharedHandle。如果要从该纹理复制到另一台设备,请指定nullptr;如果要从另一设备复制到该纹理,请指定DXGI_SHARED_RESOURCE_READ

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

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