Graphics 在Vulkan中,您如何将每个视频卡与它们的监视器关联起来';我们直接连接到

Graphics 在Vulkan中,您如何将每个视频卡与它们的监视器关联起来';我们直接连接到,graphics,3d,vulkan,Graphics,3d,Vulkan,我有两个显示器,每个都连接到不同的GPU。两个GPU都在一台机器上,我想运行一个应用程序。我有两个独立的视图,我想使用GPU/监视器集渲染每个视图。我可以创建多个表面和设备,但我希望确保将每个表面与其显示器插入的GPU相关联,否则我可能会遇到性能问题,因为帧缓冲区需要在卡之间来回复制 我使用的是全屏界面,我想这是vkGetPhysicalDeviceSurfaceSupportKHR会告诉我的。但是,两个VkSurfaceKHR似乎都是每个VkPhysicalDevice的有效目标,所以我想这是

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

我使用的是全屏界面,我想这是
vkGetPhysicalDeviceSurfaceSupportKHR
会告诉我的。但是,两个
VkSurfaceKHR
似乎都是每个
VkPhysicalDevice
的有效目标,所以我想这是操作系统和GPU驱动程序可以处理的事情,但是有没有关于哪个曲面最适合与设备关联的提示

据我所知,扩展名
VK_KHR_display
是实现这一点的一种方法,但它在我的Windows 10计算机或Nvidia GPU上不可用。它似乎只适用于嵌入式平台。但是,它可以让您列出每个设备的附加显示器,这与我正在寻找的几乎相同:

来自的这句话让我相信Windows可能不支持这一点:

问题

1) Win32是否需要一种查询特定物理设备和特定屏幕之间兼容性的方法?物理设备和窗口之间的兼容性通常只取决于窗口所在的屏幕。但是,如果屏幕上没有窗口,就没有明显的方法来识别屏幕

已解决:否。虽然它可能有用,但在Win32上没有明确的方法来执行此操作。但是,在查询支持中添加了一个方法,可以将其作为一个整体呈现给windows桌面


不过,我还是很想知道是否有一种方法可以达到类似的效果。

有两种扩展对这类事情很有用:您提到的一种,
VK_KHR_display
,第二个称为
VK_KHR_display\u swapchain
,它允许您直接在设备显示器上创建swapchain,而无需任何底层窗口系统

但Windows上很少支持这些扩展。在核心Vulkan API中,无法实现您想要的。恐怕您需要使用操作系统特定的函数(在这种情况下,您需要依赖WinAPI函数)

[编辑]


你看到这个问题了吗?如果没有,它可能会帮助您开始您的研究。

正如您已经发现的,在Win32上,您需要使用操作系统窗口系统,使用窗口API选择您想要使用的显示。它可以是直截了当的

但如果您打算编写简单且不可知的操作系统代码,请检查GLFW项目。它有高级功能来处理所有主要操作系统上的windows

检查:

GLFW用自己的话说:

GLFW是一个用于OpenGL、OpenGL ES和Vulkan应用程序开发的免费、开源、多平台库。它提供了一个简单的、独立于平台的API,用于创建窗口、上下文和曲面、读取输入、处理事件等


终于找到了解决方法:

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

您可以使用这些属性从
vkPhysicalDevicePropertiesKHR
获取
DeviceUID
。 然后可以将其与Direct X
DXGI\u ADAPTER\u DESC中该结构的Luid进行比较

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

现在,您已经掌握了将vulkan曲面与其实际连接的设备关联起来所需的所有信息

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


如果Windows只支持
VK_KHR_显示
VK_KHR_显示_交换链
扩展,那么这将非常简单(跨平台)。

您打算如何通过创建无边界全屏窗口来确保特定窗口保留在特定显示器上。我还没有确认是否可以创建两个真正的全屏窗口(每个显示器一个),但我不关心这个应用程序的传统窗口,锁定视图对我来说是非常好的。是的,我已经在使用GLFW,但如果它不能处理我的特殊情况,我也愿意放弃这种抽象。这里的特殊问题不是创建窗口和拾取显示器,而是将这些显示器与其物理连接的GPU相关联。如果你能做到这一点,你应该能够避免在卡之间来回复制帧缓冲区的一些开销,假设每个卡的输出彼此独立。明白了。您有一个非常特殊的情况,您有两个不同的GPU,具有独立的输出,有可能发生交叉显示。我想主要的问题是应用程序使用的是弱卡(内置Intel),而不是强大的卡(分立AMD/Nvidia)。交叉显示可能不是一个大问题,因为它们都被转换为2D图像并通过窗口系统绘制。请,这是我的假设,请检查文档并测试它,如果必要的话。