2023-05-31 22:05:06 +00:00
|
|
|
// 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>
|
|
|
|
|
2023-10-01 11:37:04 +00:00
|
|
|
#include "Common/EnumUtils.h"
|
2023-05-31 22:05:06 +00:00
|
|
|
#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);
|
2023-06-12 02:51:49 +00:00
|
|
|
driverId = fmt::format("{}", Common::ToUnderlying(driverProperties.driverID));
|
2023-05-31 22:05:06 +00:00
|
|
|
}
|
|
|
|
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
|
|
|
|
}
|