diff --git a/.ci/windows/install-msvc.ps1 b/.ci/windows/install-msvc.ps1
index b88f727ed8..788b2848ad 100755
--- a/.ci/windows/install-msvc.ps1
+++ b/.ci/windows/install-msvc.ps1
@@ -10,7 +10,7 @@ if (-not ([bool](net session 2>$null))) {
}
$VSVer = "17"
-$ExeFile = "vs_BuildTools.exe"
+$ExeFile = "vs_community.exe"
$Uri = "https://aka.ms/vs/$VSVer/release/$ExeFile"
$Destination = "./$ExeFile"
@@ -19,21 +19,39 @@ $WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile($Uri, $Destination)
Write-Host "Finished downloading $ExeFile"
-$VSROOT = "C:/VSBuildTools/$VSVer"
$Arguments = @(
- "--installPath `"$VSROOT`"", # set custom installation path
- "--quiet", # suppress UI
- "--wait", # wait for installation to complete
- "--norestart", # prevent automatic restart
- "--add Microsoft.VisualStudio.Workload.VCTools", # add C++ build tools workload
- "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64", # add core x86/x64 C++ tools
- "--add Microsoft.VisualStudio.Component.Windows10SDK.19041" # add specific Windows SDK
+ "--quiet", # Suppress installer UI
+ "--wait", # Wait for installation to complete
+ "--norestart", # Prevent automatic restart
+ "--force", # Force installation even if components are already installed
+ "--add Microsoft.VisualStudio.Workload.NativeDesktop", # Desktop development with C++
+ "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64", # Core C++ compiler/tools for x86/x64
+ "--add Microsoft.VisualStudio.Component.Windows11SDK.26100",# Windows 11 SDK (26100)
+ "--add Microsoft.VisualStudio.Component.Windows10SDK.19041",# Windows 10 SDK (19041)
+ "--add Microsoft.VisualStudio.Component.VC.Llvm.Clang", # LLVM Clang compiler
+ "--add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset", # LLVM Clang integration toolset
+ "--add Microsoft.VisualStudio.Component.Windows11SDK.22621",# Windows 11 SDK (22621)
+ "--add Microsoft.VisualStudio.Component.VC.CMake.Project", # CMake project support
+ "--add Microsoft.VisualStudio.ComponentGroup.VC.Tools.142.x86.x64", # VC++ 14.2 toolset
+ "--add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Llvm.Clang" # LLVM Clang for native desktop
)
Write-Host "Installing Visual Studio Build Tools"
-$InstallProcess = Start-Process -FilePath $Destination -NoNewWindow -PassThru -Wait -ArgumentList $Arguments
-$ExitCode = $InstallProcess.ExitCode
+$InstallProcess = Start-Process -FilePath $Destination -NoNewWindow -PassThru -ArgumentList $Arguments
+# Spinner while installing
+$Spinner = "|/-\"
+$i = 0
+while (-not $InstallProcess.HasExited) {
+ Write-Host -NoNewline ("`rInstalling... " + $Spinner[$i % $Spinner.Length])
+ Start-Sleep -Milliseconds 250
+ $i++
+}
+
+# Clear spinner line
+Write-Host "`rSetup completed! "
+
+$ExitCode = $InstallProcess.ExitCode
if ($ExitCode -ne 0) {
Write-Host "Error installing Visual Studio Build Tools (Error: $ExitCode)"
Exit $ExitCode
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ef3c0bef6e..f5d7126f92 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -895,13 +895,13 @@ if (MSVC AND CXX_CLANG)
endif()
if (YUZU_USE_FASTER_LD)
+ # fallback if everything fails (bfd)
+ set(LINKER bfd)
# clang should always use lld
find_program(LLD lld)
-
if (LLD)
set(LINKER lld)
endif()
-
# GNU appears to work better with mold
# TODO: mold has been slow lately, see if better options exist (search for gold?)
if (CXX_GCC)
@@ -910,7 +910,6 @@ if (YUZU_USE_FASTER_LD)
set(LINKER mold)
endif()
endif()
-
message(NOTICE "Selecting ${LINKER} as linker")
add_link_options("-fuse-ld=${LINKER}")
endif()
diff --git a/docs/Deps.md b/docs/Deps.md
index cfc6f0365b..0e7b7cff62 100644
--- a/docs/Deps.md
+++ b/docs/Deps.md
@@ -4,8 +4,8 @@ To build Eden, you MUST have a C++ compiler.
* On Linux, this is usually [GCC](https://gcc.gnu.org/) 11+ or [Clang](https://clang.llvm.org/) v14+
- GCC 12 also requires Clang 14+
* On Windows, this is either:
- - **[MSVC](https://visualstudio.microsoft.com/downloads/)**,
- * *A convenience script to install the **minimal** version (Visual Build Tools) is provided in `.ci/windows/install-msvc.ps1`*
+ - **[MSVC](https://visualstudio.microsoft.com/downloads/)** (you should select *Community* option),
+ * *A convenience script to install the Visual Community Studio 2022 with necessary tools is provided in `.ci/windows/install-msvc.ps1`*
- clang-cl - can be downloaded from the MSVC installer,
- or **[MSYS2](https://www.msys2.org)**
* On macOS, this is Apple Clang
@@ -211,4 +211,4 @@ Then install the libraries: `sudo pkg install qt6 boost glslang libzip library/l
## All Done
-You may now return to the **[root build guide](Build.md)**.
\ No newline at end of file
+You may now return to the **[root build guide](Build.md)**.
diff --git a/docs/Development.md b/docs/Development.md
index 1ed75a7c23..c223409243 100644
--- a/docs/Development.md
+++ b/docs/Development.md
@@ -36,6 +36,28 @@ Pull requests are only to be merged by core developers when properly tested and
- Maintainers are permitted to change namespaces at will.
- Commits within PRs are not required to be namespaced, but it is highly recommended.
+## Adding new settings
+
+When adding new settings, use `tr("Setting:")` if the setting is meant to be a field, otherwise use `tr("Setting")` if the setting is meant to be a Yes/No or checkmark type of setting, see [this short style guide](https://learn.microsoft.com/en-us/style-guide/punctuation/colons#in-ui).
+
+- The majority of software must work with the default option selected for such setting. Unless the setting significantly degrades performance.
+- Debug settings must never be turned on by default.
+- Provide reasonable bounds (for example, a setting controlling the amount of VRAM should never be 0).
+- The description of the setting must be short and concise, if the setting "does a lot of things" consider splitting the setting into multiple if possible.
+- Try to avoid excessive/redundant explainations "recommended for most users and games" can just be "(recommended)".
+- Try to not write "slow/fast" options unless it clearly degrades/increases performance for a given case, as most options may modify behaviour that result in different metrics accross different systems. If for example the option is an "accuracy" option, writing "High" is sufficient to imply "Slow". No need to write "High (Slow)".
+
+Some examples:
+- "[...] negatively affecting image quality", "[...] degrading image quality": Same wording but with less filler.
+- "[...] this may cause some glitches or crashes in some games", "[...] this may cause soft-crashes": Crashes implies there may be glitches (as crashes are technically a form of a fatal glitch). The entire sentence is structured as "may cause [...] on some games", which is redundant, because "may cause [...] in games" has the same semantic meaning ("may" is a chance that it will occur on "some" given set).
+- "FIFO Relaxed is similar to FIFO [...]", "FIFO Relaxed [...]": The name already implies similarity.
+- "[...] but may also reduce performance in some cases", "[...] but may degrade performance": Again, "some cases" and "may" implies there is a probability.
+- "[...] it can [...] in some cases", "[...] it can [...]": Implied probability.
+
+Before adding a new setting, consider:
+- Does the piece of code that the setting pertains to, make a significant difference if it's on/off?
+- Can it be auto-detected?
+
# IDE setup
## VSCode
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index c529eaf63f..ab8375b325 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -865,12 +865,12 @@
Abort
Continue
System Archive Not Found
- %s is missing. Please dump your system archives.\nContinuing emulation may result in crashes and bugs.
+ %s is missing. Please dump your system archives.\nContinuing emulation may result in crashes.
A system archive
Save/Load Error
Fatal Error
- A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes and bugs.
- Turning off this setting will significantly reduce emulation performance! For the best experience, it is recommended that you leave this setting enabled.
+ A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes.
+ Turning off this setting will significantly degrade performance. It's recommended that you leave this setting enabled.
Device RAM: %1$s\nRecommended: %2$s
%1$s %2$s
No bootable game present!
@@ -941,12 +941,12 @@
Normal
High
- Extreme (Slow)
+ Extreme
Default
- Unsafe (fast)
- Safe (stable)
+ Unsafe
+ Safe
ASTC Decoding Method
diff --git a/src/common/settings.h b/src/common/settings.h
index 8605445837..891bde608c 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -178,7 +178,7 @@ struct Values {
SwitchableSetting audio_input_device_id{
linkage, "auto", "input_device", Category::Audio, Specialization::RuntimeList};
SwitchableSetting sound_index{
- linkage, AudioMode::Stereo, AudioMode::Mono, AudioMode::Surround,
+ linkage, AudioMode::Stereo,
"sound_index", Category::SystemAudio, Specialization::Default, true,
true};
SwitchableSetting volume{linkage,
@@ -199,8 +199,6 @@ struct Values {
SwitchableSetting use_multi_core{linkage, true, "use_multi_core", Category::Core};
SwitchableSetting memory_layout_mode{linkage,
MemoryLayout::Memory_4Gb,
- MemoryLayout::Memory_4Gb,
- MemoryLayout::Memory_12Gb,
"memory_layout_mode",
Category::Core,
Specialization::Default,
@@ -240,9 +238,8 @@ struct Values {
#endif
"cpu_backend",
Category::Cpu};
- SwitchableSetting cpu_accuracy{linkage, CpuAccuracy::Auto,
- CpuAccuracy::Auto, CpuAccuracy::Paranoid,
- "cpu_accuracy", Category::Cpu};
+ SwitchableSetting cpu_accuracy{linkage, CpuAccuracy::Auto,
+ "cpu_accuracy", Category::Cpu};
SwitchableSetting use_fast_cpu_time{linkage,
false,
@@ -324,10 +321,10 @@ struct Values {
// Renderer
SwitchableSetting renderer_backend{
- linkage, RendererBackend::Vulkan, RendererBackend::OpenGL, RendererBackend::Null,
+ linkage, RendererBackend::Vulkan,
"backend", Category::Renderer};
SwitchableSetting shader_backend{
- linkage, ShaderBackend::SpirV, ShaderBackend::Glsl, ShaderBackend::SpirV,
+ linkage, ShaderBackend::SpirV,
"shader_backend", Category::Renderer, Specialization::RuntimeList};
SwitchableSetting vulkan_device{linkage, 0, "vulkan_device", Category::Renderer,
Specialization::RuntimeList};
@@ -342,8 +339,6 @@ struct Values {
Category::Renderer};
SwitchableSetting optimize_spirv_output{linkage,
SpirvOptimizeMode::Never,
- SpirvOptimizeMode::Never,
- SpirvOptimizeMode::Always,
"optimize_spirv_output",
Category::Renderer};
SwitchableSetting use_asynchronous_gpu_emulation{
@@ -354,12 +349,10 @@ struct Values {
#else
AstcDecodeMode::Gpu,
#endif
- AstcDecodeMode::Cpu,
- AstcDecodeMode::CpuAsynchronous,
"accelerate_astc",
Category::Renderer};
SwitchableSetting vsync_mode{
- linkage, VSyncMode::Fifo, VSyncMode::Immediate, VSyncMode::FifoRelaxed,
+ linkage, VSyncMode::Fifo,
"use_vsync", Category::Renderer, Specialization::RuntimeList, true,
true};
SwitchableSetting nvdec_emulation{linkage, NvdecEmulation::Gpu,
@@ -372,8 +365,6 @@ struct Values {
#else
FullscreenMode::Exclusive,
#endif
- FullscreenMode::Borderless,
- FullscreenMode::Exclusive,
"fullscreen_mode",
Category::Renderer,
Specialization::Default,
@@ -381,8 +372,6 @@ struct Values {
true};
SwitchableSetting aspect_ratio{linkage,
AspectRatio::R16_9,
- AspectRatio::R16_9,
- AspectRatio::Stretch,
"aspect_ratio",
Category::Renderer,
Specialization::Default,
@@ -430,8 +419,6 @@ struct Values {
#else
GpuAccuracy::High,
#endif
- GpuAccuracy::Normal,
- GpuAccuracy::Extreme,
"gpu_accuracy",
Category::RendererAdvanced,
Specialization::Default,
@@ -442,8 +429,6 @@ struct Values {
SwitchableSetting dma_accuracy{linkage,
DmaAccuracy::Default,
- DmaAccuracy::Default,
- DmaAccuracy::Safe,
"dma_accuracy",
Category::RendererAdvanced,
Specialization::Default,
@@ -456,20 +441,14 @@ struct Values {
#else
AnisotropyMode::Automatic,
#endif
- AnisotropyMode::Automatic,
- AnisotropyMode::X16,
"max_anisotropy",
Category::RendererAdvanced};
SwitchableSetting astc_recompression{linkage,
AstcRecompression::Uncompressed,
- AstcRecompression::Uncompressed,
- AstcRecompression::Bc3,
"astc_recompression",
Category::RendererAdvanced};
SwitchableSetting vram_usage_mode{linkage,
VramUsageMode::Conservative,
- VramUsageMode::Conservative,
- VramUsageMode::Aggressive,
"vram_usage_mode",
Category::RendererAdvanced};
SwitchableSetting skip_cpu_inner_invalidation{linkage,
@@ -595,14 +574,10 @@ struct Values {
// System
SwitchableSetting language_index{linkage,
Language::EnglishAmerican,
- Language::Japanese,
- Language::Serbian,
"language_index",
Category::System};
- SwitchableSetting region_index{linkage, Region::Usa, Region::Japan,
- Region::Taiwan, "region_index", Category::System};
- SwitchableSetting time_zone_index{linkage, TimeZone::Auto,
- TimeZone::Auto, TimeZone::Zulu,
+ SwitchableSetting region_index{linkage, Region::Usa, "region_index", Category::System};
+ SwitchableSetting time_zone_index{linkage, TimeZone::Auto,
"time_zone_index", Category::System};
// Measured in seconds since epoch
SwitchableSetting custom_rtc_enabled{
diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h
index f7dc5dc6c8..8022d8216e 100644
--- a/src/common/settings_enums.h
+++ b/src/common/settings_enums.h
@@ -10,6 +10,7 @@
#pragma once
#include
+#include
#include
#include
#include "common/common_types.h"
@@ -18,8 +19,10 @@ namespace Settings {
template
struct EnumMetadata {
- static std::vector> Canonicalizations();
+ static std::vector> Canonicalizations();
static u32 Index();
+ static constexpr T GetFirst();
+ static constexpr T GetLast();
};
#define PAIR_45(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_46(N, __VA_ARGS__))
@@ -69,138 +72,101 @@ struct EnumMetadata {
#define PAIR_1(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_2(N, __VA_ARGS__))
#define PAIR(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_1(N, __VA_ARGS__))
-#define ENUM(NAME, ...) \
- enum class NAME : u32 { __VA_ARGS__ }; \
- template <> \
- inline std::vector> EnumMetadata::Canonicalizations() { \
- return {PAIR(NAME, __VA_ARGS__)}; \
- } \
- template <> \
- inline u32 EnumMetadata::Index() { \
- return __COUNTER__; \
+#define PP_HEAD(A, ...) A
+
+#define ENUM(NAME, ...) \
+ enum class NAME : u32 { __VA_ARGS__ }; \
+ template<> inline std::vector> EnumMetadata::Canonicalizations() { \
+ return {PAIR(NAME, __VA_ARGS__)}; \
+ } \
+ template<> inline u32 EnumMetadata::Index() { \
+ return __COUNTER__; \
+ } \
+ template<> inline constexpr NAME EnumMetadata::GetFirst() { \
+ return NAME::PP_HEAD(__VA_ARGS__); \
+ } \
+ template<> inline constexpr NAME EnumMetadata::GetLast() { \
+ return (std::vector>{PAIR(NAME, __VA_ARGS__)}).back().second; \
}
// AudioEngine must be specified discretely due to having existing but slightly different
// canonicalizations
// TODO (lat9nq): Remove explicit definition of AudioEngine/sink_id
-enum class AudioEngine : u32 {
- Auto,
- Cubeb,
- Sdl2,
- Null,
- Oboe,
-};
-
-template <>
-inline std::vector>
-EnumMetadata::Canonicalizations() {
+enum class AudioEngine : u32 { Auto, Cubeb, Sdl2, Null, Oboe, };
+template<>
+inline std::vector> EnumMetadata::Canonicalizations() {
return {
{"auto", AudioEngine::Auto}, {"cubeb", AudioEngine::Cubeb}, {"sdl2", AudioEngine::Sdl2},
{"null", AudioEngine::Null}, {"oboe", AudioEngine::Oboe},
};
}
-
-template <>
+/// @brief This is just a sufficiently large number that is more than the number of other enums declared here
+template<>
inline u32 EnumMetadata::Index() {
- // This is just a sufficiently large number that is more than the number of other enums declared
- // here
return 100;
}
+template<>
+inline constexpr AudioEngine EnumMetadata::GetFirst() {
+ return AudioEngine::Auto;
+}
+template<>
+inline constexpr AudioEngine EnumMetadata::GetLast() {
+ return AudioEngine::Oboe;
+}
ENUM(AudioMode, Mono, Stereo, Surround);
+static_assert(EnumMetadata::GetFirst() == AudioMode::Mono);
+static_assert(EnumMetadata::GetLast() == AudioMode::Surround);
ENUM(Language, Japanese, EnglishAmerican, French, German, Italian, Spanish, Chinese, Korean, Dutch,
Portuguese, Russian, Taiwanese, EnglishBritish, FrenchCanadian, SpanishLatin,
ChineseSimplified, ChineseTraditional, PortugueseBrazilian, Serbian);
-
ENUM(Region, Japan, Usa, Europe, Australia, China, Korea, Taiwan);
-
ENUM(TimeZone, 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, WSu, Wet, Zulu);
-
+ 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, WSu, Wet, Zulu);
ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16);
-
ENUM(AstcDecodeMode, Cpu, Gpu, CpuAsynchronous);
-
ENUM(AstcRecompression, Uncompressed, Bc1, Bc3);
-
ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed);
-
ENUM(VramUsageMode, Conservative, Aggressive);
-
ENUM(RendererBackend, OpenGL, Vulkan, Null);
-
ENUM(ShaderBackend, Glsl, Glasm, SpirV);
-
ENUM(GpuAccuracy, Normal, High, Extreme);
-
ENUM(DmaAccuracy, Default, Unsafe, Safe);
-
ENUM(CpuBackend, Dynarmic, Nce);
-
ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid);
-
ENUM(CpuClock, Boost, Fast)
-
ENUM(MemoryLayout, Memory_4Gb, Memory_6Gb, Memory_8Gb, Memory_10Gb, Memory_12Gb);
-
ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never);
-
ENUM(FullscreenMode, Borderless, Exclusive);
-
ENUM(NvdecEmulation, Off, Cpu, Gpu);
-
-ENUM(ResolutionSetup,
- Res1_4X,
- Res1_2X,
- Res3_4X,
- Res1X,
- Res3_2X,
- Res2X,
- Res3X,
- Res4X,
- Res5X,
- Res6X,
- Res7X,
- Res8X);
-
+ENUM(ResolutionSetup, Res1_4X, Res1_2X, Res3_4X, Res1X, Res3_2X, Res2X, Res3X, Res4X, Res5X, Res6X, Res7X, Res8X);
ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, ZeroTangent, BSpline, Mitchell, Spline1, Gaussian, Lanczos, ScaleForce, Fsr, Area, Mmpx, MaxEnum);
-
ENUM(AntiAliasing, None, Fxaa, Smaa, MaxEnum);
-
ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
-
ENUM(ConsoleMode, Handheld, Docked);
-
ENUM(AppletMode, HLE, LLE);
-
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
-
ENUM(GpuOverclock, Low, Medium, High)
-
ENUM(TemperatureUnits, Celsius, Fahrenheit)
template
-inline std::string CanonicalizeEnum(Type id) {
+inline std::string_view CanonicalizeEnum(Type id) {
const auto group = EnumMetadata::Canonicalizations();
- for (auto& [name, value] : group) {
- if (value == id) {
+ for (auto& [name, value] : group)
+ if (value == id)
return name;
- }
- }
return "unknown";
}
template
inline Type ToEnum(const std::string& canonicalization) {
const auto group = EnumMetadata::Canonicalizations();
- for (auto& [name, value] : group) {
- if (name == canonicalization) {
+ for (auto& [name, value] : group)
+ if (name == canonicalization)
return value;
- }
- }
return {};
}
} // namespace Settings
diff --git a/src/common/settings_setting.h b/src/common/settings_setting.h
index 0aba2e11c9..a7e6bb6168 100644
--- a/src/common/settings_setting.h
+++ b/src/common/settings_setting.h
@@ -72,10 +72,17 @@ public:
u32 specialization_ = Specialization::Default, bool save_ = true,
bool runtime_modifiable_ = false, BasicSetting* other_setting_ = nullptr)
requires(ranged)
- : BasicSetting(linkage, name, category_, save_, runtime_modifiable_, specialization_,
- other_setting_),
+ : BasicSetting(linkage, name, category_, save_, runtime_modifiable_, specialization_, other_setting_),
value{default_val}, default_value{default_val}, maximum{max_val}, minimum{min_val} {}
+ explicit Setting(Linkage& linkage, const Type& default_val,
+ const std::string& name, Category category_,
+ u32 specialization_ = Specialization::Default, bool save_ = true,
+ bool runtime_modifiable_ = false, BasicSetting* other_setting_ = nullptr)
+ requires(ranged && std::is_enum_v)
+ : BasicSetting(linkage, name, category_, save_, runtime_modifiable_, specialization_, other_setting_),
+ value{default_val}, default_value{default_val}, maximum{EnumMetadata::GetLast()}, minimum{EnumMetadata::GetFirst()} {}
+
/**
* Returns a reference to the setting's value.
*
@@ -119,9 +126,6 @@ protected:
return value_.has_value() ? std::to_string(*value_) : "none";
} else if constexpr (std::is_same_v) {
return value_ ? "true" : "false";
- } else if constexpr (std::is_same_v) {
- // Compatibility with old AudioEngine setting being a string
- return CanonicalizeEnum(value_);
} else if constexpr (std::is_floating_point_v) {
return fmt::format("{:f}", value_);
} else if constexpr (std::is_enum_v) {
@@ -207,7 +211,7 @@ public:
[[nodiscard]] std::string Canonicalize() const override final {
if constexpr (std::is_enum_v) {
- return CanonicalizeEnum(this->GetValue());
+ return std::string{CanonicalizeEnum(this->GetValue())};
} else {
return ToString(this->GetValue());
}
@@ -288,41 +292,32 @@ public:
* @param other_setting_ A second Setting to associate to this one in metadata
*/
template
- explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const std::string& name,
- Category category_, u32 specialization_ = Specialization::Default,
- bool save_ = true, bool runtime_modifiable_ = false,
- typename std::enable_if::type other_setting_ = nullptr)
- : Setting{
- linkage, default_val, name, category_, specialization_,
- save_, runtime_modifiable_, other_setting_} {
+ explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const std::string& name, Category category_, u32 specialization_ = Specialization::Default, bool save_ = true, bool runtime_modifiable_ = false, T* other_setting_ = nullptr) requires(!ranged)
+ : Setting{ linkage, default_val, name, category_, specialization_, save_, runtime_modifiable_, other_setting_} {
linkage.restore_functions.emplace_back([this]() { this->SetGlobal(true); });
}
virtual ~SwitchableSetting() = default;
- /**
- * Sets a default value, minimum value, maximum value, and label.
- *
- * @param linkage Setting registry
- * @param default_val Initial value of the setting, and default value of the setting
- * @param min_val Sets the minimum allowed value of the setting
- * @param max_val Sets the maximum allowed value of the setting
- * @param name Label for the setting
- * @param category_ Category of the setting AKA INI group
- * @param specialization_ Suggestion for how frontend implementations represent this in a config
- * @param save_ Suggests that this should or should not be saved to a frontend config file
- * @param runtime_modifiable_ Suggests whether this is modifiable while a guest is loaded
- * @param other_setting_ A second Setting to associate to this one in metadata
- */
+ /// @brief Sets a default value, minimum value, maximum value, and label.
+ /// @param linkage Setting registry
+ /// @param default_val Initial value of the setting, and default value of the setting
+ /// @param min_val Sets the minimum allowed value of the setting
+ /// @param max_val Sets the maximum allowed value of the setting
+ /// @param name Label for the setting
+ /// @param category_ Category of the setting AKA INI group
+ /// @param specialization_ Suggestion for how frontend implementations represent this in a config
+ /// @param save_ Suggests that this should or should not be saved to a frontend config file
+ /// @param runtime_modifiable_ Suggests whether this is modifiable while a guest is loaded
+ /// @param other_setting_ A second Setting to associate to this one in metadata
template
- explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const Type& min_val,
- const Type& max_val, const std::string& name, Category category_,
- u32 specialization_ = Specialization::Default, bool save_ = true,
- bool runtime_modifiable_ = false,
- typename std::enable_if::type other_setting_ = nullptr)
- : Setting{linkage, default_val, min_val,
- max_val, name, category_,
- specialization_, save_, runtime_modifiable_,
- other_setting_} {
+ explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const Type& min_val, const Type& max_val, const std::string& name, Category category_, u32 specialization_ = Specialization::Default, bool save_ = true, bool runtime_modifiable_ = false, T* other_setting_ = nullptr) requires(ranged)
+ : Setting{linkage, default_val, min_val, max_val, name, category_, specialization_, save_, runtime_modifiable_, other_setting_} {
+ linkage.restore_functions.emplace_back([this]() { this->SetGlobal(true); });
+ }
+
+ template
+ explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const std::string& name, Category category_, u32 specialization_ = Specialization::Default, bool save_ = true, bool runtime_modifiable_ = false, T* other_setting_ = nullptr) requires(ranged)
+ : Setting{linkage, default_val, EnumMetadata::GetFirst(), EnumMetadata::GetLast(), name, category_, specialization_, save_, runtime_modifiable_, other_setting_} {
linkage.restore_functions.emplace_back([this]() { this->SetGlobal(true); });
}
diff --git a/src/core/hle/service/am/applet.h b/src/core/hle/service/am/applet.h
index 6cc8cdf741..ad84f39dc7 100644
--- a/src/core/hle/service/am/applet.h
+++ b/src/core/hle/service/am/applet.h
@@ -8,6 +8,7 @@
#include
#include
+#include
#include "common/math_util.h"
#include "core/hle/service/apm/apm_controller.h"
@@ -23,6 +24,7 @@
#include "core/hle/service/am/hid_registration.h"
#include "core/hle/service/am/lifecycle_manager.h"
#include "core/hle/service/am/process_holder.h"
+#include "core/hle/service/am/service/storage.h"
namespace Service::AM {
@@ -97,6 +99,9 @@ struct Applet {
std::deque> preselected_user_launch_parameter{};
std::deque> friend_invitation_storage_channel{};
+ // Context Stack
+ std::stack> context_stack{};
+
// Caller applet
std::weak_ptr