我正在尝试将像素从源ID3D11Texture2D
复制到共享目标纹理中。我的目标是创建一个共享句柄并将其导出到另一个应用程序。对于复制过程,我使用ID3D11DeviceContext::CopyResource
,但似乎无法正常工作。当我打开共享手柄(使用ID3D11Device1::OpenSharedResource1
或OpenSharedResourceByName
)时,图像全为黑色,但是尺寸正确。有谁知道我该如何调试?我相信源纹理和目标纹理都是用相似的描述创建的,唯一的区别是目标的CPUAccessFlags
为0,其MiscFlags
为D3D11_RESOURCE_MISC_SHARED_NTHANDLE | D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
。
非常感谢,尼古拉斯
好,我的一位同事想出了一个解决方案。 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解锁。对于第二个纹理,反之亦然。
进一步阅读:[link]