ID3D11DeviceContext :: CopyResource не копирует пиксели - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь скопировать пиксели из источника ID3D11Texture2D в общую текстуру назначения. Моя цель - создать общий дескриптор и экспортировать его в другое приложение. Для процесса копирования я использую ID3D11DeviceContext::CopyResource, но, похоже, он не работает должным образом. Когда я открыл общий дескриптор (используя ID3D11Device1::OpenSharedResource1 или OpenSharedResourceByName), все изображение было черным, но я получил правильный размер. Кто-нибудь знает, как я могу это отладить? Я полагаю, что исходная и конечная текстуры были созданы с одинаковыми описаниями, и единственное отличие состоит в том, что CPUAccessFlags пункта назначения равен 0, а MiscFlags равен D3D11_RESOURCE_MISC_SHARED_NTHANDLE | D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX.

Большое спасибо, Николас

1 Ответ

0 голосов
/ 13 февраля 2020

ОК, мой коллега нашел решение. Строка CopyResource должна быть заблокирована до и разблокирована после вызова, например:

ComPtr<IDXGIKeyedMutex> mutexA;
hr = dxgiResource.As(&mutexA);

// GPU Copy the original 
mutexA->AcquireSync(0, ...);
dxContext->CopyResource(dxSharedTexture.Get(), dxTexture.Get());
mutexA->ReleaseSync(1);

и при получении текстуры сделать то же самое.

ComPtr<IDXGIKeyedMutex> mutexB;
hr = pTexture2D.As(&mutexB);
hr = mutexB->AcquireSync(1, ...);
// Retrieve the image
// ....
mutexB->ReleaseSync(0);

Обратите внимание, что mutexA и mutexB имеют противоположные ключи. Вы блокируете первую первую текстуру клавишей 0 и разблокируете ее клавишей 1. Для второй текстуры все наоборот.

Далее читайте: [ссылка]

...