В 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 - это бесплатная многоплатформенная библиотека с открытым исходным кодом для разработки приложений OpenGL, OpenGL ES и Vulkan. Он предоставляет простой, независимый от платформы API для создания окон, контекстов и поверхностей, чтения ввода, обработки событий и т. Д.