DirectX 11: одновременное использование нескольких адаптеров

Нам нужно подключить от 8 до 12 мониторов с одного компьютера, каждый из которых отображает разные виды одного трехмерного сценографа, поэтому приходится использовать несколько видеокарт. В настоящее время мы работаем на dx9, поэтому надеемся перейти на dx11, чтобы, надеюсь, сделать это проще.

Первоначальные исследования показывают, что очевидный подход не работает - производительность плохая, если мы не приводим каждую карту в отдельный процесс. Поиски в Интернете ничего не дают. Кто-нибудь может предложить лучший способ использовать несколько карт одновременно из одного процесса с dx11?

3 ответа

Я вижу, что вы уже пришли к решению, но я подумал, что было бы неплохо добавить свой недавний опыт для тех, кто сталкивается с этим вопросом...

Да, вы можете управлять любым количеством адаптеров и выходов из одного процесса. Вот некоторая информация, которая может быть полезна:

В DXGI и DX11:

Каждая видеокарта представляет собой "Адаптер". Каждый монитор представляет собой "Выход". Смотрите здесь для получения дополнительной информации о перечислении через них.

Как только у вас есть указатели на адаптеры, которые вы хотите использовать, создайте устройство (ID3D11Device), используя D3D11CreateDevice для каждого из адаптеров. Возможно, вы хотите отдельную ветку для взаимодействия с каждым из ваших устройств. Этот поток может иметь определенную привязку к процессору, если это помогает ускорить процесс для вас.

Как только у каждого адаптера будет свое устройство, создайте цепочку подкачки и назначьте цель для каждого выхода. Вы также можете создать свое представление глубины трафарета для каждого выхода, пока вы на нем.

Процесс создания цепочки подкачки потребует настройки ваших окон: по одному окну на выход. Я не думаю, что есть большая выгода в управлении вашим рендерингом из окна, содержащего цепочку обмена. Вы можете просто создать окна как хосты для вашей цепочки подкачки, а затем полностью забыть о них.

Для рендеринга вам нужно будет перебирать каждый вывод каждого устройства. Для каждого вывода измените цель рендеринга устройства на цель рендеринга, созданную для текущего вывода с помощью OMSetRenderTargets. Опять же, вы можете запускать каждое устройство в отдельном потоке, если хотите, поэтому каждая пара потоков / устройств будет иметь свою собственную итерацию через выходные данные для рендеринга.

Вот несколько ссылок, которые могут помочь при прохождении этого процесса:

Отображение разных изображений на монитор DirectX 10

DXGI и 2+ полноэкранные дисплеи в Windows 7

http://msdn.microsoft.com/en-us/library/windows/desktop/ee417025%28v=vs.85%29.aspx

Удачи!

Возможно, вам не нужно обновлять Directx.
Смотрите эту статью.

Перечислите доступные устройства с помощью IDXGIFactory, создайте ID3D11Device для каждого и затем подайте их из разных потоков. Должно работать нормально.

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