From 062d6259013b65dc0bf3c1492964f3080ae70e25 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sun, 13 Feb 2022 19:50:07 +1000 Subject: [PATCH] Vulkan/Context: Allow non-debug device when validation layers unavailable --- common/Vulkan/Context.cpp | 51 +++++++++++---------------------------- common/Vulkan/Context.h | 3 --- 2 files changed, 14 insertions(+), 40 deletions(-) diff --git a/common/Vulkan/Context.cpp b/common/Vulkan/Context.cpp index 15b82eca45..77cee04055 100644 --- a/common/Vulkan/Context.cpp +++ b/common/Vulkan/Context.cpp @@ -59,41 +59,6 @@ namespace Vulkan Context::~Context() = default; - bool Context::CheckValidationLayerAvailablility() - { - u32 extension_count = 0; - VkResult res = vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr); - if (res != VK_SUCCESS) - { - LOG_VULKAN_ERROR(res, "vkEnumerateInstanceExtensionProperties failed: "); - return false; - } - - std::vector extension_list(extension_count); - res = vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, extension_list.data()); - pxAssert(res == VK_SUCCESS); - - u32 layer_count = 0; - res = vkEnumerateInstanceLayerProperties(&layer_count, nullptr); - if (res != VK_SUCCESS) - { - LOG_VULKAN_ERROR(res, "vkEnumerateInstanceExtensionProperties failed: "); - return false; - } - - std::vector layer_list(layer_count); - res = vkEnumerateInstanceLayerProperties(&layer_count, layer_list.data()); - pxAssert(res == VK_SUCCESS); - - // Check for both VK_EXT_debug_utils and VK_LAYER_LUNARG_standard_validation - return (std::find_if(extension_list.begin(), extension_list.end(), - [](const auto& it) { return strcmp(it.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0; }) != - extension_list.end() && - std::find_if(layer_list.begin(), layer_list.end(), [](const auto& it) { - return strcmp(it.layerName, "VK_LAYER_KHRONOS_validation") == 0; - }) != layer_list.end()); - } - VkInstance Context::CreateVulkanInstance( const WindowInfo* wi, bool enable_debug_utils, bool enable_validation_layer) { @@ -306,8 +271,20 @@ namespace Vulkan VkInstance instance = CreateVulkanInstance(wi, enable_debug_utils, enable_validation_layer); if (instance == VK_NULL_HANDLE) { - Vulkan::UnloadVulkanLibrary(); - return false; + if (enable_debug_utils || enable_validation_layer) + { + // Try again without the validation layer. + enable_debug_utils = false; + enable_validation_layer = false; + instance = CreateVulkanInstance(wi, enable_debug_utils, enable_validation_layer); + if (instance == VK_NULL_HANDLE) + { + Vulkan::UnloadVulkanLibrary(); + return false; + } + + Console.Error("Vulkan validation/debug layers requested but are unavailable. Creating non-debug device."); + } } if (!Vulkan::LoadVulkanInstanceFunctions(instance)) diff --git a/common/Vulkan/Context.h b/common/Vulkan/Context.h index 3acc342d97..bf850ce580 100644 --- a/common/Vulkan/Context.h +++ b/common/Vulkan/Context.h @@ -55,9 +55,6 @@ namespace Vulkan ~Context(); - // Determines if the Vulkan validation layer is available on the system. - static bool CheckValidationLayerAvailablility(); - // Helper method to create a Vulkan instance. static VkInstance CreateVulkanInstance( const WindowInfo* wi, bool enable_debug_utils, bool enable_validation_layer);