committed by
Kleidis
4 changed files with 171 additions and 45 deletions
-
2src/core/CMakeLists.txt
-
119src/core/GameSettings.cpp
-
50src/core/GameSettings.h
-
45src/core/core.cpp
@ -0,0 +1,119 @@ |
|||||
|
// Copyright 2025 Eden Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
|
||||
|
#include "core/GameSettings.h"
|
||||
|
|
||||
|
#include <algorithm>
|
||||
|
#include <cctype>
|
||||
|
|
||||
|
#include "common/logging/log.h"
|
||||
|
#include "common/settings.h"
|
||||
|
#include "video_core/renderer_base.h"
|
||||
|
|
||||
|
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(__ANDROID__)
|
||||
|
return OS::Android; |
||||
|
#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::SuperMario3DWorld: |
||||
|
// examples
|
||||
|
/*if (env.os == OS::Android || env.vendor == GPUVendor::ARM) {
|
||||
|
Settings::values.aspect_ratio = Settings::AspectRatio::R21_9; |
||||
|
} |
||||
|
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,50 @@ |
|||||
|
// 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, |
||||
|
Android, |
||||
|
FreeBSD, |
||||
|
Solaris, |
||||
|
Unknown, |
||||
|
}; |
||||
|
|
||||
|
enum class GPUVendor { |
||||
|
Nvidia, |
||||
|
AMD, |
||||
|
Intel, |
||||
|
Apple, |
||||
|
Qualcomm, |
||||
|
ARM, |
||||
|
Imagination, |
||||
|
Microsoft, |
||||
|
Unknown, |
||||
|
}; |
||||
|
|
||||
|
enum class TitleID : std::uint64_t { |
||||
|
SuperMario3DWorld = 0x010028600EBDA000ULL, |
||||
|
}; |
||||
|
|
||||
|
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