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);
#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<std::string> supportedExtensions;
if (extCount > 0)
{
std::vector<VkExtensionProperties> instanceExtensions(extCount);
vkEnumerateInstanceExtensionProperties(nullptr, &extCount, instanceExtensions.data());
for (const auto &ext : instanceExtensions)
supportedExtensions.emplace(ext.extensionName);
std::vector<VkExtensionProperties> 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);
}
}

View file

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