Преглед изворни кода

externals: add adrenotools for bcenabler

Liam пре 3 година
родитељ
комит
f7a3f1ddf4

+ 3 - 0
.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

+ 4 - 0
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()

+ 1 - 0
externals/libadrenotools

@@ -0,0 +1 @@
+Subproject commit a6c0947df6b152b350342f5191b3082768e15e38

+ 4 - 0
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()

+ 30 - 0
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 <adrenotools/bcenabler.h>
+#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<void*>(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);