选择支持给定表面呈现(presentation)的队列族
译者注:示例代码点击此处
通过向设备的队列提交特殊命令来执行在屏幕上显示图像。 我们无法使用任意队列显示图像,因为它可能不受支持。 图像呈现以及图形,计算,传输和稀疏操作是队列族的另一个属性。 与所有类型的操作类似,并非所有队列都支持它,更重要的是,甚至并非所有设备都支持它。 这就是为什么我们需要检查哪个物理设备允许我们在屏幕上显示图像的队列族。
怎么做...
1.获取由vkEnumeratePhysicalDevices()函数返回的物理设备句柄。将其储存在名为physical_device的VkPhysicalDevice类型变量中。
2.获取创建的呈现(presentation)表面并将其句柄储存在名为presentation_surface的VkSurfaceKHR类型变量中。
3.准备一个元素为VkQueueFamilyProperties类型的std::vector类型的变量,名为queue_families。
4.枚举physical_device变量表示的物理设备上可用的所有队列族(请参阅检查可用的队列族及其属性)。将此操作的结果储存在queue_families变量中。
5.准备名为queue_family_index的uint32_t类型变量。
6.准备名为index的uint32_t类型的变量。使用它来遍历queue_families向量的所有元素,对于queue_families变量的每个元素,请执行以下步骤:
1.准备名为presentation_supported的VkBool32类型的变量。为此变量分配VK_FALSE值。
2.调用vkGetPhysicalDeviceSurfaceSupportKHR(physical_device, index, presentation_surface, &presentation_supported)。第一个参数提供物理设备句柄,第二个参数提供当前循环迭代的索引,以及在第三个参数中提供呈现表面的句柄,最后一个参数提供指向presentation_supported变量的指针。
3.检查vkGetPhysicalDeviceSurfaceSupportKHR()函数返回的值是否等于VK_SUCCESS以及presentation_supported变量值是否等于VK_TRUE。如果是,则讲当前循环迭代(索引变量)的值储存在queue_family_index变量中完成循环。
这个怎么运作...
首先,我们需要检查给定物理设备公开的队列族。 此操作的执行方式与第1章实例和设备中的检查可用的队列族及其属性中所述的相同:
std::vector<VkQueueFamilyProperties> queue_families;
if( !CheckAvailableQueueFamiliesAndTheirProperties( physical_device, queue_families ) ) {
return false;
}
接下来,我们可以迭代所有可用的队列族,并检查给定族是否支持图像显示。 这是通过调用vkGetPhysicalDeviceSurfaceSupportKHR()函数来执行的,该函数将信息存储在指定的变量中。 如果支持图像显示,我们可以记住给定族的索引。 该族的所有队列都支持图像显示:
for( uint32_t index = 0; index < static_cast<uint32_t>(queue_families.size()); ++index ) {
VkBool32 presentation_supported = VK_FALSE;
VkResult result = VkResult result = vkGetPhysicalDeviceSurfaceSupportKHR( physical_device, index, presentation_surface, &presentation_supported );
if( (VK_SUCCESS == result) && (VK_TRUE == presentation_supported) ) {
queue_family_index = index;
return true;
}
}
return false;
当没有支持图像显示的给定物理设备导出的队列族时,我们必须检查此操作是否在另一个物理设备上可用。