2016-11-11 4 views
1

У меня есть дескриптор ID3D11Texture2D, но нет доступа к его ID3D11DeviceContext или ID3D11Device. Я хочу скопировать эту текстуру в другую текстуру на другом ID3D11Device. Текстура не создается с помощью каких-либо флагов обмена. Если я попытаюсь скопировать с ID3D11DeviceContext :: CopyResource, я получаю предупреждение «Параметр D3D11 CORRUPTION не соответствует устройству». Как скопировать текстуру или ее содержимое? Я думаю, это возможно, поскольку, например, OpenVR API использует только обработчик текстуры без какого-либо контекста.Копирование текстуры Direct3D11 на другое устройство D3D11

+0

Если вы не используете совместное использование, вам необходимо скопировать его обратно через память CPU, которая будет очень медленной. –

+0

@ChuckWalbourn Чтобы скопировать текстуру в CPU, мне нужно было скопировать ее в промежуточную текстуру сначала? И для этого мне понадобится контекст устройства, которого у меня нет? – superg

+0

Вы не можете делать копии без непосредственного контекста устройства. –

ответ

2

Если текстура не создана с помощью флага совместного доступа, вы не можете использовать ее между двумя устройствами.

Но у вас есть объект текстуры, то есть ID3D11DeviceChild и достаточно, чтобы получить доступ к ID3D11DeviceChild::GetDevice для извлечения устройства и расширения ID3D11Device::GetImmediateContext

Теперь, когда у вас есть доступ к устройству и контекста, вы можете создайте дополнительную текстуру с флагом обмена D3D11_RESOURCE_MISC_SHARED на оригинальном устройстве или на своем собственном устройстве и получите обратно объект на другом с помощью ID3D11Device::OpenSharedResource. И, наконец, скопируйте исходную текстуру в новый объект с помощью CopyResource

Не забывайте, что все тезисы Get добавляют ссылку на объекты, которые необходимо освободить, когда вы закончите с ними.

+1

Работает как шарм и отлично решает мою проблему. Большое спасибо! – superg

Смежные вопросы