Vulkan 队列系列说明

Vulkan Queue Families Clarification

在 Vulkan 规范的某处指定表示能力,vkGetPhysicalDeviceSurfaceSupportKHR return 为真,仅与具有 VK_QUEUE_GRAPHICS_BIT 位标志的系列或传输独占系列相关 return 也对吗?

我可能对 Vulkan 教程中的命名有点困惑 (https://vulkan-tutorial.com/Drawing_a_triangle/Presentation/Window_surface#page_Creating-the-presentation-queue),但我假设命名为 presentQueue 和 presentFamily 的实际上只是(另一个或相同的)图形队列和图形family 并且它与组 VK_QUEUE_TRANSFER_BIT 的队列系列无关(如果队列系列不包含这两个标志)。

我的假设是正确的还是我误解了什么?

严格来说,没有“现世家”,也没有“图形世家”。只有不同的队列系列支持不同类型的操作,例如演示或图形。

支持多少个不同的队列系列以及它们具有哪些功能取决于您的特定 GPU 型号。为了更好地了解所有这些信息,如果您选择上传数据,我可以推荐工具 Hardware Capability Viewer by Sascha Willems. (It is also used to populate the database behind the awesome gpuinfo.org。)

例如,在 NVIDIA RTX 2080 上,我得到以下具有以下功能的不同队列系列:

  • 队列系列 #0 支持传输、图形、计算和表示
  • 队列系列 #1 仅支持传输,不支持其他
  • 队列系列 #2 支持传输、计算和表示

如您所见,我可以使用队列系列 #0 或 #2 中的队列将图像发送到演示引擎,但不能使用队列系列 #1 中的队列。

我觉得这些功能很有趣。这意味着对于某些用例,使用一个专门的队列系列(即#1 或#2)可以 比使用系列#0 中的队列能够获得更好的性能执行任何操作。使用不同的队列可以使您的应用程序更好地并行工作,但通常还需要在不同队列之间进行某种工作同步。

家族 #2 中的队列通常被称为“异步计算队列”(我认为,这个术语主要来自 DirectX 世界),并且现在可以在游戏的图形设置中启用很长一段时间(如果支持的)。我最近发现的是启用“从计算中呈现”的选项(《毁灭战士永恒》提供此设置),这将引用来自家庭 #2 的队列。我猜这不会自动导致性能提高(这就是为什么它可以 enabled/disabled)但在某些 GPU 上它肯定会。

回答您的具体问题:队列系列不必支持图形功能即可支持演示。有些队列系列(例如在 RTX 2080 上)支持计算和演示,但不支持图形。所有这些都取决于具体的 GPU 型号。我不知道是否有任何 GPU 提供具有演示支持的仅传输队列系列——也许这没有太大意义,所以我想最好不要。