Store instance extensions, reworked support check

This commit is contained in:
Sascha Willems 2020-08-27 19:56:02 +02:00
parent 3298455373
commit de61539799
2 changed files with 21 additions and 13 deletions

View file

@ -45,24 +45,31 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation)
instanceExtensions.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME); instanceExtensions.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME);
#endif #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); vkEnumerateInstanceExtensionProperties(nullptr, &extCount, nullptr);
std::unordered_set<std::string> supportedExtensions;
if (extCount > 0) if (extCount > 0)
{ {
std::vector<VkExtensionProperties> instanceExtensions(extCount); std::vector<VkExtensionProperties> extensions(extCount);
vkEnumerateInstanceExtensionProperties(nullptr, &extCount, instanceExtensions.data()); if (vkEnumerateInstanceExtensionProperties(nullptr, &extCount, &extensions.front()) == VK_SUCCESS)
{
for (const auto &ext : instanceExtensions) for (auto ext : extensions)
supportedExtensions.emplace(ext.extensionName); {
supportedInstanceExtensions.push_back(ext.extensionName);
}
}
} }
if (enabledInstanceExtensions.size() > 0) { // Enabled requested instance extensions
for (auto enabledExtension : enabledInstanceExtensions) { if (enabledInstanceExtensions.size() > 0)
if (supportedExtensions.find(enabledExtension) == supportedExtensions.end()) {
std::cerr << enabledExtension << " instance extension support seems to be missing" << std::endl; 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); instanceExtensions.push_back(enabledExtension);
} }
} }

View file

@ -99,6 +99,7 @@ protected:
std::chrono::time_point<std::chrono::high_resolution_clock> lastTimestamp; std::chrono::time_point<std::chrono::high_resolution_clock> lastTimestamp;
// Vulkan instance, stores all per-application states // Vulkan instance, stores all per-application states
VkInstance instance; VkInstance instance;
std::vector<const char*> supportedInstanceExtensions;
// Physical device (GPU) that Vulkan will use // Physical device (GPU) that Vulkan will use
VkPhysicalDevice physicalDevice; VkPhysicalDevice physicalDevice;
// Stores physical device properties (for e.g. checking device limits) // Stores physical device properties (for e.g. checking device limits)