Merge pull request #11470 from GPUCode/bundle-vvl
android: Add option to bundle validation layer
This commit is contained in:
		| @@ -49,6 +49,8 @@ option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}") | ||||
|  | ||||
| option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON) | ||||
|  | ||||
| option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON) | ||||
|  | ||||
| CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Compile LDN room server" ON "NOT ANDROID" OFF) | ||||
|  | ||||
| CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile Windows crash dump (Minidump) support" OFF "WIN32" OFF) | ||||
| @@ -77,6 +79,24 @@ if (ANDROID OR WIN32 OR APPLE) | ||||
| endif() | ||||
| option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) | ||||
|  | ||||
| if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) | ||||
|     set(vvl_version "sdk-1.3.261.1") | ||||
|     set(vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip") | ||||
|     if (NOT EXISTS "${vvl_zip_file}") | ||||
|         # Download and extract validation layer release to externals directory | ||||
|         set(vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download") | ||||
|         file(DOWNLOAD "${vvl_base_url}/${vvl_version}/android-binaries-${vvl_version}-android.zip" | ||||
|             "${vvl_zip_file}" SHOW_PROGRESS) | ||||
|         execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}" | ||||
|                         WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") | ||||
|     endif() | ||||
|  | ||||
|     # Copy the arm64 binary to src/android/app/main/jniLibs | ||||
|     set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/") | ||||
|     file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so" | ||||
|             DESTINATION "${vvl_lib_path}") | ||||
| endif() | ||||
|  | ||||
| # On Android, fetch and compile libcxx before doing anything else | ||||
| if (ANDROID) | ||||
|     set(CMAKE_SKIP_INSTALL_RULES ON) | ||||
|   | ||||
| @@ -66,21 +66,6 @@ std::string BuildCommaSeparatedExtensions( | ||||
|     return fmt::format("{}", fmt::join(available_extensions, ",")); | ||||
| } | ||||
|  | ||||
| DebugCallback MakeDebugCallback(const vk::Instance& instance, const vk::InstanceDispatch& dld) { | ||||
|     if (!Settings::values.renderer_debug) { | ||||
|         return DebugCallback{}; | ||||
|     } | ||||
|     const std::optional properties = vk::EnumerateInstanceExtensionProperties(dld); | ||||
|     const auto it = std::ranges::find_if(*properties, [](const auto& prop) { | ||||
|         return std::strcmp(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, prop.extensionName) == 0; | ||||
|     }); | ||||
|     if (it != properties->end()) { | ||||
|         return CreateDebugUtilsCallback(instance); | ||||
|     } else { | ||||
|         return CreateDebugReportCallback(instance); | ||||
|     } | ||||
| } | ||||
|  | ||||
| } // Anonymous namespace | ||||
|  | ||||
| Device CreateDevice(const vk::Instance& instance, const vk::InstanceDispatch& dld, | ||||
| @@ -103,7 +88,8 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_, | ||||
|       cpu_memory(cpu_memory_), gpu(gpu_), library(OpenLibrary(context.get())), | ||||
|       instance(CreateInstance(*library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type, | ||||
|                               Settings::values.renderer_debug.GetValue())), | ||||
|       debug_callback(MakeDebugCallback(instance, dld)), | ||||
|       debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance) | ||||
|                                                       : vk::DebugUtilsMessenger{}), | ||||
|       surface(CreateSurface(instance, render_window.GetWindowInfo())), | ||||
|       device(CreateDevice(instance, dld, *surface)), memory_allocator(device), state_tracker(), | ||||
|       scheduler(device, state_tracker), | ||||
|   | ||||
| @@ -35,8 +35,6 @@ class GPU; | ||||
|  | ||||
| namespace Vulkan { | ||||
|  | ||||
| using DebugCallback = std::variant<vk::DebugUtilsMessenger, vk::DebugReportCallback>; | ||||
|  | ||||
| Device CreateDevice(const vk::Instance& instance, const vk::InstanceDispatch& dld, | ||||
|                     VkSurfaceKHR surface); | ||||
|  | ||||
| @@ -75,7 +73,7 @@ private: | ||||
|     vk::InstanceDispatch dld; | ||||
|  | ||||
|     vk::Instance instance; | ||||
|     DebugCallback debug_callback; | ||||
|     vk::DebugUtilsMessenger debug_messenger; | ||||
|     vk::SurfaceKHR surface; | ||||
|  | ||||
|     ScreenInfo screen_info; | ||||
|   | ||||
| @@ -63,22 +63,6 @@ VkBool32 DebugUtilCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, | ||||
|     return VK_FALSE; | ||||
| } | ||||
|  | ||||
| VkBool32 DebugReportCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, | ||||
|                              uint64_t object, size_t location, int32_t messageCode, | ||||
|                              const char* pLayerPrefix, const char* pMessage, void* pUserData) { | ||||
|     const VkDebugReportFlagBitsEXT severity = static_cast<VkDebugReportFlagBitsEXT>(flags); | ||||
|     const std::string_view message{pMessage}; | ||||
|     if (severity & VK_DEBUG_REPORT_ERROR_BIT_EXT) { | ||||
|         LOG_CRITICAL(Render_Vulkan, "{}", message); | ||||
|     } else if (severity & VK_DEBUG_REPORT_WARNING_BIT_EXT) { | ||||
|         LOG_WARNING(Render_Vulkan, "{}", message); | ||||
|     } else if (severity & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { | ||||
|         LOG_INFO(Render_Vulkan, "{}", message); | ||||
|     } else if (severity & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { | ||||
|         LOG_DEBUG(Render_Vulkan, "{}", message); | ||||
|     } | ||||
|     return VK_FALSE; | ||||
| } | ||||
| } // Anonymous namespace | ||||
|  | ||||
| vk::DebugUtilsMessenger CreateDebugUtilsCallback(const vk::Instance& instance) { | ||||
| @@ -98,15 +82,4 @@ vk::DebugUtilsMessenger CreateDebugUtilsCallback(const vk::Instance& instance) { | ||||
|     }); | ||||
| } | ||||
|  | ||||
| vk::DebugReportCallback CreateDebugReportCallback(const vk::Instance& instance) { | ||||
|     return instance.CreateDebugReportCallback({ | ||||
|         .sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, | ||||
|         .pNext = nullptr, | ||||
|         .flags = VK_DEBUG_REPORT_DEBUG_BIT_EXT | VK_DEBUG_REPORT_INFORMATION_BIT_EXT | | ||||
|                  VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, | ||||
|         .pfnCallback = DebugReportCallback, | ||||
|         .pUserData = nullptr, | ||||
|     }); | ||||
| } | ||||
|  | ||||
| } // namespace Vulkan | ||||
|   | ||||
| @@ -9,6 +9,4 @@ namespace Vulkan { | ||||
|  | ||||
| vk::DebugUtilsMessenger CreateDebugUtilsCallback(const vk::Instance& instance); | ||||
|  | ||||
| vk::DebugReportCallback CreateDebugReportCallback(const vk::Instance& instance); | ||||
|  | ||||
| } // namespace Vulkan | ||||
|   | ||||
| @@ -76,11 +76,9 @@ namespace { | ||||
|         extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); | ||||
|     } | ||||
| #endif | ||||
|     if (enable_validation) { | ||||
|         const bool debug_utils = | ||||
|             AreExtensionsSupported(dld, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME}); | ||||
|         extensions.push_back(debug_utils ? VK_EXT_DEBUG_UTILS_EXTENSION_NAME | ||||
|                                          : VK_EXT_DEBUG_REPORT_EXTENSION_NAME); | ||||
|     if (enable_validation && | ||||
|         AreExtensionsSupported(dld, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME})) { | ||||
|         extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); | ||||
|     } | ||||
|     return extensions; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user