Direct2D как открыть общую текстуру - PullRequest
2 голосов
/ 12 октября 2019

У меня есть код, который использует Direct9Ex, например:

res = Device->CreateTexture(1920, 1080, 1, 1, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &Texture, &texture_shared_handle);

Как я могу открыть эту текстуру для чтения в Direct2D, используя эту texture_shared_handle?

Я нашел функцию ID2D1RenderTarget :: CreateSharedBitmap , но не может найти никакого рабочего кода, который может открыть общие ресурсы DXGI. Также текстура подходит для совместного использования, у нее только один уровень и режим A8R8G8B8. Кроме того, я вынужден использовать direct9ex для создания текстур

Еще одно решение, о котором я думаю, - это создать поверхность Direct9Ex на том же устройстве, что и выше (которая создает текстуру) с общим дескриптором, например:

res = Device->CreateOffscreenPlainSurface(1920, 1080, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &MagSurface2, &Surface2_shared_handle);
res = Texture->GetSurfaceLevel(0, &MagSurface1);

...
// copying data from texture level surface to shared surface
res = Device->GetRenderTargetData(MagSurface1, MagSurface2);

Но как передать это Surface2_shared_handle в Direct2D?

Я также пытался заставить IDXGISurface передать его в Direct2D, но я всегда терпел неудачу:

// Direct9Ex texture
IDXGISurface* pDxgiSurface = NULL;
            res = Texture->QueryInterface(__uuidof(IDXGISurface), (void**)&pDxgiSurface);
res is always E_NOINTERFACE!

Спасибо

1 Ответ

2 голосов
/ 14 октября 2019

Чтобы получить IDXGISurface, вам нужно открыть общую текстуру на устройстве DirectX 11 (которое вы использовали для инициализации Direct2D), используя эту функцию . Вы можете вызвать его, чтобы получить IDXGIResource, который вы можете использовать QueryInterface для IDXGISurface, и использовать его в Direct2D. Возможно, вам также потребуется реализовать некоторую синхронизацию, например, описанную здесь .

...