Совместное использование ID3D11Buffer и ID3D12Resource - PullRequest
0 голосов
/ 18 октября 2018

В D3D11 / D3D12, возможно ли вообще использовать ID3D11Buffer совместно с ID3D12Resource тем или иным способом?Я знаю, что можно поделиться ID3D11Texture2D, но кажется, что обмен ID3D11Buffer между версиями API невозможен.Я не вижу никаких веских причин, по которым его нельзя было бы разрешить, поскольку ID3D12Resource может представлять буфер, а также texture2d.

Мне действительно все равно, каково направление совместного использования (D3D11 -> D3D12или D3D12 -> D3D11 в порядке).Мне просто нужно найти способ поделиться этим ресурсом, поскольку у нас пока есть гибридное приложение, и мы не хотим бесполезно копировать данные.Texture2D не работает, так как ширина / высота и цветовой формат не имеют смысла для нашего варианта использования.

1 Ответ

0 голосов
/ 18 октября 2018

Вы действительно можете совместно использовать ресурсы между Direct3D 11 и Direct3D 12. Я делаю это в примере VideoTexture ( UWP версия / ПК версия), на который вы можете ссылаться.

  • Вы создаете ресурс в одном API.

Если вы создаете ID3D12Resource для общего доступа, вам нужно использовать D3D12_HEAP_FLAG_SHARED при создании ресурса, ивам нужно использовать D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS в описании ресурса.Для создания ресурса в Direct3D 11.1 необходимо использовать D3D11_RESOURCE_MISC_SHARED_NTHANDLE, поскольку DirectX 12 поддерживает только более новую модель «дескриптор NT».

  • Затем вы получите дескриптор общего ресурса.

Для Direct3D 12 это делается с помощью CreateSharedHandle на устройстве Direct3D 12.Для Direct3D 11.x необходимо вызвать интерфейс IDXGIResource1, чтобы вызвать этот метод.

  • Затем вы используете общий дескриптор для создания экземпляра ресурса в другом API.

Для совместного использования ресурса Direct3D 11.x, созданного DirectX 12, используйте OpenSharedResource1.Для DirectX 12 используйте OpenSharedResource.

См. документы .

...