Vulkan 队列和队列族

Vulkan 队列和队列族队列指的是应用程序和物理设备之间的通信过程。应用程序通过将指令缓存提交到队列的方式来发布工作任务。而物理设备会读取队列中的任务并通过异步的方式来处理它们。

物理设备通常可能支持四种类型的队列,如图所示。一个物理设备可能支持多个同类型的队列,这样应用程序就可以自己选择所需队列的数量以及队列的类型。举例来说,一个简单的应用程序可能需要两个队列:计算和图形。前者用来执行模糊滤镜中的卷积运算,后者用来执行经过模糊滤镜处理的图像渲染。
Vulkan 队列和队列族

物理设备中可能包括一个或者多个队列族,每个队列族所支持的队列类型各不相同。而每个队列族中可能包含了一个或者多个队列。如图所示就是三个队列族以及各自对应的多个队列的支持情况。
Vulkan 队列和队列族

查询队列族

物理设备可以查询多个队列族的信息。

队列族的数量是通过API函数vkGetPhysicalDeviceQueueFamilyProperties()来获取的,如下所示:
Vulkan 队列和队列族
API函数的参数说明如表所示。
Vulkan 队列和队列族

队列被划分为不同的族,这是由它们自身的特性所决定的。下面的代码片段是来自VulkanDevice类的,它给出了队列族查询的方法,查询得到的属性保存在VkQueueFamilyProperties结构体对象中,即queueFamilyProps。

在我们的实现中,队列族属性的查询是通过一个名为getPhysicalDeviceQueuesAndProp-erties()的函数完成的,它的定义在VulkanDevice类当中。以下给出了简单的实现过程:
Vulkan 队列和队列族
结构体中的queueFlag参数设置了队列族的属性,如表所示。

Vulkan 队列和队列族

每个队列族都可以支持一个或者多个队列类型,这是通过VkQueueFamilyProperties的queueFlag参数来设置的。参数queueCount负责设置队列族中的队列数量。第三个参数timestampVaildBits用来对指令的执行计时。最后一个参数minImageTransferGranularity设置了当前队列族所支持的图像传输操作的最小粒度。下面给出结构体的语法解释:
Vulkan 队列和队列族

如图所示为物理设备中的队列和队列族关系图。图中的物理设备包含了四种类型的队列族,每一种都包含了多种不同的特性,通过族的队列类型参数(queueFlags)和队列数量参数(queueCount)来记录。
Vulkan 队列和队列族

保存图形队列的句柄
创建逻辑设备对象的时候,还需要一个合法的队列句柄(以索引的方式)来创建与设备关联的队列。我们需要因此迭代查询所有的队列族属性,检查它们的VkQueueFamilyProperties::queueFlags位信息并找到合适的队列类型。例如,我们可能希望使用图形队列的句柄。下面的代码即找到一个图形队列的句柄并且将它存储到graphicsQueueIndex中,随后用它来完成逻辑设备对象(VkDevice)的创建:
Vulkan 队列和队列族

创建队列

当我们使用vkCreateDevice()函数创建逻辑设备对象的时候,队列已经被系统后台创建了。这个API函数需要输入一个结构体VkDeviceQueueCreateInfo来设置队列的信息。下面的代码给出了它的语法说明和相关的参数域:
Vulkan 队列和队列族

Vulkan 队列和队列族

API函数的参数说明如表所示。
Vulkan 队列和队列族

我们已经知道,逻辑设备对象创建的同时,队列已经被自动创建了。创建后的队列可以通过vkGetDeviceQueue()函数被应用程序获取。下面的函数(getDeviceQueue())来自于用户定义的VulkanDevice类,它提供了有关设备和关联队列的高级封装功能:
Vulkan 队列和队列族
下面给出API函数的语法:
Vulkan 队列和队列族
有关API函数的参数说明如表所示。
Vulkan 队列和队列族

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!