From de61539799647941354e2c3db2bf304cfb833b74 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Thu, 27 Aug 2020 19:56:02 +0200 Subject: [PATCH] Store instance extensions, reworked support check --- base/vulkanexamplebase.cpp | 33 ++++++++++++++++++++------------- base/vulkanexamplebase.h | 1 + 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index f4d5e1bb..a6069aac 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -45,24 +45,31 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation) instanceExtensions.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME); #endif - std::uint32_t extCount = 0; + // Get extensions supported by the instance and store for later use + uint32_t extCount = 0; vkEnumerateInstanceExtensionProperties(nullptr, &extCount, nullptr); - - std::unordered_set supportedExtensions; if (extCount > 0) { - std::vector instanceExtensions(extCount); - vkEnumerateInstanceExtensionProperties(nullptr, &extCount, instanceExtensions.data()); - - for (const auto &ext : instanceExtensions) - supportedExtensions.emplace(ext.extensionName); + std::vector extensions(extCount); + if (vkEnumerateInstanceExtensionProperties(nullptr, &extCount, &extensions.front()) == VK_SUCCESS) + { + for (auto ext : extensions) + { + supportedInstanceExtensions.push_back(ext.extensionName); + } + } } - if (enabledInstanceExtensions.size() > 0) { - for (auto enabledExtension : enabledInstanceExtensions) { - if (supportedExtensions.find(enabledExtension) == supportedExtensions.end()) - std::cerr << enabledExtension << " instance extension support seems to be missing" << std::endl; - + // Enabled requested instance extensions + if (enabledInstanceExtensions.size() > 0) + { + for (auto enabledExtension : enabledInstanceExtensions) + { + // Output message if requested extension is not available + if (std::find(supportedInstanceExtensions.begin(), supportedInstanceExtensions.end(), enabledExtension) == supportedInstanceExtensions.end()) + { + std::cerr << "Enabled instance extension \"" << enabledExtension << "\" is not present at instance level\n"; + } instanceExtensions.push_back(enabledExtension); } } diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index c402f6b7..f115e394 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -99,6 +99,7 @@ protected: std::chrono::time_point lastTimestamp; // Vulkan instance, stores all per-application states VkInstance instance; + std::vector supportedInstanceExtensions; // Physical device (GPU) that Vulkan will use VkPhysicalDevice physicalDevice; // Stores physical device properties (for e.g. checking device limits)