From f7a3f1ddf49a2471fd92ee92faea61880285b2d5 Mon Sep 17 00:00:00 2001 From: Liam Date: Sun, 1 Jan 2023 18:34:38 -0500 Subject: [PATCH] externals: add adrenotools for bcenabler --- .gitmodules | 3 ++ externals/CMakeLists.txt | 4 +++ externals/libadrenotools | 1 + src/video_core/CMakeLists.txt | 4 +++ .../vulkan_common/vulkan_device.cpp | 30 +++++++++++++++++++ 5 files changed, 42 insertions(+) create mode 160000 externals/libadrenotools diff --git a/.gitmodules b/.gitmodules index 75c7b5fe05..ad7a9b9701 100644 --- a/.gitmodules +++ b/.gitmodules @@ -49,3 +49,6 @@ [submodule "cpp-jwt"] path = externals/cpp-jwt url = https://github.com/arun11299/cpp-jwt.git +[submodule "externals/libadrenotools"] + path = externals/libadrenotools + url = https://github.com/bylaws/libadrenotools diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index d78d101478..2bd7b457a8 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -147,3 +147,7 @@ endif() add_library(stb stb/stb_dxt.cpp) target_include_directories(stb PUBLIC ./stb) + +if (ANDROID) + add_subdirectory(libadrenotools) +endif() diff --git a/externals/libadrenotools b/externals/libadrenotools new file mode 160000 index 0000000000..a6c0947df6 --- /dev/null +++ b/externals/libadrenotools @@ -0,0 +1 @@ +Subproject commit a6c0947df6b152b350342f5191b3082768e15e38 diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 027259f572..05aa5cfe26 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -345,3 +345,7 @@ endif() if (YUZU_ENABLE_LTO) set_property(TARGET video_core PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif() + +if (ANDROID) + target_link_libraries(video_core PRIVATE adrenotools) +endif() diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 9ab8e46a1d..8847c6aa35 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -18,6 +18,10 @@ #include "video_core/vulkan_common/vulkan_device.h" #include "video_core/vulkan_common/vulkan_wrapper.h" +#ifdef ANDROID +#include +#endif + namespace Vulkan { using namespace Common::Literals; namespace { @@ -356,6 +360,32 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR CollectPhysicalMemoryInfo(); CollectToolingInfo(); +#ifdef ANDROID + if (is_adreno) { + LOG_WARNING(Render_Vulkan, "Adreno drivers have broken VK_EXT_extended_dynamic_state"); + extensions.extended_dynamic_state = false; + loaded_extensions.erase(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); + + // Patch the driver to enable BCn textures. + const auto major = (properties.properties.driverVersion >> 24) << 2; + const auto minor = (properties.properties.driverVersion >> 12) & 0xFFFU; + const auto vendor = properties.properties.vendorID; + const auto patch_status = adrenotools_get_bcn_type(major, minor, vendor); + + if (patch_status == ADRENOTOOLS_BCN_PATCH) { + LOG_INFO(Render_Vulkan, "Patching Adreno driver to support BCn texture formats"); + if (!adrenotools_patch_bcn( + reinterpret_cast(dld.vkGetPhysicalDeviceFormatProperties))) { + LOG_ERROR(Render_Vulkan, "Patch failed! Driver code may now crash"); + } + } else if (patch_status == ADRENOTOOLS_BCN_BLOB) { + LOG_INFO(Render_Vulkan, "Adreno driver supports BCn textures without patches"); + } else { + LOG_WARNING(Render_Vulkan, "Adreno driver can't be patched to enable BCn textures"); + } + } +#endif // ANDROID + if (is_nvidia) { const u32 nv_major_version = (properties.properties.driverVersion >> 22) & 0x3ff; const auto arch = GetNvidiaArchitecture(physical, supported_extensions);