2023-06-06 01:31:43 -04:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <string>
|
|
|
|
#include <type_traits>
|
|
|
|
#include <typeindex>
|
2023-06-10 00:44:03 -04:00
|
|
|
#include <typeinfo>
|
2023-06-06 01:31:43 -04:00
|
|
|
#include "common/common_types.h"
|
|
|
|
|
|
|
|
namespace Settings {
|
|
|
|
|
|
|
|
enum class AudioEngine : u32 {
|
|
|
|
Auto,
|
|
|
|
Cubeb,
|
|
|
|
Sdl2,
|
|
|
|
Null,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class AudioMode : u32 {
|
|
|
|
Mono,
|
|
|
|
Stereo,
|
|
|
|
Surround,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class Language : u32 {
|
|
|
|
Japanese,
|
|
|
|
EnglishAmerican,
|
|
|
|
French,
|
|
|
|
German,
|
|
|
|
Italian,
|
|
|
|
Spanish,
|
|
|
|
Chinese,
|
|
|
|
Korean,
|
|
|
|
Dutch,
|
|
|
|
Portuguese,
|
|
|
|
Russian,
|
|
|
|
Taiwanese,
|
|
|
|
EnglishBritish,
|
|
|
|
FrenchCanadian,
|
|
|
|
SpanishLatin,
|
|
|
|
ChineseSimplified,
|
|
|
|
ChineseTraditional,
|
|
|
|
PortugueseBrazilian,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class Region : u32 {
|
|
|
|
Japan,
|
2023-06-07 01:52:23 -04:00
|
|
|
Usa,
|
2023-06-06 01:31:43 -04:00
|
|
|
Europe,
|
|
|
|
Australia,
|
|
|
|
China,
|
|
|
|
Korea,
|
|
|
|
Taiwan,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class TimeZone : u32 {
|
|
|
|
Auto,
|
|
|
|
Default,
|
|
|
|
CET,
|
|
|
|
CST6CDT,
|
|
|
|
Cuba,
|
|
|
|
EET,
|
|
|
|
Egypt,
|
|
|
|
Eire,
|
|
|
|
EST,
|
|
|
|
EST5EDT,
|
|
|
|
GB,
|
|
|
|
GBEire,
|
|
|
|
GMT,
|
|
|
|
GMTPlusZero,
|
|
|
|
GMTMinusZero,
|
|
|
|
GMTZero,
|
|
|
|
Greenwich,
|
|
|
|
Hongkong,
|
|
|
|
HST,
|
|
|
|
Iceland,
|
|
|
|
Iran,
|
|
|
|
Israel,
|
|
|
|
Jamaica,
|
|
|
|
Japan,
|
|
|
|
Kwajalein,
|
|
|
|
Libya,
|
|
|
|
MET,
|
|
|
|
MST,
|
|
|
|
MST7MDT,
|
|
|
|
Navajo,
|
|
|
|
NZ,
|
|
|
|
NZCHAT,
|
|
|
|
Poland,
|
|
|
|
Portugal,
|
|
|
|
PRC,
|
|
|
|
PST8PDT,
|
|
|
|
ROC,
|
|
|
|
ROK,
|
|
|
|
Singapore,
|
|
|
|
Turkey,
|
|
|
|
UCT,
|
|
|
|
Universal,
|
|
|
|
UTC,
|
|
|
|
W_SU,
|
|
|
|
WET,
|
|
|
|
Zulu,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class AnisotropyMode : u32 {
|
|
|
|
Automatic = 0,
|
|
|
|
Default = 1,
|
|
|
|
X2 = 2,
|
|
|
|
X4 = 3,
|
|
|
|
X8 = 4,
|
|
|
|
X16 = 5,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class AstcDecodeMode : u32 {
|
2023-06-07 01:52:23 -04:00
|
|
|
Cpu = 0,
|
|
|
|
Gpu = 1,
|
|
|
|
CpuAsynchronous = 2,
|
2023-06-06 01:31:43 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
enum class AstcRecompression : u32 {
|
|
|
|
Uncompressed = 0,
|
|
|
|
Bc1 = 1,
|
|
|
|
Bc3 = 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class VSyncMode : u32 {
|
|
|
|
Immediate = 0,
|
|
|
|
Mailbox = 1,
|
2023-06-07 01:52:23 -04:00
|
|
|
Fifo = 2,
|
|
|
|
FifoRelaxed = 3,
|
2023-06-06 01:31:43 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
enum class RendererBackend : u32 {
|
|
|
|
OpenGL = 0,
|
|
|
|
Vulkan = 1,
|
|
|
|
Null = 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ShaderBackend : u32 {
|
2023-06-07 01:52:23 -04:00
|
|
|
Glsl = 0,
|
|
|
|
Glasm = 1,
|
|
|
|
SpirV = 2,
|
2023-06-06 01:31:43 -04:00
|
|
|
};
|
|
|
|
|
2023-06-07 01:52:23 -04:00
|
|
|
enum class GpuAccuracy : u32 {
|
2023-06-06 01:31:43 -04:00
|
|
|
Normal = 0,
|
|
|
|
High = 1,
|
|
|
|
Extreme = 2,
|
|
|
|
};
|
|
|
|
|
2023-06-07 01:52:23 -04:00
|
|
|
enum class CpuAccuracy : u32 {
|
2023-06-06 01:31:43 -04:00
|
|
|
Auto = 0,
|
|
|
|
Accurate = 1,
|
|
|
|
Unsafe = 2,
|
|
|
|
Paranoid = 3,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class FullscreenMode : u32 {
|
|
|
|
Borderless = 0,
|
|
|
|
Exclusive = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class NvdecEmulation : u32 {
|
|
|
|
Off = 0,
|
2023-06-07 01:52:23 -04:00
|
|
|
Cpu = 1,
|
|
|
|
Gpu = 2,
|
2023-06-06 01:31:43 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
enum class ResolutionSetup : u32 {
|
|
|
|
Res1_2X = 0,
|
|
|
|
Res3_4X = 1,
|
|
|
|
Res1X = 2,
|
|
|
|
Res3_2X = 3,
|
|
|
|
Res2X = 4,
|
|
|
|
Res3X = 5,
|
|
|
|
Res4X = 6,
|
|
|
|
Res5X = 7,
|
|
|
|
Res6X = 8,
|
|
|
|
Res7X = 9,
|
|
|
|
Res8X = 10,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ScalingFilter : u32 {
|
|
|
|
NearestNeighbor = 0,
|
|
|
|
Bilinear = 1,
|
|
|
|
Bicubic = 2,
|
|
|
|
Gaussian = 3,
|
|
|
|
ScaleForce = 4,
|
|
|
|
Fsr = 5,
|
|
|
|
LastFilter = Fsr,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class AntiAliasing : u32 {
|
|
|
|
None = 0,
|
|
|
|
Fxaa = 1,
|
|
|
|
Smaa = 2,
|
|
|
|
LastAA = Smaa,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class AspectRatio : u32 {
|
|
|
|
R16_9,
|
|
|
|
R4_3,
|
|
|
|
R21_9,
|
|
|
|
R16_10,
|
|
|
|
Stretch,
|
|
|
|
};
|
|
|
|
|
2023-06-07 01:53:05 -04:00
|
|
|
#define X(ENUM, NAME) \
|
|
|
|
{ (#NAME), static_cast<u32>(ENUM::NAME) }
|
|
|
|
|
2023-06-10 00:35:45 -04:00
|
|
|
static const std::map<std::type_index, std::map<std::string, u32>> canonicalizations = {
|
2023-06-06 01:31:43 -04:00
|
|
|
{typeid(AudioEngine),
|
|
|
|
{
|
|
|
|
{"auto", static_cast<u32>(AudioEngine::Auto)},
|
|
|
|
{"cubeb", static_cast<u32>(AudioEngine::Cubeb)},
|
|
|
|
{"sdl2", static_cast<u32>(AudioEngine::Sdl2)},
|
|
|
|
{"null", static_cast<u32>(AudioEngine::Null)},
|
2023-06-07 01:53:05 -04:00
|
|
|
}},
|
|
|
|
{typeid(AudioMode),
|
|
|
|
{
|
|
|
|
X(AudioMode, Mono),
|
|
|
|
X(AudioMode, Stereo),
|
|
|
|
X(AudioMode, Surround),
|
|
|
|
}},
|
|
|
|
{typeid(Language),
|
|
|
|
{
|
|
|
|
X(Language, Japanese),
|
|
|
|
X(Language, EnglishAmerican),
|
|
|
|
X(Language, French),
|
|
|
|
X(Language, German),
|
|
|
|
X(Language, Italian),
|
|
|
|
X(Language, Spanish),
|
|
|
|
X(Language, Chinese),
|
|
|
|
X(Language, Korean),
|
|
|
|
X(Language, Dutch),
|
|
|
|
X(Language, Portuguese),
|
|
|
|
X(Language, Russian),
|
|
|
|
X(Language, Taiwanese),
|
|
|
|
X(Language, EnglishBritish),
|
|
|
|
X(Language, FrenchCanadian),
|
|
|
|
X(Language, SpanishLatin),
|
|
|
|
X(Language, ChineseSimplified),
|
|
|
|
X(Language, ChineseTraditional),
|
|
|
|
X(Language, PortugueseBrazilian),
|
|
|
|
}},
|
|
|
|
{typeid(Region),
|
|
|
|
{
|
|
|
|
X(Region, Japan),
|
|
|
|
X(Region, Usa),
|
|
|
|
X(Region, Europe),
|
|
|
|
X(Region, Australia),
|
|
|
|
X(Region, China),
|
|
|
|
X(Region, Korea),
|
|
|
|
X(Region, Taiwan),
|
|
|
|
}},
|
|
|
|
{typeid(TimeZone),
|
|
|
|
{
|
|
|
|
X(TimeZone, Auto), X(TimeZone, Default), X(TimeZone, CET),
|
|
|
|
X(TimeZone, CST6CDT), X(TimeZone, Cuba), X(TimeZone, EET),
|
|
|
|
X(TimeZone, Egypt), X(TimeZone, Eire), X(TimeZone, EST5EDT),
|
|
|
|
X(TimeZone, GB), X(TimeZone, GBEire), X(TimeZone, GMT),
|
|
|
|
X(TimeZone, GMTPlusZero), X(TimeZone, GMTMinusZero), X(TimeZone, GMTZero),
|
|
|
|
X(TimeZone, Greenwich), X(TimeZone, Hongkong), X(TimeZone, HST),
|
|
|
|
X(TimeZone, Iceland), X(TimeZone, Iran), X(TimeZone, Israel),
|
|
|
|
X(TimeZone, Jamaica), X(TimeZone, Japan), X(TimeZone, Kwajalein),
|
|
|
|
X(TimeZone, Libya), X(TimeZone, MET), X(TimeZone, MST),
|
|
|
|
X(TimeZone, MST7MDT), X(TimeZone, Navajo), X(TimeZone, NZ),
|
|
|
|
X(TimeZone, NZCHAT), X(TimeZone, Poland), X(TimeZone, Portugal),
|
|
|
|
X(TimeZone, PRC), X(TimeZone, ROC), X(TimeZone, ROK),
|
|
|
|
X(TimeZone, Singapore), X(TimeZone, Turkey), X(TimeZone, UCT),
|
|
|
|
X(TimeZone, Universal), X(TimeZone, UTC), X(TimeZone, W_SU),
|
|
|
|
X(TimeZone, WET), X(TimeZone, Zulu),
|
|
|
|
}},
|
|
|
|
{typeid(AnisotropyMode),
|
|
|
|
{
|
|
|
|
X(AnisotropyMode, Automatic),
|
|
|
|
X(AnisotropyMode, Default),
|
|
|
|
X(AnisotropyMode, X2),
|
|
|
|
X(AnisotropyMode, X4),
|
|
|
|
X(AnisotropyMode, X8),
|
|
|
|
X(AnisotropyMode, X16),
|
|
|
|
}},
|
|
|
|
{typeid(AstcDecodeMode),
|
|
|
|
{
|
|
|
|
X(AstcDecodeMode, Cpu),
|
|
|
|
X(AstcDecodeMode, Gpu),
|
|
|
|
X(AstcDecodeMode, CpuAsynchronous),
|
|
|
|
}},
|
|
|
|
{typeid(AstcRecompression),
|
|
|
|
{
|
|
|
|
X(AstcRecompression, Uncompressed),
|
|
|
|
X(AstcRecompression, Bc1),
|
|
|
|
X(AstcRecompression, Bc3),
|
|
|
|
}},
|
|
|
|
{typeid(VSyncMode),
|
|
|
|
{
|
|
|
|
X(VSyncMode, Immediate),
|
|
|
|
X(VSyncMode, Mailbox),
|
|
|
|
X(VSyncMode, Fifo),
|
|
|
|
X(VSyncMode, FifoRelaxed),
|
|
|
|
}},
|
|
|
|
{typeid(RendererBackend),
|
|
|
|
{
|
|
|
|
X(RendererBackend, OpenGL),
|
|
|
|
X(RendererBackend, Vulkan),
|
|
|
|
X(RendererBackend, Null),
|
|
|
|
}},
|
|
|
|
{typeid(ShaderBackend),
|
|
|
|
{
|
|
|
|
X(ShaderBackend, Glsl),
|
|
|
|
X(ShaderBackend, Glasm),
|
|
|
|
X(ShaderBackend, SpirV),
|
|
|
|
}},
|
|
|
|
{typeid(GpuAccuracy),
|
|
|
|
{
|
|
|
|
X(GpuAccuracy, Normal),
|
|
|
|
X(GpuAccuracy, High),
|
|
|
|
X(GpuAccuracy, Extreme),
|
|
|
|
}},
|
|
|
|
{typeid(CpuAccuracy),
|
|
|
|
{
|
|
|
|
X(CpuAccuracy, Auto),
|
|
|
|
X(CpuAccuracy, Accurate),
|
|
|
|
X(CpuAccuracy, Unsafe),
|
|
|
|
X(CpuAccuracy, Paranoid),
|
|
|
|
}},
|
|
|
|
{typeid(FullscreenMode),
|
|
|
|
{
|
|
|
|
X(FullscreenMode, Borderless),
|
|
|
|
X(FullscreenMode, Exclusive),
|
|
|
|
}},
|
|
|
|
{typeid(NvdecEmulation),
|
|
|
|
{
|
|
|
|
X(NvdecEmulation, Off),
|
|
|
|
X(NvdecEmulation, Cpu),
|
|
|
|
X(NvdecEmulation, Gpu),
|
|
|
|
}},
|
|
|
|
{typeid(ResolutionSetup),
|
|
|
|
{
|
|
|
|
X(ResolutionSetup, Res1_2X),
|
|
|
|
X(ResolutionSetup, Res3_4X),
|
|
|
|
X(ResolutionSetup, Res1X),
|
|
|
|
X(ResolutionSetup, Res3_2X),
|
|
|
|
X(ResolutionSetup, Res2X),
|
|
|
|
X(ResolutionSetup, Res3X),
|
|
|
|
X(ResolutionSetup, Res4X),
|
|
|
|
X(ResolutionSetup, Res5X),
|
|
|
|
X(ResolutionSetup, Res6X),
|
|
|
|
X(ResolutionSetup, Res7X),
|
|
|
|
X(ResolutionSetup, Res8X),
|
|
|
|
}},
|
|
|
|
{typeid(ScalingFilter),
|
|
|
|
{
|
|
|
|
X(ScalingFilter, NearestNeighbor),
|
|
|
|
X(ScalingFilter, Bilinear),
|
|
|
|
X(ScalingFilter, Bicubic),
|
|
|
|
X(ScalingFilter, Gaussian),
|
|
|
|
X(ScalingFilter, ScaleForce),
|
|
|
|
X(ScalingFilter, Fsr),
|
|
|
|
}},
|
|
|
|
{typeid(AntiAliasing),
|
|
|
|
{
|
|
|
|
X(AntiAliasing, None),
|
|
|
|
X(AntiAliasing, Fxaa),
|
|
|
|
X(AntiAliasing, Smaa),
|
|
|
|
}},
|
|
|
|
{typeid(AspectRatio),
|
|
|
|
{
|
|
|
|
X(AspectRatio, R16_9),
|
|
|
|
X(AspectRatio, R4_3),
|
|
|
|
X(AspectRatio, R21_9),
|
|
|
|
X(AspectRatio, R16_10),
|
|
|
|
X(AspectRatio, Stretch),
|
2023-06-06 01:31:43 -04:00
|
|
|
}}};
|
|
|
|
|
2023-06-07 01:53:05 -04:00
|
|
|
#undef X
|
|
|
|
|
2023-06-10 00:35:45 -04:00
|
|
|
static const std::string invalid_string{"(invalid setting)"};
|
2023-06-06 01:31:43 -04:00
|
|
|
|
|
|
|
template <typename Type>
|
2023-06-07 01:52:23 -04:00
|
|
|
const std::string& CanonicalizeEnum(Type id) {
|
|
|
|
auto& group = canonicalizations.at(typeid(Type));
|
2023-06-06 01:31:43 -04:00
|
|
|
for (auto& [name, value] : group) {
|
|
|
|
if (static_cast<Type>(value) == id) {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
}
|
2023-06-07 01:52:23 -04:00
|
|
|
return invalid_string;
|
2023-06-06 01:31:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Type>
|
2023-06-07 01:52:23 -04:00
|
|
|
static Type ToEnum(const std::string& canonicalization) {
|
|
|
|
return static_cast<Type>(canonicalizations.at(typeid(Type)).at(canonicalization));
|
2023-06-06 01:31:43 -04:00
|
|
|
}
|
|
|
|
} // namespace Settings
|