在创建设备之前是否需要创建所有表面?

问题描述

这里只是一个简单的问题...

所以,如您所知,当您创建 Vulkan 设备时,您需要确保您选择的物理设备支持使用 vkGetPhysicalDeviceSurfaceSupportKHR() 呈现给表面,对吗?这意味着,您需要在创建表面之前创建设备。

现在假设在运行时,用户可以按下一个按钮来打开一个新窗口,并且东西将被绘制到那个窗口,所以你需要一个新的表面,对吧?但设备已经已创建...

这是否意味着我必须在创建设备之前创建所有表面,还是必须重新创建设备,但是,如果需要重新创建它,从该设备创建/分配的所有内容会发生什么? ?

解决方法

这是否意味着我必须在创建设备之前创建所有表面,还是必须重新创建设备

都不是。

如果物理设备无法绘制到表面...那么您需要找到一个可以的物理设备。如果您有 2 个 GPU,并且每个 GPU 都插入不同的显示器,则可能会发生这种情况。每个 GPU 只能绘制他们显示器上的表面(尽管有时有一些实现方法可以解决这个问题)。

因此,如果您使用的逻辑 VkDevice 的物理设备无法绘制到表面,则您无需“重新创建”该设备。您创建了一个设备,该设备几乎肯定无法绘制到旧设备可以绘制到的表面。因此,在这种情况下,您需要 2 个单独的设备来渲染到两个表面。

但对于大多数多显示器情况,这不是问题。如果您有一个支持多显示器输出的 GPU,那么您创建的任何窗口几乎肯定会与该 GPU 兼容。集成 GPU + 离散 GPU 机箱也倾向于支持相同的表面。

Vulkan API 只要求您检查是否存在不兼容性,然后尽您所能进行处理。这可能涉及将窗口移动到适当的监视器或其他特定于操作系统的内容。