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 для каждого и затем подайте их из разных потоков. Должно работать нормально.