Vulkan Cookbook 第一章 13 检查可用的队列族及其属性

检查可用的队列族及其属性

译者注:示例代码点击此处

在Vulkan中,当我们想要在硬件上执行操作时,我们将它们提交给队列。 单个队列中的操作将按照提交的顺序一个接一个地处理 - 这就是它被称为队列的原因。 但是,提交到不同队列的操作是独立处理的(如果需要,我们可以同步它们):

不同的队列可以代表硬件的不同部分,因此可以支持不同类型的操作。 并非所有操作都可以在所有队列上执行。

具有相同操作功能的队列将分组到族中。 设备可以暴露任意数量的队列族,并且每个族可以包含一个或多个队列。 要检查可以在给定硬件上执行哪些操作,我们需要查询所有队列族的属性。

怎么做...

1.获取vkEnumeratePhysicalDevices()函数返回的一个物理设备句柄,并将其储存在名为physical_deviceVkPhysicalDevice类型变量中。
2.准备一个名为queue_families_countuint32_t类型变量。
3.调用vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_families_count, nullptr)。第一个参数中提供物理设备句柄,第二个参数应该指向queue_families_count变量,第三个参数设置为nullptr
4.成功调用后,queue_families_count变量将包含所有队列的数量。
5.为队列组及其属性列表准备储存的容器。一个非常方便的解决方案是使用std :: vector类型变量。其元素必须是VkQueueFamilyProperties类型。名称为queue_families
6.调整queue_families大小为queue_families_count个元素。
7.调用vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_families_count, &queue_families[0])。第一个参数和第二个参数应该和第一次调用相同,最后一个参数应该指向queue_families向量的第一个元素。
8.为了确保一切正常,请检查queue_families_count是否大于0,如果成功,所有队列族的属性都将存储在queue_families向量中。

这个怎么运作...

与其他查询类似,前面的内容的实现可以分为两个阶段,首先我们获取给定物理设备上可用的队列组的总数,这是通过调用vkGetPhysicalDeviceQueueFamilyProperties()函数完成的,最后一个参数设置为nullptr:

uint32_t queue_families_count = 0;

vkGetPhysicalDeviceQueueFamilyProperties( physical_device, &queue_families_count, nullptr ); 
if( queue_families_count == 0 ) {
  std::cout << "Could not get the number of queue families." << std::endl;
  return false; 
}

其次,当我们知道有多少个队列组时,我们可以准备足够的内存来储存所有队列的属性。在给出的示例中,我们使用VkQueueFamilyProperties类型的std :: vector类型变量,并将其大小调整为第一个查询返回值。之后,我们第二次执行vkGetPhysicalDeviceQueueFamilyProperties()函数,最后一个参数指向创建的向量的第一个元素。在此向量中,将存储所有可用队列细节。

queue_families.resize( queue_families_count );
vkGetPhysicalDeviceQueueFamilyProperties( physical_device, &queue_families_count, &queue_families[0] );
if( queue_families_count == 0 ) {
  std::cout << "Could not acquire properties of queue families." << std::endl;
  return false; 
}

return true;

我们可以从属性中获得的最重要信息是给定族中队列可以执行的操作类型。队列支持的操作类型分为:
图形:用于创建图形管线和绘图
计算:用于创建计算管道和分配计算着色器
传输:用于非常快速的内存赋值操作
零碎:允许额外的内存管理功能

来自给定组的队列可以支持多种类型的操作,可能还存在不同队列组支持完全相同类型的情况。
族属性还告知我们给定组中可用的队列数量,时间戳支持(用于时间测量)以及图像传输操作的粒度(指定在小图像部分如何拷贝/位块传送(blit))
了解了队列族的数量、属性以及每个组可用的队列数,就可以准备创建逻辑设备了。所有这些信息都是必须的,因为我们不自己创建队列。只是在逻辑设备创建期间请求它们,为此必须指定需要多少队列以及来自哪些族,当创建一个设备时,队列随之自动创建。我们只需要获取所有请求队列的句柄。
译者注:我的理解是这里所说的当创建一个设备时,队列随之自动创建,当创建一个设备应该说的是当创建一个逻辑设备因为物理设备是插在机器上的不需要创建而是直接查找使用,然后在物理设备上创建逻辑设备时,Vulan API会自动为此逻辑设备创建队列。而有哪些队列族又是特定的物理设备规定的,所以要通过物理设备来查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值