From 54b5520c1a70111f8f6e1f9f774dd0a713660d6c Mon Sep 17 00:00:00 2001 From: Niram7777 Date: Thu, 2 Oct 2025 21:50:12 +0200 Subject: [PATCH] VK settings activation based on layers (#3691) --- .../renderer_vulkan/vk_platform.cpp | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index 4a6c13de0..7e6849979 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -123,6 +123,36 @@ vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::WindowSDL& e return surface; } +static auto GetLayerExtensions(std::vector&& extensions, + const std::vector& layers) { + auto all_missing_vk_settings = true; + + for (const auto& layer_name : layers) { + const auto [layer_properties_result, layer_extensions] = + vk::enumerateInstanceExtensionProperties(std::string(layer_name)); + if (layer_properties_result != vk::Result::eSuccess) { + LOG_ERROR(Render_Vulkan, "Failed to query extension properties of {}: {}", layer_name, + vk::to_string(layer_properties_result)); + } + auto found = false; + for (const auto& extension : layer_extensions) { + if (extension.extensionName == std::string_view(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME)) { + found = true; + all_missing_vk_settings = false; + } + } + if (!found) { + LOG_ERROR(Render_Vulkan, "Settings for layer {} not available.", layer_name); + } + } + + if (!all_missing_vk_settings) { + extensions.push_back(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME); + } + + return extensions; +} + std::vector GetInstanceExtensions(Frontend::WindowSystemType window_type, bool enable_debug_utils) { const auto [properties_result, properties] = vk::enumerateInstanceExtensionProperties(); @@ -135,7 +165,6 @@ std::vector GetInstanceExtensions(Frontend::WindowSystemType window // Add the windowing system specific extension std::vector extensions; extensions.reserve(7); - extensions.push_back(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME); switch (window_type) { case Frontend::WindowSystemType::Headless: @@ -258,7 +287,8 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e VK_VERSION_MAJOR(TargetVulkanApiVersion), VK_VERSION_MINOR(TargetVulkanApiVersion), VK_VERSION_MAJOR(available_version), VK_VERSION_MINOR(available_version)); - const auto extensions = GetInstanceExtensions(window_type, true); + const auto layers = GetInstanceLayers(enable_validation, enable_crash_diagnostic); + const auto extensions = GetLayerExtensions(GetInstanceExtensions(window_type, true), layers); const vk::ApplicationInfo application_info = { .pApplicationName = "shadPS4", @@ -268,8 +298,6 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e .apiVersion = available_version, }; - const auto layers = GetInstanceLayers(enable_validation, enable_crash_diagnostic); - const std::string extensions_string = fmt::format("{}", fmt::join(extensions, ", ")); const std::string layers_string = fmt::format("{}", fmt::join(layers, ", ")); LOG_INFO(Render_Vulkan, "Enabled instance extensions: {}", extensions_string);