diff options
Diffstat (limited to 'Source/Android/jni/GpuDriver.cpp')
| -rw-r--r-- | Source/Android/jni/GpuDriver.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/Source/Android/jni/GpuDriver.cpp b/Source/Android/jni/GpuDriver.cpp new file mode 100644 index 0000000000..0631ce81cb --- /dev/null +++ b/Source/Android/jni/GpuDriver.cpp @@ -0,0 +1,147 @@ +// Copyright 2023 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Based on: Skyline Emulator Project +// SPDX-License-Identifier: MPL-2.0 +// Copyright © 2022 Skyline Team and Contributors (https://github.com/skyline-emu/) + +#include <jni.h> + +#include "Common/IniFile.h" +#include "jni/AndroidCommon/AndroidCommon.h" +#include "jni/AndroidCommon/IDCache.h" + +#include <dlfcn.h> +#include <fcntl.h> +#include <jni.h> +#include <unistd.h> +#include "adrenotools/driver.h" + +#include "VideoBackends/Vulkan/VulkanContext.h" +#include "VideoBackends/Vulkan/VulkanLoader.h" + +extern "C" { + +#if defined(_M_ARM_64) + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_getSystemDriverInfo(JNIEnv* env, + jobject) +{ + if (!Vulkan::LoadVulkanLibrary(true)) + { + return nullptr; + } + + u32 vk_api_version = 0; + VkInstance instance = Vulkan::VulkanContext::CreateVulkanInstance(WindowSystemType::Headless, + false, false, &vk_api_version); + if (!instance) + { + return nullptr; + } + + if (!Vulkan::LoadVulkanInstanceFunctions(instance)) + { + vkDestroyInstance(instance, nullptr); + return nullptr; + } + + Vulkan::VulkanContext::GPUList gpu_list = Vulkan::VulkanContext::EnumerateGPUs(instance); + + if (gpu_list.empty()) + { + vkDestroyInstance(instance, nullptr); + Vulkan::UnloadVulkanLibrary(); + return nullptr; + } + + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties(gpu_list.front(), &properties); + + std::string driverId; + if (vkGetPhysicalDeviceProperties2 && vk_api_version >= VK_VERSION_1_1) + { + VkPhysicalDeviceDriverProperties driverProperties; + driverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; + driverProperties.pNext = nullptr; + VkPhysicalDeviceProperties2 properties2; + properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + properties2.pNext = &driverProperties; + vkGetPhysicalDeviceProperties2(gpu_list.front(), &properties2); + driverId = fmt::format("{}", driverProperties.driverID); + } + else + { + driverId = "Unknown"; + } + + std::string driverVersion = + fmt::format("{}.{}.{}", VK_API_VERSION_MAJOR(properties.driverVersion), + VK_API_VERSION_MINOR(properties.driverVersion), + VK_API_VERSION_PATCH(properties.driverVersion)); + + vkDestroyInstance(instance, nullptr); + Vulkan::UnloadVulkanLibrary(); + + auto array = env->NewObjectArray(2, env->FindClass("java/lang/String"), nullptr); + env->SetObjectArrayElement(array, 0, ToJString(env, driverId)); + env->SetObjectArrayElement(array, 1, ToJString(env, driverVersion)); + return array; +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_supportsCustomDriverLoading( + JNIEnv* env, jobject instance) +{ + // If the KGSL device exists custom drivers can be loaded using adrenotools + return Vulkan::SupportsCustomDriver(); +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_supportsForceMaxGpuClocks( + JNIEnv* env, jobject instance) +{ + // If the KGSL device exists adrenotools can be used to set GPU turbo mode + return Vulkan::SupportsCustomDriver(); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_forceMaxGpuClocks( + JNIEnv* env, jobject instance, jboolean enable) +{ + adrenotools_set_turbo(enable); +} + +#else + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_getSystemDriverInfo( + JNIEnv* env, jobject instance) +{ + auto array = env->NewObjectArray(0, env->FindClass("java/lang/String"), nullptr); + return array; +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_supportsCustomDriverLoading( + JNIEnv* env, jobject instance) +{ + return false; +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_supportsForceMaxGpuClocks( + JNIEnv* env, jobject instance) +{ + return false; +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_utils_GpuDriverHelper_00024Companion_forceMaxGpuClocks( + JNIEnv* env, jobject instance, jboolean enable) +{ +} + +#endif +} |
