Как скопировать текстуру из контекста в другой контекст внутри графического процессора? - PullRequest
0 голосов
/ 03 июля 2019

например, texA создается на устройстве A в потоке A, texB создается на устройстве B в потоке B, устройство A и устройство B используют один и тот же графический процессор, так как я могу использовать ID3D11DeviceContext :: CopyResource () (или CopySubresourceRegion ()) для копирования texA в texB внутри GPU?

1 Ответ

0 голосов
/ 04 июля 2019

Создайте одну из текстур, чтобы ее можно было использовать на всех устройствах.

Если вы поддерживаете только 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 для этого дескриптора.

...