获取设备队列
在使用Vulkan时,为了管理和利用具体物理设备的处理能力,需要将操作提交给设备的队列。队列不是由应用程序通过显式方式创建的,它们是在创建逻辑设备的过程中被设置的。应查明有哪些可用的队列家族,以及每个家族中含有多少个队列。我们可以仅从现存队列家族中选取可用队列的子集,不能获取指定家族中没有的队列。
被选中的队列会随逻辑设备自动创建,我们不需要通过显式方式管理和创建它们。同样,我们也无法销毁它们,它们会随逻辑设备一起被销毁。要使用队列或将操作提交给设备的队列,只需要获取队列的句柄。
具体处理过程
(1)获取逻辑设备的句柄,将该句柄存储在类型为VkDevice、名为logical_device的变量中。
(2)获取一个队列家族的索引,这些队列家族是在创建逻辑设备时被创建的,队列家族的索引存储在VkDeviceQueueCreateInfo结构的queueFamilyIndex成员中。将该索引存储在类型为uint32_t、名为queue_family_index的变量中。
(3)获取指定家族中一个队列的索引:该索引必须小于指定家族含有队列的总数,该总数存储在VkDeviceQueueCreateInfo结构的queueCount成员中。将这个队列索引存储在类型为uint32_t、名为queue_index的变量中。
(4)创建一个VkQueue类型的变量,将其命名为queue。
(5)调用vkGetDeviceQueue(logical_device,queue_family_index,queue_index,&queue)
函数。将第一个参数设置为逻辑设备的句柄;将第二个参数设置为我们选中的队列家族的索引;将第三个参数设置为指定队列家族中某个队列的索引;将第四个参数设置为指向变量queue的指针。queue变量用于存储设备队列的句柄。
(6)重复步骤(2)至步骤(5)的操作,处理所有队列家族中的所有队列。
具体运行情况
获取指定队列句柄的代码非常简单:

在执行这个调用操作时,我们将逻辑设备的句柄、队列家族的索引和指定队列家族中某个队列的索引作为前三个参数,必须将第二个参数设置为在创建逻辑设备时获取的队列家族索引其中之一。这意味着如果某个队列不属于在创建逻辑设备时设置的家族,就无法获取该队列的句柄。同理,获取的队列索引必定小于该队列所属家族含有队列的总数。
请思考下面的情况:一个物理设备支持3号队列家族中的5个队列。在创建逻辑设备的过程中,我们仅从3号队列家族中获取了2个队列。因此,当调用vkGetDeviceQueue()函数时,应该将3号队列家族的索引设置为3。在设置队列的索引时,只能使用0和1。
在调用vkGetDeviceQueue()函数时,应将最后一个参数设置为指向某个变量的指针,该变量用于存储我们选用的队列的句柄,我们可以多次获取同一队列的句柄。这个函数调用操作不会创建队列(这些队列是在创建逻辑设备的过程中通过隐式方式创建的),我们仅是通过这个操作获取现有队列的句柄,因此我们可以多次执行这个操作。
酷客网相关文章:
评论前必须登录!
注册