Vulkan根据功能选择队列家族的索引

根据功能选择队列家族的索引
在创建逻辑设备前,应先考虑需要使用该逻辑设备执行哪些操作,因为这会影响我们对队列家族和队列的选择。
在简单的情况下,从一个支持图形操作的家族中选出一个队列就足够了。在更高级的使用情况下,需要选择能够支持图形和计算操作的队列,甚至还需要选用支持高速内存复制操作的传输队列。
本节介绍查找队列家族的方式,以便获取想要使用的操作类型的队列家族。

具体处理过程
(1)通过调用vkEnumeratePhysicalDevices()函数获取物理设备的句柄,将该句柄存储在一个VkPhysicalDevice类型的变量中,将该变量命名为physical_device。
(2)创建一个uint32_t类型的变量,将该变量命名为queue_family_index,该变量用于存储支持我们选用操作的队列家族的索引。
(3)创建一个VkQueueFlags类型的位域变量,将其命名为desired_capabilities。将用户想要使用的操作类型存储在desired_capabilities变量中,该操作可以是对VK_QUEUE_GRAPHICS_BIT、VK_QUEUE_COMPUTE_BIT、VK_QUEUE_TRANSFER_BIT和VK_QUEUE_SPARSE_BINDING_BIT常量执行的逻辑或操作。
(4)创建一个元素类型为VkQueueFamilyProperties的std::vector容器变量,将该变量命名为queue_families。
(5)使用“检查可用队列家族和它们的属性”小节介绍的方式,查明可用队列家族的数量并获取这些队列家族的属性,将获得的数据存储在queue_families变量中。
(6)创建一个uint32_t类型的变量,将其命名为index。使用index变量遍历std::vector容器queue_families变量中的所有元素。
(7)在访问queue_families变量中存储的每个元素时:

① 检查当前元素中的队列编号(由queueCount成员代表)是否大于0。
② 检查对desired_capabilities变量和当前元素的queueFlags成员执行逻辑与操作的结果,是否等于0。
③ 如果上述两个检查操作的结果都为真,就将index变量的值(当前迭代循环中的)存储到queue_family_index变量中,并结束遍历操作。

(8)重复执行步骤7,直到将std::vector容器queue_families变量中的所有元素都查看一遍为止。

具体运行情况
先获取指定物理设备上可用队列家族的属性,将通过执行检查操作获得的数据存储在queue_families变量中,queue_families变量中存储的是元素类型为VkQueueFamilyProperties的std::vector容器。

Vulkan根据功能选择队列家族的索引
然后检查vector容器queue_families变量中的所有元素。

Vulkan根据功能选择队列家族的索引
Vulkan根据功能选择队列家族的索引


vector容器queue_families变量中的每个元素,都代表一个独立的队列家族。每个元素中的queueCount成员都含有该元素代表的队列家族中可用队列的数量。queueFlags成员使用位域数据结构,在该数据结构中每个二进制位代表一种操作类型。对指定的位进行设置,则代表其对应类型的操作由指定的队列家族来支持。我们可以尝试组合使用队列家族支持的任何操作,但是需要为每种类型的操作寻找独立的队列,这完全取决于硬件支持和Vulkan驱动程序。

为了确保我们获得了正确的数据,还应该检查每个家族是否至少含有一个队列。

在更高级的现实处理情况下,需要存储每个家族含有队列的总数。这是因为我们可以使用一个以上的队列,但无法使用超过指定家族中可用队列数量的队列。在简单的情况下,使用指定家族中的一个队列就足够了。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战