在 Vulkan 中,如何将每个单独的显卡与它们直接连接的显示器关联起来

Loc*_*yer 4 3d graphics vulkan

我有两个显示器,每个显示器连接到不同的 GPU。两个 GPU 都在一台机器中,我想运行一个应用程序。我有两个独立的视图,我想使用 GPU/监视器集渲染每个视图。我可以创建多个表面和设备,但我想确保将每个表面与其监视器所插入的 GPU 相关联,否则我怀疑我会遇到性能问题,因为帧缓冲区需要在卡之间来回复制。

我正在使用全屏表面,我想这vkGetPhysicalDeviceSurfaceSupportKHR会告诉我一些事情。然而,两者VkSurfaceKHR似乎都是有效的目标VkPhysicalDevice,所以我猜这是操作系统和 GPU 驱动程序可以处理的事情,但是是否有任何关于哪个表面最适合与设备关联的提示?

据我所知,该扩展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 桌面的支持。

不过,我仍然有兴趣了解是否有解决办法可以实现类似的效果。

Loc*_*yer 6

终于找到了解决这个问题的方法:

Direct X 实际上通过使用该IDXGIAdapter::EnumOutputs函数来支持这一点。这使您可以列出连接到每个 GPU 的监视器。然后使用这两个扩展,您可以将此信息重新映射到 Vulkan:

您可以使用这些来获取deviceLUIDfrom VkPhysicalDeviceIDPropertiesKHR. 然后可以将其与 Direct X 中该结构的 Luid 进行比较DXGI_ADAPTER_DESC

您还可以使用glfwGetWin32Window来获取HWND监视器的。这使您可以将 vulkan 表面与 direct x 监视器关联。

您现在拥有将 vulkan 表面与它们实际连接的设备关联起来所需的所有信息。

至少在我的应用程序中,正确设置会导致性能显着差异。

如果 Windows 能够像Linux 一样支持VK_KHR_displayVK_KHR_display_swapchain扩展,那么这一切都会变得更简单(并且跨平台) 。