Vulkan选择支持显示指定曲面功能的队列家族

选择支持显示指定曲面功能的队列家族
在屏幕上显示图像的操作是通过向设备的队列提交专用命令执行的。我们不能随心所欲地使用队列显示图像,换言之,我们必须将该操作提交给用于显示图像的队列。因为如果不这样做,该操作可能无法得到设备的支持。图像显示、图形、计算、传输、稀疏操作都是队列家族的属性。与其他类型的操作类似,并不是所有队列都支持图像显示操作。更为重要的是,并非所有物理设备都支持图像显示操作。这就是需要查明哪些物理设备的哪些队列家族,能够在屏幕上显示图像的原因。

具体处理过程
(1)通过调用vkEnumeratePhysicalDevices()函数获取物理设备的句柄,将该句柄存储到一个VkPhysicalDevice类型的变量中,将该变量命名为physical_device。
(2)获取已创建的显示曲面,将它的句柄存储在一个VkSurfaceKHR类型的变量中,将该变量命名为presentation_surface。
(3)创建一个元素类型为VkQueueFamilyProperties的std::vector容器变量,将该变量命名为queue_families。
(4)通过physical_device变量,确认该物理设备中所有可用的队列家族。将该操作的结果存储在queue_families变量中。
(5)创建一个uint32_t类型的变量,将其命名为queue_family_index。
(6)创建一个uint32_t类型的变量,将其命名为index。使用该变量循环遍历vector容器queue_families变量中的所有元素,对queue_families变量中的每个元素执行下列处理步骤。
① 创建一个VkBool32类型的变量,将其命名为presentation_supported。将VK_FALSE常量赋予presentation_supported变量。
② 调用vkGetPhysicalDeviceSurfaceSupportKHR(physical_device,index,presentation_surface,&presentation_supported)函数。将第一个参数设置为物理设备的句柄;将第二个参数设置为当前循环的轮次;将第三个参数设置为显示曲面的句柄;将第四个参数设置为指向presentation_supported变量的指针。
③ 检查通过调用vkGetPhysicalDeviceSurfaceSupportKHR()函数获得的值是否等于VK_SUCCESS,以及presentation_supported变量的值是否等于VK_TRUE。如果该条件判断的结果为真,就将当前循环轮次(存储在index变量中)赋予queue_family_index变量并结束循环操作。

具体运行情况
先查明指定物理设备提供了哪些队列家族。

Vulkan选择支持显示指定曲面功能的队列家族
再循环遍历所有可用的队列家族,并找出支持图像显示操作的家族。通过调用vkGetPhysicalDeviceSurfaceSupportKHR()函数可以做到这一点,该函数会将信息存储在我们指定的变量中。如果图像显示操作得到了支持,就将提供支持的队列家族的索引记录下来。该队列家族中的所有队列都会支持图像显示操作。

Vulkan选择支持显示指定曲面功能的队列家族
如果某个物理设备提供的队列家族都不支持图像显示操作,就必须寻找其他支持图像显示操作的物理设备。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战