| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- // Copyright 2014 Citra Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include <array>
- #include <atomic>
- #include <chrono>
- #include <map>
- #include <optional>
- #include <string>
- #include <vector>
- #include "common/common_types.h"
- #include "input_common/settings.h"
- namespace Core {
- class System;
- }
- namespace Settings {
- enum class RendererBackend {
- OpenGL = 0,
- Vulkan = 1,
- };
- enum class GPUAccuracy : u32 {
- Normal = 0,
- High = 1,
- Extreme = 2,
- };
- enum class CPUAccuracy {
- Accurate = 0,
- Unsafe = 1,
- DebugMode = 2,
- };
- template <typename Type>
- class Setting final {
- public:
- Setting() = default;
- explicit Setting(Type val) : global{val} {}
- ~Setting() = default;
- void SetGlobal(bool to_global) {
- use_global = to_global;
- }
- bool UsingGlobal() const {
- return use_global;
- }
- Type GetValue(bool need_global = false) const {
- if (use_global || need_global) {
- return global;
- }
- return local;
- }
- void SetValue(const Type& value) {
- if (use_global) {
- global = value;
- } else {
- local = value;
- }
- }
- private:
- bool use_global = true;
- Type global{};
- Type local{};
- };
- /**
- * The InputSetting class allows for getting a reference to either the global or local 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 local (per-game)
- * setting and allows for easily accessing and modifying both settings.
- */
- template <typename Type>
- class InputSetting final {
- public:
- InputSetting() = default;
- explicit InputSetting(Type val) : global{val} {}
- ~InputSetting() = default;
- void SetGlobal(bool to_global) {
- use_global = to_global;
- }
- bool UsingGlobal() const {
- return use_global;
- }
- Type& GetValue(bool need_global = false) {
- if (use_global || need_global) {
- return global;
- }
- return local;
- }
- private:
- bool use_global = true;
- Type global{};
- Type local{};
- };
- struct TouchFromButtonMap {
- std::string name;
- std::vector<std::string> buttons;
- };
- struct Values {
- // Audio
- std::string audio_device_id;
- std::string sink_id;
- bool audio_muted;
- Setting<bool> enable_audio_stretching;
- Setting<float> volume;
- // Core
- Setting<bool> use_multi_core;
- // Cpu
- CPUAccuracy cpu_accuracy;
- bool cpuopt_page_tables;
- bool cpuopt_block_linking;
- bool cpuopt_return_stack_buffer;
- bool cpuopt_fast_dispatcher;
- bool cpuopt_context_elimination;
- bool cpuopt_const_prop;
- bool cpuopt_misc_ir;
- bool cpuopt_reduce_misalign_checks;
- bool cpuopt_unsafe_unfuse_fma;
- bool cpuopt_unsafe_reduce_fp_error;
- bool cpuopt_unsafe_inaccurate_nan;
- // Renderer
- Setting<RendererBackend> renderer_backend;
- bool renderer_debug;
- Setting<int> vulkan_device;
- Setting<u16> resolution_factor{1};
- Setting<int> aspect_ratio;
- Setting<int> max_anisotropy;
- Setting<bool> use_frame_limit;
- Setting<u16> frame_limit;
- Setting<bool> use_disk_shader_cache;
- Setting<GPUAccuracy> gpu_accuracy;
- Setting<bool> use_asynchronous_gpu_emulation;
- Setting<bool> use_nvdec_emulation;
- Setting<bool> use_vsync;
- Setting<bool> use_assembly_shaders;
- Setting<bool> use_asynchronous_shaders;
- Setting<bool> use_fast_gpu_time;
- Setting<float> bg_red;
- Setting<float> bg_green;
- Setting<float> bg_blue;
- // System
- Setting<std::optional<u32>> rng_seed;
- // Measured in seconds since epoch
- Setting<std::optional<std::chrono::seconds>> custom_rtc;
- // Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc`
- std::chrono::seconds custom_rtc_differential;
- s32 current_user;
- Setting<s32> language_index;
- Setting<s32> region_index;
- Setting<s32> time_zone_index;
- Setting<s32> sound_index;
- // Controls
- InputSetting<std::array<PlayerInput, 10>> players;
- Setting<bool> use_docked_mode;
- Setting<bool> vibration_enabled;
- Setting<bool> enable_accurate_vibrations;
- Setting<bool> motion_enabled;
- std::string motion_device;
- std::string udp_input_servers;
- bool emulate_analog_keyboard;
- bool mouse_enabled;
- std::string mouse_device;
- MouseButtonsRaw mouse_buttons;
- bool keyboard_enabled;
- KeyboardKeysRaw keyboard_keys;
- KeyboardModsRaw keyboard_mods;
- bool debug_pad_enabled;
- ButtonsRaw debug_pad_buttons;
- AnalogsRaw debug_pad_analogs;
- TouchscreenInput touchscreen;
- bool use_touch_from_button;
- std::string touch_device;
- int touch_from_button_map_index;
- std::vector<TouchFromButtonMap> touch_from_button_maps;
- std::atomic_bool is_device_reload_pending{true};
- // Data Storage
- bool use_virtual_sd;
- bool gamecard_inserted;
- bool gamecard_current_game;
- std::string gamecard_path;
- // Debugging
- bool record_frame_times;
- bool use_gdbstub;
- u16 gdbstub_port;
- std::string program_args;
- bool dump_exefs;
- bool dump_nso;
- bool reporting_services;
- bool quest_flag;
- bool disable_macro_jit;
- bool extended_logging;
- // Miscellaneous
- std::string log_filter;
- bool use_dev_keys;
- // Services
- std::string bcat_backend;
- bool bcat_boxcat_local;
- // WebService
- bool enable_telemetry;
- std::string web_api_url;
- std::string yuzu_username;
- std::string yuzu_token;
- // Add-Ons
- std::map<u64, std::vector<std::string>> disabled_addons;
- };
- extern Values values;
- bool IsConfiguringGlobal();
- void SetConfiguringGlobal(bool is_global);
- bool IsGPULevelExtreme();
- bool IsGPULevelHigh();
- float Volume();
- std::string GetTimeZoneString();
- void Apply(Core::System& system);
- void LogSettings();
- // Restore the global state of all applicable settings in the Values struct
- void RestoreGlobalState(bool is_powered_on);
- } // namespace Settings
|