Перенос текстур через адаптеры в DirectX 11

Я фиксирую рабочий стол с помощью API Desktop Duplication из одного графического процессора, и мне нужно скопировать текстуру (которая находится в памяти графического процессора) в другой графический процессор. Для этого у меня есть поток захвата, который получает изображение рабочего стола, а затем копирует его в промежуточный ресурс (созданный на том же устройстве), используя ID3D11DeviceContext::CopyResource. Затем я сопоставляю этот промежуточный ресурс с помощью Read, сопоставляю целевой динамический ресурс (который был создан на другом устройстве) с WriteDiscard и копирую данные. В потоке рендеринга я делаю ID3D11DeviceContext:: CopyResource из динамической текстуры в конечную цель рендеринга.

Это работает, но я получу случайный сбой в nvwgf2umx.dll (код исключения: 0xc0000005) через некоторое время (обычно в течение 30 секунд). Оба устройства создаются без флага создания SingleThreaded. Я провел небольшое исследование, и использование динамической текстуры казалось лучшим способом сделать это.

Любые идеи о том, что вызывает аварию? Может ли это быть ошибка, специфичная для драйвера Nvidia?

1 ответ

Вы должны QueryInterface для общего ресурса с другим устройством, которое вы используете. Это выглядело бы так в C# (что, я полагаю, вы действительно используете помимо данных фрагментов в C++)

var sharedResource = aquiredDesktopTexture11.QueryInterface<SharpDX.DXGI.Resource>();
var sharedSurfDesktop = device11.OpenSharedResource<SharpDX.Direct3D11.Texture2D>(sharedResource.SharedHandle);

..were aquiredDesktopTexture11 - это скопированный ресурс из исходного захвата, а затем sharedSurfDesktop может использоваться другим устройством. Также убедитесь, что использование является взаимоисключающим.

Другие вопросы по тегам