例如,在线程A的deviceA上创建texA,在线程B的deviceB上创建texB,deviceA和deviceB使用同一GPU,因此如何使用ID3D11DeviceContext :: CopyResource()(或CopySubresourceRegion())来复制texA到GPU中的texB?
答案 0 :(得分:0)
创建一种纹理,以便可以在设备之间共享。
如果仅支持Win8和更高版本,并且两个设备均为D3D 11.1,建议的方法是在D3D11_RESOURCE_MISC_SHARED_NTHANDLE
的{{1}}字段中指定D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
和MiscFlags
标志。
一旦创建,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