В Vulkan, как вы можете связать каждую отдельную видеокарту с мониторами, к которым они напрямую подключены

У меня есть два монитора, каждый из которых подключен к другому графическому процессору. Оба графических процессора находятся на одной машине, и я хочу запустить одно приложение. У меня есть два независимых представления, и я хотел бы отобразить каждое из них, используя набор графических процессоров / мониторов. Я могу создать несколько поверхностей и устройств, но я хочу убедиться, что я связываю каждую поверхность с графическим процессором, к которому подключен монитор, в противном случае я подозреваю, что у меня будут проблемы с производительностью, так как буферы кадров необходимо копировать назад и вперед между картами.

Я использую полноэкранные поверхности, и я думал, что это было что-то vkGetPhysicalDeviceSurfaceSupportKHR сказал бы мне. Тем не менее, оба VkSurfaceKHR кажутся действительными целями для каждого VkPhysicalDevice так что я думаю, это то, что ОС и драйвер графического процессора могут обрабатывать, но есть ли какой-нибудь намек на то, какую поверхность лучше всего связать с устройством?

Из чего могу сказать расширение VK_KHR_display это один из способов сделать это, но он не доступен на моей машине с Windows 10 или Nvidia GPU. Кажется, он предназначен только для встроенных платформ. Тем не менее, он позволяет вам вывести список подключенных дисплеев для каждого устройства, и это почти то, что я ищу: https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch29s03.html

Эта цитата из документации заставляет меня поверить, что это может не поддерживаться в Windows:

вопросы

1) Нужен ли Win32 способ запроса совместимости между конкретным физическим устройством и конкретным экраном? Совместимость между физическим устройством и окном обычно зависит только от того, на каком экране находится окно. Тем не менее, нет очевидного способа идентифицировать экран, не имея окна на экране.

РЕШЕНО: Нет. Хотя это может быть полезно, на Win32 нет четкого способа сделать это. Однако был добавлен метод поддержки запросов для представления на рабочем столе Windows в целом.

Тем не менее, мне все еще интересно услышать, есть ли способ обойти аналогичный эффект.

3 ответа

Решение

Наконец-то разобрался с этим:

Direct X фактически поддерживает это посредством использования IDXGIAdapter::EnumOutputs функция. Это позволяет вам перечислить мониторы, подключенные к каждому графическому процессору. Затем, используя эти два расширения, вы можете переназначить эту информацию в Vulkan:

Вы можете использовать их, чтобы получить deviceLUID от VkPhysicalDeviceIDPropertiesKHR, Затем это можно сравнить с Luid из этой структуры в Direct X DXGI_ADAPTER_DESC

Вы также можете использовать glfwGetWin32Window чтобы получить HWND монитора. Это позволяет связать поверхность вулкана с прямым монитором.

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

По крайней мере, в моем приложении правильная настройка приводит к значительной разнице в производительности.

Все было бы намного проще (и кроссплатформенно), если бы Windows просто поддерживала VK_KHR_display а также VK_KHR_display_swapchain расширения, как в Linux.

Есть два расширения, которые полезны для таких вещей: упомянутое Вами, VK_KHR_display а второй называется VK_KHR_display_swapchain что позволяет вам создавать цепочку обмена прямо на дисплее устройства без какой-либо базовой оконной системы.

Но эти расширения редко поддерживаются в Windows. В основном API Vulkan нет способа достичь того, что вы хотите. И я боюсь, что вам нужно использовать специфичные для ОС функции (в этой ситуации вам нужно полагаться на функции WinAPI).

[РЕДАКТИРОВАТЬ]

Вы видели этот вопрос? Как вы можете использовать адаптер дисплея для определенного монитора в Windows? Если нет, может быть, это поможет вам начать с вашего исследования.

Как вы уже обнаружили, в Win32 вам нужно использовать оконную систему ОС, чтобы выбрать дисплей, который вы хотите использовать, используя Window API. Это может быть прямо вперед.

НО, если вы собираетесь создавать простой и независимый код ОС, проверьте проект GLFW. Он имеет функции высокого уровня для обработки окон во всех основных ОС.

Проверьте:

Руководство по монитору GLFW

GLFW Vulkan интеграция

GLFW своими словами:

GLFW - это бесплатная многоплатформенная библиотека с открытым исходным кодом для разработки приложений OpenGL, OpenGL ES и Vulkan. Он предоставляет простой, независимый от платформы API для создания окон, контекстов и поверхностей, чтения ввода, обработки событий и т. Д.

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