ОК, мой коллега нашел решение. Строка 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. Для второй текстуры все наоборот.
Далее читайте: [ссылка]