From a8cb72491770cd10ffe70756c1cc1053d0c6c10b Mon Sep 17 00:00:00 2001 From: Warwick Date: Wed, 29 Nov 2023 12:08:21 +0000 Subject: [PATCH] Added layer validation in debug mode --- src/yave_vulkan_instance.cpp | 40 +++++++++++++++++++++++++++++------- src/yave_vulkan_instance.hpp | 3 ++- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/yave_vulkan_instance.cpp b/src/yave_vulkan_instance.cpp index ce44275..ef79899 100644 --- a/src/yave_vulkan_instance.cpp +++ b/src/yave_vulkan_instance.cpp @@ -7,7 +7,6 @@ YaveVulkanInstance::YaveVulkanInstance() { createInstance(); } YaveVulkanInstance::~YaveVulkanInstance() { destroyInstance(); } void YaveVulkanInstance::createInstance() { - checkLayersValidSuppport(); VkApplicationInfo appInfo{}; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName = "Hello Triangle"; @@ -28,7 +27,7 @@ void YaveVulkanInstance::createInstance() { createInfo.enabledExtensionCount = glfwExtensionCount; createInfo.ppEnabledExtensionNames = glfwExtensions; - createInfo.enabledLayerCount = 0; + checkLayersValidSuppport(createInfo); if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) { throw std::runtime_error("failed to create vulkan instance!"); @@ -39,12 +38,39 @@ void YaveVulkanInstance::destroyInstance() { vkDestroyInstance(this->instance, nullptr); } -bool YaveVulkanInstance::checkLayersValidSuppport() { - // Continue if validation is disabled - if (this->enableValidationLayers) { - throw std::runtime_error("validation layers requested, but not available!"); - return false; +bool YaveVulkanInstance::checkLayersValidSuppport( + VkInstanceCreateInfo &createInfo) { + // Finish if validation is disabled (Release mode) + if (!this->enableValidationLayers) { + createInfo.enabledLayerCount = 0; + return true; } + // Get layers + uint32_t layerCount; + vkEnumerateInstanceLayerProperties(&layerCount, nullptr); + std::vector availableLayers(layerCount); + vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); + + // Validate layers + for (const char *layerName : validationLayers) { + bool layerFound = false; + + for (const auto &layerProperties : availableLayers) { + if (strcmp(layerName, layerProperties.layerName) == 0) { + layerFound = true; + break; + } + } + + if (!layerFound) { + return false; + } + } + + return true; + + createInfo.enabledLayerCount = static_cast(validationLayers.size()); + createInfo.ppEnabledLayerNames = validationLayers.data(); return true; } diff --git a/src/yave_vulkan_instance.hpp b/src/yave_vulkan_instance.hpp index 91e69ee..8b93370 100644 --- a/src/yave_vulkan_instance.hpp +++ b/src/yave_vulkan_instance.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -16,7 +17,7 @@ private: void destroyInstance(); // Validation support - bool checkLayersValidSuppport(); + bool checkLayersValidSuppport(VkInstanceCreateInfo &createInfo); const std::vector validationLayers = { "VK_LAYER_KHRONOS_validation"}; #ifdef NDEBUG // Enable Validation in debug mode