Browse Source
[core] Add overridable game setting functionality (#2963)
[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 <caiooliveirafarias0@gmail.com> Reviewed-by: Maufeat <sahyno1996@gmail.com> Co-authored-by: Kleidis <kleidis1@protonmail.com> Co-committed-by: Kleidis <kleidis1@protonmail.com>pull/3174/head
committed by
crueter
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
4 changed files with 205 additions and 43 deletions
-
2src/core/CMakeLists.txt
-
46src/core/core.cpp
-
140src/core/game_settings.cpp
-
60src/core/game_settings.h
@ -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 <algorithm>
|
||||
|
#include <cctype>
|
||||
|
|
||||
|
#include "common/logging/log.h"
|
||||
|
#include "common/settings.h"
|
||||
|
#include "video_core/renderer_base.h"
|
||||
|
|
||||
|
#if defined(__APPLE__)
|
||||
|
#include <TargetConditionals.h>
|
||||
|
#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<TitleID>(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<int>(env.os), |
||||
|
static_cast<int>(env.vendor), |
||||
|
env.vendor_string); |
||||
|
} |
||||
|
|
||||
|
} // namespace Core::GameSettings
|
||||
@ -0,0 +1,60 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-3.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <array> |
||||
|
#include <cstdint> |
||||
|
#include <string> |
||||
|
|
||||
|
namespace VideoCore { class RendererBase; } |
||||
|
|
||||
|
namespace Core::GameSettings { |
||||
|
|
||||
|
enum class OS { |
||||
|
Windows, |
||||
|
Linux, |
||||
|
MacOS, |
||||
|
IOS, |
||||
|
Android, |
||||
|
FireOS, |
||||
|
HarmonyOS, |
||||
|
FreeBSD, |
||||
|
DragonFlyBSD, |
||||
|
NetBSD, |
||||
|
OpenBSD, |
||||
|
HaikuOS, |
||||
|
AIX, |
||||
|
Managarm, |
||||
|
RedoxOS, |
||||
|
Solaris, |
||||
|
Unknown, |
||||
|
}; |
||||
|
|
||||
|
enum class GPUVendor { |
||||
|
Nvidia, |
||||
|
AMD, |
||||
|
Intel, |
||||
|
Apple, |
||||
|
Qualcomm, |
||||
|
ARM, |
||||
|
Imagination, |
||||
|
Microsoft, |
||||
|
Unknown, |
||||
|
}; |
||||
|
|
||||
|
enum class TitleID : std::uint64_t { |
||||
|
NinjaGaidenRagebound = 0x0100781020710000ULL |
||||
|
}; |
||||
|
|
||||
|
struct EnvironmentInfo { |
||||
|
OS os{OS::Unknown}; |
||||
|
GPUVendor vendor{GPUVendor::Unknown}; |
||||
|
std::string vendor_string; // raw string from driver |
||||
|
}; |
||||
|
|
||||
|
EnvironmentInfo DetectEnvironment(const VideoCore::RendererBase& renderer); |
||||
|
|
||||
|
void LoadOverrides(std::uint64_t program_id, const VideoCore::RendererBase& renderer); |
||||
|
|
||||
|
} // namespace Core::GameSettings |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue