如何将纹理从上下文复制到 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_NTHANDLE
和 D3D11_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
.
例如,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_NTHANDLE
和 D3D11_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
.