// Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "core/GameSettings.h" #include #include #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(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(env.os), static_cast(env.vendor), env.vendor_string); } } // namespace Core::GameSettings