// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include #include #include #include #include "common/common_types.h" #include "common/settings_common.h" #include "common/settings_enums.h" #include "common/settings_input.h" #include "common/settings_setting.h" namespace Settings { const char* TranslateCategory(Settings::Category category); struct ResolutionScalingInfo { u32 up_scale{1}; u32 down_shift{0}; f32 up_factor{1.0f}; f32 down_factor{1.0f}; bool active{}; bool downscale{}; s32 ScaleUp(s32 value) const { if (value == 0) { return 0; } return std::max((value * static_cast(up_scale)) >> static_cast(down_shift), 1); } u32 ScaleUp(u32 value) const { if (value == 0U) { return 0U; } return std::max((value * up_scale) >> down_shift, 1U); } }; #ifndef CANNOT_EXPLICITLY_INSTANTIATE // Instantiate the classes elsewhere (settings.cpp) to reduce compiler/linker work #define SETTING(TYPE, RANGED) extern template class Setting #define SWITCHABLE(TYPE, RANGED) extern template class SwitchableSetting SETTING(AudioEngine, false); SETTING(bool, false); SETTING(int, false); SETTING(s32, false); SETTING(std::string, false); SETTING(std::string, false); SETTING(u16, false); SWITCHABLE(AnisotropyMode, true); SWITCHABLE(AntiAliasing, false); SWITCHABLE(AspectRatio, true); SWITCHABLE(AstcDecodeMode, true); SWITCHABLE(AstcRecompression, true); SWITCHABLE(AudioMode, true); SWITCHABLE(CpuAccuracy, true); SWITCHABLE(FullscreenMode, true); SWITCHABLE(GpuAccuracy, true); SWITCHABLE(Language, true); SWITCHABLE(NvdecEmulation, false); SWITCHABLE(Region, true); SWITCHABLE(RendererBackend, true); SWITCHABLE(ScalingFilter, false); SWITCHABLE(ShaderBackend, true); SWITCHABLE(TimeZone, true); SETTING(VSyncMode, true); SWITCHABLE(bool, false); SWITCHABLE(int, false); SWITCHABLE(int, true); SWITCHABLE(s64, false); SWITCHABLE(u16, true); SWITCHABLE(u32, false); SWITCHABLE(u8, false); SWITCHABLE(u8, true); #undef SETTING #undef SWITCHABLE #endif /** * The InputSetting class allows for getting a reference to either the global or custom members. * This is required as we cannot easily modify the values of user-defined types within containers * using the SetValue() member function found in the Setting class. The primary purpose of this * class is to store an array of 10 PlayerInput structs for both the global and custom setting and * allows for easily accessing and modifying both settings. */ template class InputSetting final { public: InputSetting() = default; explicit InputSetting(Type val) : Setting(val) {} ~InputSetting() = default; void SetGlobal(bool to_global) { use_global = to_global; } [[nodiscard]] bool UsingGlobal() const { return use_global; } [[nodiscard]] Type& GetValue(bool need_global = false) { if (use_global || need_global) { return global; } return custom; } private: bool use_global{true}; ///< The setting's global state Type global{}; ///< The setting Type custom{}; ///< The custom setting value }; struct TouchFromButtonMap { std::string name; std::vector buttons; }; struct Values { Linkage linkage{}; // Audio Setting sink_id{linkage, AudioEngine::Auto, "output_engine", Category::Audio, Specialization::RuntimeList}; Setting audio_output_device_id{linkage, "auto", "output_device", Category::Audio, Specialization::RuntimeList}; Setting audio_input_device_id{linkage, "auto", "input_device", Category::Audio, Specialization::RuntimeList}; SwitchableSetting sound_index{ linkage, AudioMode::Stereo, AudioMode::Mono, AudioMode::Surround, "sound_index", Category::SystemAudio, Specialization::Default, true, true}; SwitchableSetting volume{linkage, 100, 0, 200, "volume", Category::Audio, Specialization::Scalar | Specialization::Percentage, true, true}; Setting audio_muted{ linkage, false, "audio_muted", Category::Audio, Specialization::Default, false, true}; Setting dump_audio_commands{ linkage, false, "dump_audio_commands", Category::Audio, Specialization::Default, false}; // Core SwitchableSetting use_multi_core{linkage, true, "use_multi_core", Category::Core}; SwitchableSetting memory_layout_mode{linkage, MemoryLayout::Memory_4Gb, MemoryLayout::Memory_4Gb, MemoryLayout::Memory_8Gb, "memory_layout_mode", Category::Core}; SwitchableSetting use_speed_limit{ linkage, true, "use_speed_limit", Category::Core, Specialization::Paired, false, true}; SwitchableSetting speed_limit{linkage, 100, 0, 9999, "speed_limit", Category::Core, Specialization::Countable | Specialization::Percentage, true, true, &use_speed_limit}; // Cpu SwitchableSetting cpu_accuracy{linkage, CpuAccuracy::Auto, CpuAccuracy::Auto, CpuAccuracy::Paranoid, "cpu_accuracy", Category::Cpu}; Setting cpu_debug_mode{linkage, false, "cpu_debug_mode", Category::CpuDebug}; Setting cpuopt_page_tables{linkage, true, "cpuopt_page_tables", Category::CpuDebug}; Setting cpuopt_block_linking{linkage, true, "cpuopt_block_linking", Category::CpuDebug}; Setting cpuopt_return_stack_buffer{linkage, true, "cpuopt_return_stack_buffer", Category::CpuDebug}; Setting cpuopt_fast_dispatcher{linkage, true, "cpuopt_fast_dispatcher", Category::CpuDebug}; Setting cpuopt_context_elimination{linkage, true, "cpuopt_context_elimination", Category::CpuDebug}; Setting cpuopt_const_prop{linkage, true, "cpuopt_const_prop", Category::CpuDebug}; Setting cpuopt_misc_ir{linkage, true, "cpuopt_misc_ir", Category::CpuDebug}; Setting cpuopt_reduce_misalign_checks{linkage, true, "cpuopt_reduce_misalign_checks", Category::CpuDebug}; Setting cpuopt_fastmem{linkage, true, "cpuopt_fastmem", Category::CpuDebug}; Setting cpuopt_fastmem_exclusives{linkage, true, "cpuopt_fastmem_exclusives", Category::CpuDebug}; Setting cpuopt_recompile_exclusives{linkage, true, "cpuopt_recompile_exclusives", Category::CpuDebug}; Setting cpuopt_ignore_memory_aborts{linkage, true, "cpuopt_ignore_memory_aborts", Category::CpuDebug}; SwitchableSetting cpuopt_unsafe_unfuse_fma{linkage, true, "cpuopt_unsafe_unfuse_fma", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_reduce_fp_error{ linkage, true, "cpuopt_unsafe_reduce_fp_error", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_ignore_standard_fpcr{ linkage, true, "cpuopt_unsafe_ignore_standard_fpcr", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_inaccurate_nan{ linkage, true, "cpuopt_unsafe_inaccurate_nan", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_fastmem_check{ linkage, true, "cpuopt_unsafe_fastmem_check", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_ignore_global_monitor{ linkage, true, "cpuopt_unsafe_ignore_global_monitor", Category::CpuUnsafe}; // Renderer SwitchableSetting renderer_backend{ linkage, RendererBackend::Vulkan, RendererBackend::OpenGL, RendererBackend::Null, "backend", Category::Renderer}; SwitchableSetting shader_backend{ linkage, ShaderBackend::Glsl, ShaderBackend::Glsl, ShaderBackend::SpirV, "shader_backend", Category::Renderer, Specialization::RuntimeList}; SwitchableSetting vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList}; SwitchableSetting use_disk_shader_cache{linkage, true, "use_disk_shader_cache", Category::Renderer}; SwitchableSetting use_asynchronous_gpu_emulation{ linkage, true, "use_asynchronous_gpu_emulation", Category::Renderer}; SwitchableSetting accelerate_astc{linkage, AstcDecodeMode::Gpu, AstcDecodeMode::Cpu, AstcDecodeMode::CpuAsynchronous, "accelerate_astc", Category::Renderer}; Setting vsync_mode{ linkage, VSyncMode::Fifo, VSyncMode::Immediate, VSyncMode::FifoRelaxed, "use_vsync", Category::Renderer, Specialization::RuntimeList, true, true}; SwitchableSetting nvdec_emulation{linkage, NvdecEmulation::Gpu, "nvdec_emulation", Category::Renderer}; // *nix platforms may have issues with the borderless windowed fullscreen mode. // Default to exclusive fullscreen on these platforms for now. SwitchableSetting fullscreen_mode{linkage, #ifdef _WIN32 FullscreenMode::Borderless, #else FullscreenMode::Exclusive, #endif FullscreenMode::Borderless, FullscreenMode::Exclusive, "fullscreen_mode", Category::Renderer, Specialization::Default, true, true}; SwitchableSetting aspect_ratio{linkage, AspectRatio::R16_9, AspectRatio::R16_9, AspectRatio::Stretch, "aspect_ratio", Category::Renderer, Specialization::Default, true, true}; ResolutionScalingInfo resolution_info{}; SwitchableSetting resolution_setup{linkage, ResolutionSetup::Res1X, "resolution_setup", Category::Renderer}; SwitchableSetting scaling_filter{linkage, ScalingFilter::Bilinear, "scaling_filter", Category::Renderer, Specialization::Default, true, true}; SwitchableSetting anti_aliasing{linkage, AntiAliasing::None, "anti_aliasing", Category::Renderer, Specialization::Default, true, true}; SwitchableSetting fsr_sharpening_slider{linkage, 25, 0, 200, "fsr_sharpening_slider", Category::Renderer, Specialization::Scalar | Specialization::Percentage, true, true}; SwitchableSetting bg_red{ linkage, 0, "bg_red", Category::Renderer, Specialization::Default, true, true}; SwitchableSetting bg_green{ linkage, 0, "bg_green", Category::Renderer, Specialization::Default, true, true}; SwitchableSetting bg_blue{ linkage, 0, "bg_blue", Category::Renderer, Specialization::Default, true, true}; SwitchableSetting gpu_accuracy{linkage, GpuAccuracy::High, GpuAccuracy::Normal, GpuAccuracy::Extreme, "gpu_accuracy", Category::RendererAdvanced, Specialization::Default, true, true}; SwitchableSetting max_anisotropy{ linkage, AnisotropyMode::Automatic, AnisotropyMode::Automatic, AnisotropyMode::X16, "max_anisotropy", Category::RendererAdvanced}; SwitchableSetting astc_recompression{linkage, AstcRecompression::Uncompressed, AstcRecompression::Uncompressed, AstcRecompression::Bc3, "astc_recompression", Category::RendererAdvanced}; SwitchableSetting async_presentation{linkage, false, "async_presentation", Category::RendererAdvanced}; SwitchableSetting renderer_force_max_clock{linkage, false, "force_max_clock", Category::RendererAdvanced}; SwitchableSetting use_reactive_flushing{linkage, true, "use_reactive_flushing", Category::RendererAdvanced}; SwitchableSetting use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders", Category::RendererAdvanced}; SwitchableSetting use_fast_gpu_time{ linkage, true, "use_fast_gpu_time", Category::RendererAdvanced, Specialization::Default, true, true}; SwitchableSetting use_vulkan_driver_pipeline_cache{linkage, true, "use_vulkan_driver_pipeline_cache", Category::RendererAdvanced, Specialization::Default, true, true}; SwitchableSetting enable_compute_pipelines{linkage, false, "enable_compute_pipelines", Category::RendererAdvanced}; SwitchableSetting use_video_framerate{linkage, false, "use_video_framerate", Category::RendererAdvanced}; SwitchableSetting barrier_feedback_loops{linkage, true, "barrier_feedback_loops", Category::RendererAdvanced}; Setting renderer_debug{linkage, false, "debug", Category::RendererDebug}; Setting renderer_shader_feedback{linkage, false, "shader_feedback", Category::RendererDebug}; Setting enable_nsight_aftermath{linkage, false, "nsight_aftermath", Category::RendererDebug}; Setting disable_shader_loop_safety_checks{ linkage, false, "disable_shader_loop_safety_checks", Category::RendererDebug}; // System SwitchableSetting language_index{linkage, Language::EnglishAmerican, Language::Japanese, Language::PortugueseBrazilian, "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, "time_zone_index", Category::System}; // Measured in seconds since epoch SwitchableSetting custom_rtc_enabled{ linkage, false, "custom_rtc_enabled", Category::System, Specialization::Paired, true, true}; SwitchableSetting custom_rtc{ linkage, 0, "custom_rtc", Category::System, Specialization::Time, true, true, &custom_rtc_enabled}; // Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc` s64 custom_rtc_differential; SwitchableSetting rng_seed_enabled{ linkage, false, "rng_seed_enabled", Category::System, Specialization::Paired, true, true}; SwitchableSetting rng_seed{ linkage, 0, "rng_seed", Category::System, Specialization::Hex, true, true, &rng_seed_enabled}; Setting device_name{ linkage, "yuzu", "device_name", Category::System, Specialization::Default, true, true}; Setting current_user{linkage, 0, "current_user", Category::System}; SwitchableSetting use_docked_mode{linkage, ConsoleMode::Docked, "use_docked_mode", Category::System, Specialization::Radio, true, true}; // Controls InputSetting> players; Setting enable_raw_input{ linkage, false, "enable_raw_input", Category::Controls, Specialization::Default, // Only read/write enable_raw_input on Windows platforms #ifdef _WIN32 true #else false #endif }; Setting controller_navigation{linkage, true, "controller_navigation", Category::Controls}; Setting enable_joycon_driver{linkage, true, "enable_joycon_driver", Category::Controls}; Setting enable_procon_driver{linkage, false, "enable_procon_driver", Category::Controls}; SwitchableSetting vibration_enabled{linkage, true, "vibration_enabled", Category::Controls}; SwitchableSetting enable_accurate_vibrations{linkage, false, "enable_accurate_vibrations", Category::Controls}; SwitchableSetting motion_enabled{linkage, true, "motion_enabled", Category::Controls}; Setting udp_input_servers{linkage, "127.0.0.1:26760", "udp_input_servers", Category::Controls}; Setting enable_udp_controller{linkage, false, "enable_udp_controller", Category::Controls}; Setting pause_tas_on_load{linkage, true, "pause_tas_on_load", Category::Controls}; Setting tas_enable{linkage, false, "tas_enable", Category::Controls}; Setting tas_loop{linkage, false, "tas_loop", Category::Controls}; Setting mouse_panning{ linkage, false, "mouse_panning", Category::Controls, Specialization::Default, false}; Setting mouse_panning_sensitivity{ linkage, 50, 1, 100, "mouse_panning_sensitivity", Category::Controls}; Setting mouse_enabled{linkage, false, "mouse_enabled", Category::Controls}; Setting mouse_panning_x_sensitivity{ linkage, 50, 1, 100, "mouse_panning_x_sensitivity", Category::Controls}; Setting mouse_panning_y_sensitivity{ linkage, 50, 1, 100, "mouse_panning_y_sensitivity", Category::Controls}; Setting mouse_panning_deadzone_counterweight{ linkage, 20, 0, 100, "mouse_panning_deadzone_counterweight", Category::Controls}; Setting mouse_panning_decay_strength{ linkage, 18, 0, 100, "mouse_panning_decay_strength", Category::Controls}; Setting mouse_panning_min_decay{ linkage, 6, 0, 100, "mouse_panning_min_decay", Category::Controls}; Setting emulate_analog_keyboard{linkage, false, "emulate_analog_keyboard", Category::Controls}; Setting keyboard_enabled{linkage, false, "keyboard_enabled", Category::Controls}; Setting debug_pad_enabled{linkage, false, "debug_pad_enabled", Category::Controls}; ButtonsRaw debug_pad_buttons; AnalogsRaw debug_pad_analogs; TouchscreenInput touchscreen; Setting touch_device{linkage, "min_x:100,min_y:50,max_x:1800,max_y:850", "touch_device", Category::Controls}; Setting touch_from_button_map_index{linkage, 0, "touch_from_button_map", Category::Controls}; std::vector touch_from_button_maps; Setting enable_ring_controller{linkage, true, "enable_ring_controller", Category::Controls}; RingconRaw ringcon_analogs; Setting enable_ir_sensor{linkage, false, "enable_ir_sensor", Category::Controls}; Setting ir_sensor_device{linkage, "auto", "ir_sensor_device", Category::Controls}; Setting random_amiibo_id{linkage, false, "random_amiibo_id", Category::Controls}; // Data Storage Setting use_virtual_sd{linkage, true, "use_virtual_sd", Category::DataStorage}; Setting gamecard_inserted{linkage, false, "gamecard_inserted", Category::DataStorage}; Setting gamecard_current_game{linkage, false, "gamecard_current_game", Category::DataStorage}; Setting gamecard_path{linkage, std::string(), "gamecard_path", Category::DataStorage}; // Debugging bool record_frame_times; Setting use_gdbstub{linkage, false, "use_gdbstub", Category::Debugging}; Setting gdbstub_port{linkage, 6543, "gdbstub_port", Category::Debugging}; Setting program_args{linkage, std::string(), "program_args", Category::Debugging}; Setting dump_exefs{linkage, false, "dump_exefs", Category::Debugging}; Setting dump_nso{linkage, false, "dump_nso", Category::Debugging}; Setting dump_shaders{ linkage, false, "dump_shaders", Category::DebuggingGraphics, Specialization::Default, false}; Setting dump_macros{ linkage, false, "dump_macros", Category::DebuggingGraphics, Specialization::Default, false}; Setting enable_fs_access_log{linkage, false, "enable_fs_access_log", Category::Debugging}; Setting reporting_services{ linkage, false, "reporting_services", Category::Debugging, Specialization::Default, false}; Setting quest_flag{linkage, false, "quest_flag", Category::Debugging}; Setting disable_macro_jit{linkage, false, "disable_macro_jit", Category::DebuggingGraphics}; Setting disable_macro_hle{linkage, false, "disable_macro_hle", Category::DebuggingGraphics}; Setting extended_logging{ linkage, false, "extended_logging", Category::Debugging, Specialization::Default, false}; Setting use_debug_asserts{linkage, false, "use_debug_asserts", Category::Debugging}; Setting use_auto_stub{ linkage, false, "use_auto_stub", Category::Debugging, Specialization::Default, false}; Setting enable_all_controllers{linkage, false, "enable_all_controllers", Category::Debugging}; Setting create_crash_dumps{linkage, false, "create_crash_dumps", Category::Debugging}; Setting perform_vulkan_check{linkage, true, "perform_vulkan_check", Category::Debugging}; // Miscellaneous Setting log_filter{linkage, "*:Info", "log_filter", Category::Miscellaneous}; Setting use_dev_keys{linkage, false, "use_dev_keys", Category::Miscellaneous}; // Network Setting network_interface{linkage, std::string(), "network_interface", Category::Network}; // WebService Setting enable_telemetry{linkage, true, "enable_telemetry", Category::WebService}; Setting web_api_url{linkage, "https://api.yuzu-emu.org", "web_api_url", Category::WebService}; Setting yuzu_username{linkage, std::string(), "yuzu_username", Category::WebService}; Setting yuzu_token{linkage, std::string(), "yuzu_token", Category::WebService}; // Add-Ons std::map> disabled_addons; }; extern Values values; bool IsGPULevelExtreme(); bool IsGPULevelHigh(); bool IsFastmemEnabled(); float Volume(); std::string GetTimeZoneString(TimeZone time_zone); void LogSettings(); void TranslateResolutionInfo(ResolutionSetup setup, ResolutionScalingInfo& info); void UpdateRescalingInfo(); // Restore the global state of all applicable settings in the Values struct void RestoreGlobalState(bool is_powered_on); bool IsConfiguringGlobal(); void SetConfiguringGlobal(bool is_global); } // namespace Settings