Создайте одну из текстур, чтобы ее можно было использовать на всех устройствах.
Если вы поддерживаете только Win8 и новее, и оба устройства поддерживают D3D 11.1, рекомендуется указать флаги D3D11_RESOURCE_MISC_SHARED_NTHANDLE
и D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
в поле MiscFlags
поля D3D11_TEXTURE2D_DESC
.
После создания QueryInterface для интерфейса IDXGIResource1. Звоните IDXGIResource1::CreateSharedHandle
на этом интерфейсе. Тебе не нужно имя, прой nullptr
. Укажите DXGI_SHARED_RESOURCE_READ
, если вы будете копировать эту текстуру на другое устройство, или DXGI_SHARED_RESOURCE_WRITE
, если вы будете копировать материал с другого устройства в эту текстуру.
Вы получите значение HANDLE. Затем, на втором устройстве, позвоните ID3D11Device1::OpenSharedResource1
, передав эту ручку. В случае успеха вы получите указатель ID3D11Texture2D
на эту текстуру, общий для второго устройства D3D. Затем вы можете вызвать CopyResource
или любой другой API D3D на втором устройстве, чтобы скопировать данные между текстурами. Не забудьте CloseHandle
, как только вы откроете эту текстуру на втором устройстве.
Если у вас D3D 11.0 или все еще поддерживается Windows 7, рабочий процесс немного отличается. Используйте D3D11_RESOURCE_MISC_SHARED
флаг ресурса при создании ресурса, вызовите IDXGIResource::GetSharedHandle
для получения дескриптора, вызовите ID3D11Device::OpenSharedResource
, чтобы открыть эту текстуру на другом устройстве, и не вызывайте CloseHandle
для этого дескриптора.