From b9530ae80f9994f4a10143f8336f2b9bee4416fc Mon Sep 17 00:00:00 2001 From: Kleidis Date: Wed, 17 Dec 2025 03:59:27 +0100 Subject: [core] Add overridable game setting functionality (#2963) Adds a place to override specific game settings for specific vendors Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2963 Reviewed-by: Caio Oliveira Reviewed-by: Maufeat Co-authored-by: Kleidis Co-committed-by: Kleidis --- src/core/game_settings.cpp | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/core/game_settings.cpp (limited to 'src/core/game_settings.cpp') diff --git a/src/core/game_settings.cpp b/src/core/game_settings.cpp new file mode 100644 index 0000000000..da1530e026 --- /dev/null +++ b/src/core/game_settings.cpp @@ -0,0 +1,140 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/game_settings.h" + +#include +#include + +#include "common/logging/log.h" +#include "common/settings.h" +#include "video_core/renderer_base.h" + +#if defined(__APPLE__) +#include +#endif + +namespace Core::GameSettings { + +static GPUVendor GetGPU(const std::string& gpu_vendor_string) { + struct Entry { const char* name; GPUVendor vendor; }; + static constexpr Entry GpuVendor[] = { + // NVIDIA + {"NVIDIA", GPUVendor::Nvidia}, + {"Nouveau", GPUVendor::Nvidia}, + {"NVK", GPUVendor::Nvidia}, + {"Tegra", GPUVendor::Nvidia}, + // AMD + {"AMD", GPUVendor::AMD}, + {"RadeonSI", GPUVendor::AMD}, + {"RADV", GPUVendor::AMD}, + {"AMDVLK", GPUVendor::AMD}, + {"R600", GPUVendor::AMD}, + // Intel + {"Intel", GPUVendor::Intel}, + {"ANV", GPUVendor::Intel}, + {"i965", GPUVendor::Intel}, + {"i915", GPUVendor::Intel}, + {"OpenSWR", GPUVendor::Intel}, + // Apple + {"Apple", GPUVendor::Apple}, + {"MoltenVK", GPUVendor::Apple}, + // Qualcomm / Adreno + {"Qualcomm", GPUVendor::Qualcomm}, + {"Turnip", GPUVendor::Qualcomm}, + // ARM / Mali + {"Mali", GPUVendor::ARM}, + {"PanVK", GPUVendor::ARM}, + // Imagination / PowerVR + {"PowerVR", GPUVendor::Imagination}, + {"PVR", GPUVendor::Imagination}, + // Microsoft / WARP / D3D12 GL + {"D3D12", GPUVendor::Microsoft}, + {"Microsoft", GPUVendor::Microsoft}, + {"WARP", GPUVendor::Microsoft}, + }; + + for (const auto& entry : GpuVendor) { + if (gpu_vendor_string == entry.name) { + return entry.vendor; + } + } + + // legacy (shouldn't be needed anymore, but just in case) + std::string gpu = gpu_vendor_string; + std::transform(gpu.begin(), gpu.end(), gpu.begin(), [](unsigned char c){ return (char)std::tolower(c); }); + if (gpu.find("geforce") != std::string::npos) { + return GPUVendor::Nvidia; + } + if (gpu.find("radeon") != std::string::npos || gpu.find("ati") != std::string::npos) { + return GPUVendor::AMD; + } + + return GPUVendor::Unknown; +} + +static OS DetectOS() { +#if defined(_WIN32) + return OS::Windows; +#elif defined(__FIREOS__) + return OS::FireOS; +#elif defined(__ANDROID__) + return OS::Android; +#elif defined(__OHOS__) + return OS::HarmonyOS; +#elif defined(__HAIKU__) + return OS::HaikuOS; +#elif defined(__DragonFly__) + return OS::DragonFlyBSD; +#elif defined(__NetBSD__) + return OS::NetBSD; +#elif defined(__OpenBSD__) + return OS::OpenBSD; +#elif defined(_AIX) + return OS::AIX; +#elif defined(__managarm__) + return OS::Managarm; +#elif defined(__redox__) + return OS::RedoxOS; +#elif defined(__APPLE__) && defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE + return OS::IOS; +#elif defined(__APPLE__) + return OS::MacOS; +#elif defined(__FreeBSD__) + return OS::FreeBSD; +#elif defined(__sun) && defined(__SVR4) + return OS::Solaris; +#elif defined(__linux__) + return OS::Linux; +#else + return OS::Unknown; +#endif +} + +EnvironmentInfo DetectEnvironment(const VideoCore::RendererBase& renderer) { + EnvironmentInfo env{}; + env.os = DetectOS(); + env.vendor_string = renderer.GetDeviceVendor(); + env.vendor = GetGPU(env.vendor_string); + return env; +} + +void LoadOverrides(std::uint64_t program_id, const VideoCore::RendererBase& renderer) { + const auto env = DetectEnvironment(renderer); + + switch (static_cast(program_id)) { + case TitleID::NinjaGaidenRagebound: + Settings::values.use_squashed_iterated_blend = true; + break; + default: + break; + } + + LOG_INFO(Core, "Applied game settings for title ID {:016X} on OS {}, GPU vendor {} ({})", + program_id, + static_cast(env.os), + static_cast(env.vendor), + env.vendor_string); +} + +} // namespace Core::GameSettings -- cgit v1.2.3