diff options
| author | Charles Giessen <charles@lunarg.com> | 2024-09-27 14:53:08 -0500 |
|---|---|---|
| committer | Charles Giessen <46324611+charles-lunarg@users.noreply.github.com> | 2024-09-27 14:42:28 -0600 |
| commit | 1626752592910fc4fdb33a239c93056b29cf7d31 (patch) | |
| tree | 04049ec759551725b88d67b02ae3d65ae50c4e5b | |
| parent | 961b9e7a9e62bbd688bd85b58541d66a7f2acc55 (diff) | |
| download | usermoji-1626752592910fc4fdb33a239c93056b29cf7d31.tar.xz | |
vulkaninfo: Correctly query per-surface queue support
The previous implementation did not differentiate when a single queue
supported a specific surface. It will now print 'true' if all surfaces
support presentation with a queue, 'false' if none, and otherwise prints
each surface type's support if they aren't uniform in value.
This makes the info regarding which queue supports presentation on a
surface much easier to validate the correctness of.
| -rw-r--r-- | vulkaninfo/vulkaninfo.cpp | 14 | ||||
| -rw-r--r-- | vulkaninfo/vulkaninfo.h | 24 |
2 files changed, 19 insertions, 19 deletions
diff --git a/vulkaninfo/vulkaninfo.cpp b/vulkaninfo/vulkaninfo.cpp index 09030a0d..08eb80bf 100644 --- a/vulkaninfo/vulkaninfo.cpp +++ b/vulkaninfo/vulkaninfo.cpp @@ -396,17 +396,19 @@ void GpuDumpQueueProps(Printer &p, AppGpu &gpu, const AppQueueFamilyProperties & p.PrintKeyString("queueFlags", VkQueueFlagsString(props.queueFlags)); p.PrintKeyValue("timestampValidBits", props.timestampValidBits); - if (queue.is_present_platform_agnostic) { - p.PrintKeyString("present support", queue.platforms_support_present ? "true" : "false"); + if (!queue.can_present) { + p.PrintKeyString("present support", "false"); + } else if (queue.can_always_present) { + p.PrintKeyString("present support", "true"); } else { size_t width = 0; - for (auto &surface : gpu.inst.surface_extensions) { - if (surface.name.size() > width) width = surface.name.size(); + for (const auto &support : queue.present_support) { + if (support.first.size() > width) width = support.first.size(); } ObjectWrapper obj_present_support(p, "present support"); p.SetMinKeyWidth(width); - for (auto &surface : gpu.inst.surface_extensions) { - p.PrintKeyString(surface.name, surface.supports_present ? "true" : "false"); + for (const auto &support : queue.present_support) { + p.PrintKeyString(support.first, support.second ? "true" : "false"); } } chain_iterator_queue_properties2(p, gpu, queue.pNext); diff --git a/vulkaninfo/vulkaninfo.h b/vulkaninfo/vulkaninfo.h index 7b2e2265..815d24e0 100644 --- a/vulkaninfo/vulkaninfo.h +++ b/vulkaninfo/vulkaninfo.h @@ -321,11 +321,8 @@ struct SurfaceExtension { VkSurfaceKHR (*create_surface)(AppInstance &) = nullptr; void (*destroy_window)(AppInstance &) = nullptr; VkSurfaceKHR surface = VK_NULL_HANDLE; - VkBool32 supports_present = 0; - bool operator==(const SurfaceExtension &other) { - return name == other.name && surface == other.surface && supports_present == other.supports_present; - } + bool operator==(const SurfaceExtension &other) { return name == other.name && surface == other.surface; } }; class APIVersion { @@ -1398,21 +1395,22 @@ struct AppQueueFamilyProperties { VkQueueFamilyProperties props; uint32_t queue_index; void *pNext = nullptr; // assumes the lifetime of the pNext chain outlives this object, eg parent object must keep both alive - bool is_present_platform_agnostic = true; - VkBool32 platforms_support_present = VK_FALSE; + bool can_present = false; + bool can_always_present = true; + std::vector<std::pair<std::string, VkBool32>> present_support; AppQueueFamilyProperties(AppInstance &inst, VkPhysicalDevice physical_device, VkQueueFamilyProperties family_properties, uint32_t queue_index, void *pNext = nullptr) : props(family_properties), queue_index(queue_index), pNext(pNext) { - for (auto &surface_ext : inst.surface_extensions) { + for (const auto &surface_ext : inst.surface_extensions) { + present_support.push_back({surface_ext.name, VK_FALSE}); VkResult err = vkGetPhysicalDeviceSurfaceSupportKHR(physical_device, queue_index, surface_ext.surface, - &surface_ext.supports_present); + &present_support.back().second); if (err) THROW_VK_ERR("vkGetPhysicalDeviceSurfaceSupportKHR", err); - - const bool first = (surface_ext == inst.surface_extensions.at(0)); - if (!first && platforms_support_present != surface_ext.supports_present) { - is_present_platform_agnostic = false; + if (present_support.back().second) { + can_present = true; + } else { + can_always_present = false; } - platforms_support_present = surface_ext.supports_present; } } }; |
