Vulkan检查可用队列家族和它们的属性

检查可用队列家族和它们的属性
在Vulkan中,当我们想要在硬件上执行操作时,会将这些操作提交到队列中。一个队列中的操作会一个接一个地被处理(按照这些操作被提交的次序),这也是这些操作被称为队列的原因。然而,提交给不同队列的操作会以分隔的方式进行处理(必要时,可以通过同步方式处理这些操作)。

Vulkan检查可用队列家族和它们的属性
不同的队列会代表不同的硬件部分,因而会支持不同种类的操作,并非所有操作都能够在队列中被执行。

我们将含有类似功能的队列分为家族。一个设备会含有许多队列家族,一个队列家族也会含有一个或多个队列。要查明具体硬件平台上能够执行哪些操作,就需要查明所有队列家族的属性。

具体处理过程
(1)通过调用vkEnumeratePhysicalDevices()函数获取物理设备的句柄,将该句柄存储在一个VkPhysicalDevice类型的变量中,将该变量命名为physical_device。
(2)创建一个uint32_t类型的变量,将其命名为queue_families_count。
(3)调用vkGetPhysicalDeviceQueueFamilyProperties(physical_device,&queue_families_count,nullptr)函数。将第一个参数设置为通过调用vkEnumeratePhysicalDevices()函数获得的物理设备句柄(该句柄存储在physical_device变量中);将第二个参数设置为指向queue_families_count变量的指针;将第三个参数设置为nullptr。
(4)这个函数调用操作成功完成后,queue_families_count变量会存储指定物理设备含有的所有队列家族的数量。
(5)为队列家族名单和属性准备存储空间,一种非常便捷的解决方案是使用std::vector容器中的变量。必须将std::vector容器中元素的类型设置为VkQueueFamilyProperties,将存储该容器的变量命名为queue_families。
(6)调整std::vector容器的大小,使它含有的元素数量不小于queue_families_count变量的值。
(7)调用vkGetPhysicalDeviceQueueFamilyProperties(physical_device,&queue_families_count,&queue_families[0])函数,应像上一次调用该函数一样,设置前两个参数;应将最后一个参数设置为指向std::vector容器queue_families中第一个元素的指针。
(8)通过查明queue_families_count变量的值大于0,确认该函数调用操作已成功完成。该函数调用操作成功完成后,指定物理设备含有的所有队列家族的属性,并存储到std::vector容器queue_families中。

具体运行情况
与前面介绍过的查询操作类似,可以将本例的查询过程分为两个阶段,第一个阶段,获取指定物理设备上可用队列家族的总数。通过将最后一个参数设置为nullptr,调用vkGetPhysicalDeviceQueueFamilyProperties()函数可以做到这一点。

Vulkan检查可用队列家族和它们的属性
第二个阶段,在获取指定物理设备含有的所有队列家族的数量后,就可以为队列家族的属性准备存储空间。本例创建了一个含有VkQueueFamilyProperties类型元素的std::vector容器变量,并调整了该vector容器的大小,使之能够容纳不小于第一次查询操作所获得队列家族数量的数据。再次调用vkGetPhysicalDeviceQueueFamilyProperties()函数,但这次将最后一个参数设置为指向刚创建的vector容器中第一个元素的指针。这个vector容器会存储所有可用队列家族的属性。

Vulkan检查可用队列家族和它们的属性
队列家族属性中最重要的信息,是在具体队列家族中可以执行哪些类型的操作。队列家族支持的操作可分为下列种类。

● 图形:用于创建图形管线(graphics pipeline)和绘图。
● 计算:用于创建计算管线(compute pipeline)和分派计算着色器(compute shader)。
● 传输:用于执行非常快速的内存复制操作。
● 稀疏:用于实现额外的内存管理功能。

一个家族中的多个队列可能会支持一种以上的操作,也可能出现多个队列支持同一种操作的情况。

队列家族的属性信息还包括:具体队列家族中可用队列的数量、对时间戳的支持(用于时间测定)和图像传输操作的颗粒度(在执行复制/位块传输操作时,图像分割尺寸的下限)。

了解了队列家族的数量、队列家族的属性和每个家族中可用队列的数量后,就可以创建逻辑设备。所有这些信息都是必须了解的,因为我们自己无法创建队列。我们只能通过创建逻辑设备来使用队列,也可能在逻辑设备中设置使用哪些家族中的哪些队列。创建逻辑设备后,队列会随逻辑设备自动创建,我们只需要获取所有必要队列的句柄。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战