From 5f3ce24e7a530d089842c8192c2565a672555250 Mon Sep 17 00:00:00 2001 From: Charles Giessen Date: Mon, 11 Apr 2022 14:39:06 -0600 Subject: [PATCH] cube,vulkaninfo: Add portability_enumeration if present Make vulkaninfo and vkcube/vkcubepp enable the portability enumeration bit if it is available. --- cube/cube.c | 33 ++++++++++++++++++++++----------- cube/cube.cpp | 8 ++++++++ vulkaninfo/vulkaninfo.h | 13 +++++++++++-- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/cube/cube.c b/cube/cube.c index e0d8a31..8094623 100644 --- a/cube/cube.c +++ b/cube/cube.c @@ -292,16 +292,20 @@ void dumpVec4(const char *note, vec4 vector) { fflush(stdout); } -char const* to_string(VkPhysicalDeviceType const type) -{ - switch(type) - { - case VK_PHYSICAL_DEVICE_TYPE_OTHER: return "Other"; - case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: return "IntegratedGpu"; - case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: return "DiscreteGpu"; - case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: return "VirtualGpu"; - case VK_PHYSICAL_DEVICE_TYPE_CPU: return "Cpu"; - default: return "Unknown"; +char const *to_string(VkPhysicalDeviceType const type) { + switch (type) { + case VK_PHYSICAL_DEVICE_TYPE_OTHER: + return "Other"; + case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: + return "IntegratedGpu"; + case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: + return "DiscreteGpu"; + case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: + return "VirtualGpu"; + case VK_PHYSICAL_DEVICE_TYPE_CPU: + return "Cpu"; + default: + return "Unknown"; } } @@ -1464,7 +1468,6 @@ static void demo_prepare_depth(struct demo *demo) { .viewType = VK_IMAGE_VIEW_TYPE_2D, }; - if (demo->force_errors) { // Intentionally force a bad pNext value to generate a validation layer error view.pNext = ℑ @@ -3178,6 +3181,7 @@ static void demo_init_vk(struct demo *demo) { /* Look for instance extensions */ VkBool32 surfaceExtFound = 0; VkBool32 platformSurfaceExtFound = 0; + bool portabilityEnumerationActive = false; memset(demo->extension_names, 0, sizeof(demo->extension_names)); err = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL); @@ -3241,6 +3245,12 @@ static void demo_init_vk(struct demo *demo) { demo->extension_names[demo->enabled_extension_count++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME; } } + // We want cube to be able to enumerate drivers that support the portability_subset extension, so we have to enable the + // portability enumeration extension. + if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, instance_extensions[i].extensionName)) { + portabilityEnumerationActive = true; + demo->extension_names[demo->enabled_extension_count++] = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME; + } assert(demo->enabled_extension_count < 64); } @@ -3317,6 +3327,7 @@ static void demo_init_vk(struct demo *demo) { VkInstanceCreateInfo inst_info = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, .pNext = NULL, + .flags = (portabilityEnumerationActive ? VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR : 0), .pApplicationInfo = &app, .enabledLayerCount = demo->enabled_layer_count, .ppEnabledLayerNames = (const char *const *)instance_validation_layers, diff --git a/cube/cube.cpp b/cube/cube.cpp index fdba557..03fd65b 100644 --- a/cube/cube.cpp +++ b/cube/cube.cpp @@ -1116,6 +1116,7 @@ void Demo::init_vk() { /* Look for instance extensions */ vk::Bool32 surfaceExtFound = VK_FALSE; vk::Bool32 platformSurfaceExtFound = VK_FALSE; + bool portabilityEnumerationActive = false; auto instance_extensions_return = vk::enumerateInstanceExtensionProperties(); VERIFY(instance_extensions_return.result == vk::Result::eSuccess); @@ -1126,6 +1127,11 @@ void Demo::init_vk() { } else if (!strcmp(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, extension.extensionName)) { use_debug_messenger = true; enabled_instance_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } else if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, extension.extensionName)) { + // We want cube to be able to enumerate drivers that support the portability_subset extension, so we have to enable the + // portability enumeration extension. + portabilityEnumerationActive = true; + enabled_instance_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); } else if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, extension.extensionName)) { surfaceExtFound = 1; enabled_instance_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); @@ -1237,6 +1243,8 @@ void Demo::init_vk() { .setPEngineName(APP_SHORT_NAME) .setEngineVersion(0); auto const inst_info = vk::InstanceCreateInfo() + .setFlags(portabilityEnumerationActive ? vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR + : static_cast(0)) .setPNext((use_debug_messenger && validate) ? &debug_utils_create_info : nullptr) .setPApplicationInfo(&app) .setPEnabledLayerNames(enabled_layers) diff --git a/vulkaninfo/vulkaninfo.h b/vulkaninfo/vulkaninfo.h index c1baba4..087bd91 100644 --- a/vulkaninfo/vulkaninfo.h +++ b/vulkaninfo/vulkaninfo.h @@ -645,8 +645,17 @@ struct AppInstance { std::vector inst_exts; for (const auto &ext : inst_extensions) inst_exts.push_back(ext.c_str()); - const VkInstanceCreateInfo inst_info = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, &dbg_info, 0, &app_info, 0, nullptr, - static_cast(inst_exts.size()), inst_exts.data()}; + const VkInstanceCreateInfo inst_info = { + VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, + &dbg_info, + (CheckExtensionEnabled(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) + ? static_cast(VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR) + : 0), + &app_info, + 0, + nullptr, + static_cast(inst_exts.size()), + inst_exts.data()}; VkResult err = dll.fp_vkCreateInstance(&inst_info, nullptr, &instance); if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { -- 2.7.4