duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

settings.h (25330B)


      1 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
      2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
      3 
      4 #pragma once
      5 
      6 #include "types.h"
      7 
      8 #include "util/audio_stream.h"
      9 
     10 #include "common/log.h"
     11 #include "common/settings_interface.h"
     12 #include "common/small_string.h"
     13 
     14 #include <array>
     15 #include <optional>
     16 #include <span>
     17 #include <string>
     18 #include <string_view>
     19 #include <vector>
     20 
     21 enum class RenderAPI : u32;
     22 enum class MediaCaptureBackend : u8;
     23 
     24 struct SettingInfo
     25 {
     26   enum class Type
     27   {
     28     Boolean,
     29     Integer,
     30     IntegerList,
     31     Float,
     32     String,
     33     Path,
     34   };
     35 
     36   Type type;
     37   const char* name;
     38   const char* display_name;
     39   const char* description;
     40   const char* default_value;
     41   const char* min_value;
     42   const char* max_value;
     43   const char* step_value;
     44   const char* format;
     45   const char** options;
     46   float multiplier;
     47 
     48   const char* StringDefaultValue() const;
     49   bool BooleanDefaultValue() const;
     50   s32 IntegerDefaultValue() const;
     51   s32 IntegerMinValue() const;
     52   s32 IntegerMaxValue() const;
     53   s32 IntegerStepValue() const;
     54   float FloatDefaultValue() const;
     55   float FloatMinValue() const;
     56   float FloatMaxValue() const;
     57   float FloatStepValue() const;
     58 };
     59 
     60 struct Settings
     61 {
     62   Settings();
     63 
     64   ConsoleRegion region = DEFAULT_CONSOLE_REGION;
     65 
     66   CPUExecutionMode cpu_execution_mode = DEFAULT_CPU_EXECUTION_MODE;
     67   CPUFastmemMode cpu_fastmem_mode = DEFAULT_CPU_FASTMEM_MODE;
     68   bool cpu_overclock_enable : 1 = false;
     69   bool cpu_overclock_active : 1 = false;
     70   bool cpu_recompiler_memory_exceptions : 1 = false;
     71   bool cpu_recompiler_block_linking : 1 = true;
     72   bool cpu_recompiler_icache : 1 = false;
     73   u32 cpu_overclock_numerator = 1;
     74   u32 cpu_overclock_denominator = 1;
     75 
     76   float emulation_speed = 1.0f;
     77   float fast_forward_speed = 0.0f;
     78   float turbo_speed = 0.0f;
     79   bool sync_to_host_refresh_rate : 1 = false;
     80   bool increase_timer_resolution : 1 = true;
     81   bool inhibit_screensaver : 1 = true;
     82   bool start_paused : 1 = false;
     83   bool start_fullscreen : 1 = false;
     84   bool pause_on_focus_loss : 1 = false;
     85   bool pause_on_controller_disconnection : 1 = false;
     86   bool save_state_on_exit : 1 = true;
     87   bool create_save_state_backups : 1 = DEFAULT_SAVE_STATE_BACKUPS;
     88   bool confim_power_off : 1 = true;
     89   bool load_devices_from_save_states : 1 = false;
     90   bool apply_compatibility_settings : 1 = true;
     91   bool apply_game_settings : 1 = true;
     92   bool enable_cheats : 1 = false;
     93   bool disable_all_enhancements : 1 = false;
     94   bool enable_discord_presence : 1 = false;
     95   bool pine_enable : 1 = false;
     96 
     97   bool rewind_enable : 1 = false;
     98   float rewind_save_frequency = 10.0f;
     99   u32 rewind_save_slots = 10;
    100   u32 runahead_frames = 0;
    101   u16 pine_slot = DEFAULT_PINE_SLOT;
    102 
    103   GPURenderer gpu_renderer = DEFAULT_GPU_RENDERER;
    104   std::string gpu_adapter;
    105   u8 gpu_resolution_scale = 1;
    106   u8 gpu_multisamples = 1;
    107   bool gpu_use_thread : 1 = true;
    108   bool gpu_use_software_renderer_for_readbacks : 1 = false;
    109   bool gpu_threaded_presentation : 1 = DEFAULT_THREADED_PRESENTATION;
    110   bool gpu_use_debug_device : 1 = false;
    111   bool gpu_disable_shader_cache : 1 = false;
    112   bool gpu_disable_dual_source_blend : 1 = false;
    113   bool gpu_disable_framebuffer_fetch : 1 = false;
    114   bool gpu_disable_texture_buffers : 1 = false;
    115   bool gpu_disable_texture_copy_to_self : 1 = false;
    116   bool gpu_disable_memory_import : 1 = false;
    117   bool gpu_disable_raster_order_views : 1 = false;
    118   bool gpu_per_sample_shading : 1 = false;
    119   bool gpu_true_color : 1 = true;
    120   bool gpu_debanding : 1 = false;
    121   bool gpu_scaled_dithering : 1 = true;
    122   bool gpu_force_round_texcoords : 1 = false;
    123   bool gpu_accurate_blending : 1 = false;
    124   bool gpu_disable_interlacing : 1 = true;
    125   bool gpu_force_ntsc_timings : 1 = false;
    126   bool gpu_widescreen_hack : 1 = false;
    127   bool gpu_pgxp_enable : 1 = false;
    128   bool gpu_pgxp_culling : 1 = true;
    129   bool gpu_pgxp_texture_correction : 1 = true;
    130   bool gpu_pgxp_color_correction : 1 = false;
    131   bool gpu_pgxp_vertex_cache : 1 = false;
    132   bool gpu_pgxp_cpu : 1 = false;
    133   bool gpu_pgxp_preserve_proj_fp : 1 = false;
    134   bool gpu_pgxp_depth_buffer : 1 = false;
    135   bool gpu_pgxp_disable_2d : 1 = false;
    136   GPUTextureFilter gpu_texture_filter = DEFAULT_GPU_TEXTURE_FILTER;
    137   GPUTextureFilter gpu_sprite_texture_filter = DEFAULT_GPU_TEXTURE_FILTER;
    138   GPULineDetectMode gpu_line_detect_mode = DEFAULT_GPU_LINE_DETECT_MODE;
    139   GPUDownsampleMode gpu_downsample_mode = DEFAULT_GPU_DOWNSAMPLE_MODE;
    140   u8 gpu_downsample_scale = 1;
    141   GPUWireframeMode gpu_wireframe_mode = DEFAULT_GPU_WIREFRAME_MODE;
    142   DisplayDeinterlacingMode display_deinterlacing_mode = DEFAULT_DISPLAY_DEINTERLACING_MODE;
    143   DisplayCropMode display_crop_mode = DEFAULT_DISPLAY_CROP_MODE;
    144   DisplayAspectRatio display_aspect_ratio = DEFAULT_DISPLAY_ASPECT_RATIO;
    145   DisplayAlignment display_alignment = DEFAULT_DISPLAY_ALIGNMENT;
    146   DisplayRotation display_rotation = DEFAULT_DISPLAY_ROTATION;
    147   DisplayScalingMode display_scaling = DEFAULT_DISPLAY_SCALING;
    148   DisplayExclusiveFullscreenControl display_exclusive_fullscreen_control = DEFAULT_DISPLAY_EXCLUSIVE_FULLSCREEN_CONTROL;
    149   DisplayScreenshotMode display_screenshot_mode = DEFAULT_DISPLAY_SCREENSHOT_MODE;
    150   DisplayScreenshotFormat display_screenshot_format = DEFAULT_DISPLAY_SCREENSHOT_FORMAT;
    151   u8 display_screenshot_quality = DEFAULT_DISPLAY_SCREENSHOT_QUALITY;
    152   u16 display_aspect_ratio_custom_numerator = 0;
    153   u16 display_aspect_ratio_custom_denominator = 0;
    154   s16 display_active_start_offset = 0;
    155   s16 display_active_end_offset = 0;
    156   s8 display_line_start_offset = 0;
    157   s8 display_line_end_offset = 0;
    158   bool display_optimal_frame_pacing : 1 = false;
    159   bool display_pre_frame_sleep : 1 = false;
    160   bool display_skip_presenting_duplicate_frames : 1 = false;
    161   bool display_vsync : 1 = false;
    162   bool display_disable_mailbox_presentation : 1 = true;
    163   bool display_force_4_3_for_24bit : 1 = false;
    164   bool display_24bit_chroma_smoothing : 1 = false;
    165   bool display_show_osd_messages : 1 = true;
    166   bool display_show_fps : 1 = false;
    167   bool display_show_speed : 1 = false;
    168   bool display_show_gpu_stats : 1 = false;
    169   bool display_show_resolution : 1 = false;
    170   bool display_show_latency_stats : 1 = false;
    171   bool display_show_cpu_usage : 1 = false;
    172   bool display_show_gpu_usage : 1 = false;
    173   bool display_show_frame_times : 1 = false;
    174   bool display_show_status_indicators : 1 = true;
    175   bool display_show_inputs : 1 = false;
    176   bool display_show_enhancements : 1 = false;
    177   bool display_stretch_vertically : 1 = false;
    178   float display_pre_frame_sleep_buffer = DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER;
    179   float display_osd_scale = 100.0f;
    180   float gpu_pgxp_tolerance = -1.0f;
    181   float gpu_pgxp_depth_clear_threshold = DEFAULT_GPU_PGXP_DEPTH_THRESHOLD / GPU_PGXP_DEPTH_THRESHOLD_SCALE;
    182 
    183   SaveStateCompressionMode save_state_compression = DEFAULT_SAVE_STATE_COMPRESSION_MODE;
    184 
    185   u8 cdrom_readahead_sectors = DEFAULT_CDROM_READAHEAD_SECTORS;
    186   CDROMMechaconVersion cdrom_mechacon_version = DEFAULT_CDROM_MECHACON_VERSION;
    187   bool cdrom_region_check : 1 = false;
    188   bool cdrom_load_image_to_ram : 1 = false;
    189   bool cdrom_load_image_patches : 1 = false;
    190   bool cdrom_mute_cd_audio : 1 = false;
    191   u32 cdrom_read_speedup = 1;
    192   u32 cdrom_seek_speedup = 1;
    193 
    194   std::string audio_driver;
    195   std::string audio_output_device;
    196   u32 audio_output_volume = 100;
    197   u32 audio_fast_forward_volume = 100;
    198   AudioStreamParameters audio_stream_parameters;
    199   AudioBackend audio_backend = AudioStream::DEFAULT_BACKEND;
    200   bool audio_output_muted : 1 = false;
    201 
    202   bool use_old_mdec_routines : 1 = false;
    203   bool pcdrv_enable : 1 = false;
    204   bool export_shared_memory : 1 = false;
    205 
    206   // timing hacks section
    207   TickCount dma_max_slice_ticks = DEFAULT_DMA_MAX_SLICE_TICKS;
    208   TickCount dma_halt_ticks = DEFAULT_DMA_HALT_TICKS;
    209   u32 gpu_fifo_size = DEFAULT_GPU_FIFO_SIZE;
    210   TickCount gpu_max_run_ahead = DEFAULT_GPU_MAX_RUN_AHEAD;
    211 
    212   // achievements
    213   bool achievements_enabled : 1 = false;
    214   bool achievements_hardcore_mode : 1 = false;
    215   bool achievements_notifications : 1 = true;
    216   bool achievements_leaderboard_notifications : 1 = true;
    217   bool achievements_sound_effects : 1 = true;
    218   bool achievements_overlays : 1 = true;
    219   bool achievements_encore_mode : 1 = false;
    220   bool achievements_spectator_mode : 1 = false;
    221   bool achievements_unofficial_test_mode : 1 = false;
    222   bool achievements_use_first_disc_from_playlist : 1 = true;
    223   bool achievements_use_raintegration : 1 = false;
    224   s32 achievements_notification_duration = DEFAULT_ACHIEVEMENT_NOTIFICATION_TIME;
    225   s32 achievements_leaderboard_duration = DEFAULT_LEADERBOARD_NOTIFICATION_TIME;
    226 
    227   struct DebugSettings
    228   {
    229     bool show_vram : 1 = false;
    230     bool dump_cpu_to_vram_copies : 1 = false;
    231     bool dump_vram_to_cpu_copies : 1 = false;
    232 
    233     bool enable_gdb_server : 1 = false;
    234     u16 gdb_server_port = 1234;
    235 
    236     // Mutable because the imgui window can close itself.
    237     mutable bool show_gpu_state = false;
    238     mutable bool show_cdrom_state = false;
    239     mutable bool show_spu_state = false;
    240     mutable bool show_timers_state = false;
    241     mutable bool show_mdec_state = false;
    242     mutable bool show_dma_state = false;
    243   } debugging;
    244 
    245   // texture replacements
    246   struct TextureReplacementSettings
    247   {
    248     bool enable_vram_write_replacements : 1 = false;
    249     bool preload_textures : 1 = false;
    250 
    251     bool dump_vram_writes : 1 = false;
    252     bool dump_vram_write_force_alpha_channel : 1 = true;
    253     u32 dump_vram_write_width_threshold = 128;
    254     u32 dump_vram_write_height_threshold = 128;
    255 
    256     ALWAYS_INLINE bool AnyReplacementsEnabled() const { return enable_vram_write_replacements; }
    257 
    258     ALWAYS_INLINE bool ShouldDumpVRAMWrite(u32 width, u32 height)
    259     {
    260       return dump_vram_writes && width >= dump_vram_write_width_threshold && height >= dump_vram_write_height_threshold;
    261     }
    262   } texture_replacements;
    263 
    264   bool bios_tty_logging : 1 = false;
    265   bool bios_patch_fast_boot : 1 = DEFAULT_FAST_BOOT_VALUE;
    266   bool enable_8mb_ram : 1 = false;
    267 
    268   std::array<ControllerType, NUM_CONTROLLER_AND_CARD_PORTS> controller_types{};
    269   std::array<MemoryCardType, NUM_CONTROLLER_AND_CARD_PORTS> memory_card_types{};
    270   std::array<std::string, NUM_CONTROLLER_AND_CARD_PORTS> memory_card_paths{};
    271   bool memory_card_use_playlist_title = true;
    272 
    273   MultitapMode multitap_mode = DEFAULT_MULTITAP_MODE;
    274 
    275   std::string pcdrv_root;
    276   bool pcdrv_enable_writes = false;
    277 
    278   LOGLEVEL log_level = DEFAULT_LOG_LEVEL;
    279   std::string log_filter;
    280   bool log_timestamps : 1 = true;
    281   bool log_to_console : 1 = DEFAULT_LOG_TO_CONSOLE;
    282   bool log_to_debug : 1 = false;
    283   bool log_to_window : 1 = false;
    284   bool log_to_file : 1 = false;
    285 
    286   ALWAYS_INLINE bool IsUsingSoftwareRenderer() const { return (gpu_renderer == GPURenderer::Software); }
    287   ALWAYS_INLINE bool IsUsingAccurateBlending() const { return (gpu_accurate_blending && !gpu_true_color); }
    288   ALWAYS_INLINE bool IsRunaheadEnabled() const { return (runahead_frames > 0); }
    289 
    290   ALWAYS_INLINE PGXPMode GetPGXPMode()
    291   {
    292     return gpu_pgxp_enable ? (gpu_pgxp_cpu ? PGXPMode::CPU : PGXPMode::Memory) : PGXPMode::Disabled;
    293   }
    294 
    295   ALWAYS_INLINE bool UsingPGXPDepthBuffer() const { return gpu_pgxp_enable && gpu_pgxp_depth_buffer; }
    296   ALWAYS_INLINE bool UsingPGXPCPUMode() const { return gpu_pgxp_enable && gpu_pgxp_cpu; }
    297   ALWAYS_INLINE float GetPGXPDepthClearThreshold() const
    298   {
    299     return gpu_pgxp_depth_clear_threshold * GPU_PGXP_DEPTH_THRESHOLD_SCALE;
    300   }
    301   ALWAYS_INLINE void SetPGXPDepthClearThreshold(float value)
    302   {
    303     gpu_pgxp_depth_clear_threshold = value / GPU_PGXP_DEPTH_THRESHOLD_SCALE;
    304   }
    305 
    306   ALWAYS_INLINE s32 GetAudioOutputVolume(bool fast_forwarding) const
    307   {
    308     return audio_output_muted ? 0 : (fast_forwarding ? audio_fast_forward_volume : audio_output_volume);
    309   }
    310 
    311   float GetDisplayAspectRatioValue() const;
    312 
    313   ALWAYS_INLINE bool IsPort1MultitapEnabled() const
    314   {
    315     return (multitap_mode == MultitapMode::Port1Only || multitap_mode == MultitapMode::BothPorts);
    316   }
    317   ALWAYS_INLINE bool IsPort2MultitapEnabled() const
    318   {
    319     return (multitap_mode == MultitapMode::Port1Only || multitap_mode == MultitapMode::BothPorts);
    320   }
    321   ALWAYS_INLINE bool IsMultitapPortEnabled(u32 port) const
    322   {
    323     return (port == 0) ? IsPort1MultitapEnabled() : IsPort2MultitapEnabled();
    324   }
    325 
    326   ALWAYS_INLINE static bool IsPerGameMemoryCardType(MemoryCardType type)
    327   {
    328     return (type == MemoryCardType::PerGame || type == MemoryCardType::PerGameTitle ||
    329             type == MemoryCardType::PerGameFileTitle);
    330   }
    331   bool HasAnyPerGameMemoryCards() const;
    332 
    333   /// Returns the default path to a memory card.
    334   static std::string GetDefaultSharedMemoryCardName(u32 slot);
    335   std::string GetSharedMemoryCardPath(u32 slot) const;
    336 
    337   /// Returns the default path to a memory card for a specific game.
    338   static std::string GetGameMemoryCardPath(std::string_view serial, u32 slot);
    339 
    340   static void CPUOverclockPercentToFraction(u32 percent, u32* numerator, u32* denominator);
    341   static u32 CPUOverclockFractionToPercent(u32 numerator, u32 denominator);
    342 
    343   void SetCPUOverclockPercent(u32 percent);
    344   u32 GetCPUOverclockPercent() const;
    345   void UpdateOverclockActive();
    346 
    347   enum : u32
    348   {
    349     DEFAULT_DMA_MAX_SLICE_TICKS = 1000,
    350     DEFAULT_DMA_HALT_TICKS = 100,
    351     DEFAULT_GPU_FIFO_SIZE = 16,
    352     DEFAULT_GPU_MAX_RUN_AHEAD = 128,
    353     DEFAULT_VRAM_WRITE_DUMP_WIDTH_THRESHOLD = 128,
    354     DEFAULT_VRAM_WRITE_DUMP_HEIGHT_THRESHOLD = 128,
    355   };
    356 
    357   void Load(SettingsInterface& si, SettingsInterface& controller_si);
    358   void Save(SettingsInterface& si, bool ignore_base) const;
    359   static void Clear(SettingsInterface& si);
    360 
    361   void FixIncompatibleSettings(bool display_osd_messages);
    362 
    363   /// Initializes configuration.
    364   void UpdateLogSettings();
    365 
    366   static void SetDefaultControllerConfig(SettingsInterface& si);
    367   static void SetDefaultHotkeyConfig(SettingsInterface& si);
    368 
    369   static std::optional<LOGLEVEL> ParseLogLevelName(const char* str);
    370   static const char* GetLogLevelName(LOGLEVEL level);
    371   static const char* GetLogLevelDisplayName(LOGLEVEL level);
    372   static std::span<const char*> GetLogFilters();
    373 
    374   static std::optional<ConsoleRegion> ParseConsoleRegionName(const char* str);
    375   static const char* GetConsoleRegionName(ConsoleRegion region);
    376   static const char* GetConsoleRegionDisplayName(ConsoleRegion region);
    377 
    378   static std::optional<DiscRegion> ParseDiscRegionName(const char* str);
    379   static const char* GetDiscRegionName(DiscRegion region);
    380   static const char* GetDiscRegionDisplayName(DiscRegion region);
    381 
    382   static std::optional<CPUExecutionMode> ParseCPUExecutionMode(const char* str);
    383   static const char* GetCPUExecutionModeName(CPUExecutionMode mode);
    384   static const char* GetCPUExecutionModeDisplayName(CPUExecutionMode mode);
    385 
    386   static std::optional<CPUFastmemMode> ParseCPUFastmemMode(const char* str);
    387   static const char* GetCPUFastmemModeName(CPUFastmemMode mode);
    388   static const char* GetCPUFastmemModeDisplayName(CPUFastmemMode mode);
    389 
    390   static std::optional<GPURenderer> ParseRendererName(const char* str);
    391   static const char* GetRendererName(GPURenderer renderer);
    392   static const char* GetRendererDisplayName(GPURenderer renderer);
    393   static RenderAPI GetRenderAPIForRenderer(GPURenderer renderer);
    394   static GPURenderer GetRendererForRenderAPI(RenderAPI api);
    395   static GPURenderer GetAutomaticRenderer();
    396 
    397   static std::optional<GPUTextureFilter> ParseTextureFilterName(const char* str);
    398   static const char* GetTextureFilterName(GPUTextureFilter filter);
    399   static const char* GetTextureFilterDisplayName(GPUTextureFilter filter);
    400 
    401   static std::optional<GPULineDetectMode> ParseLineDetectModeName(const char* str);
    402   static const char* GetLineDetectModeName(GPULineDetectMode filter);
    403   static const char* GetLineDetectModeDisplayName(GPULineDetectMode filter);
    404 
    405   static std::optional<GPUDownsampleMode> ParseDownsampleModeName(const char* str);
    406   static const char* GetDownsampleModeName(GPUDownsampleMode mode);
    407   static const char* GetDownsampleModeDisplayName(GPUDownsampleMode mode);
    408 
    409   static std::optional<GPUWireframeMode> ParseGPUWireframeMode(const char* str);
    410   static const char* GetGPUWireframeModeName(GPUWireframeMode mode);
    411   static const char* GetGPUWireframeModeDisplayName(GPUWireframeMode mode);
    412 
    413   static std::optional<DisplayDeinterlacingMode> ParseDisplayDeinterlacingMode(const char* str);
    414   static const char* GetDisplayDeinterlacingModeName(DisplayDeinterlacingMode mode);
    415   static const char* GetDisplayDeinterlacingModeDisplayName(DisplayDeinterlacingMode mode);
    416 
    417   static std::optional<DisplayCropMode> ParseDisplayCropMode(const char* str);
    418   static const char* GetDisplayCropModeName(DisplayCropMode crop_mode);
    419   static const char* GetDisplayCropModeDisplayName(DisplayCropMode crop_mode);
    420 
    421   static std::optional<DisplayAspectRatio> ParseDisplayAspectRatio(const char* str);
    422   static const char* GetDisplayAspectRatioName(DisplayAspectRatio ar);
    423   static const char* GetDisplayAspectRatioDisplayName(DisplayAspectRatio ar);
    424 
    425   static std::optional<DisplayAlignment> ParseDisplayAlignment(const char* str);
    426   static const char* GetDisplayAlignmentName(DisplayAlignment alignment);
    427   static const char* GetDisplayAlignmentDisplayName(DisplayAlignment alignment);
    428 
    429   static std::optional<DisplayRotation> ParseDisplayRotation(const char* str);
    430   static const char* GetDisplayRotationName(DisplayRotation alignment);
    431   static const char* GetDisplayRotationDisplayName(DisplayRotation alignment);
    432 
    433   static std::optional<DisplayScalingMode> ParseDisplayScaling(const char* str);
    434   static const char* GetDisplayScalingName(DisplayScalingMode mode);
    435   static const char* GetDisplayScalingDisplayName(DisplayScalingMode mode);
    436 
    437   static std::optional<DisplayExclusiveFullscreenControl> ParseDisplayExclusiveFullscreenControl(const char* str);
    438   static const char* GetDisplayExclusiveFullscreenControlName(DisplayExclusiveFullscreenControl mode);
    439   static const char* GetDisplayExclusiveFullscreenControlDisplayName(DisplayExclusiveFullscreenControl mode);
    440 
    441   static std::optional<DisplayScreenshotMode> ParseDisplayScreenshotMode(const char* str);
    442   static const char* GetDisplayScreenshotModeName(DisplayScreenshotMode mode);
    443   static const char* GetDisplayScreenshotModeDisplayName(DisplayScreenshotMode mode);
    444 
    445   static std::optional<DisplayScreenshotFormat> ParseDisplayScreenshotFormat(const char* str);
    446   static const char* GetDisplayScreenshotFormatName(DisplayScreenshotFormat mode);
    447   static const char* GetDisplayScreenshotFormatDisplayName(DisplayScreenshotFormat mode);
    448   static const char* GetDisplayScreenshotFormatExtension(DisplayScreenshotFormat mode);
    449 
    450   static std::optional<MemoryCardType> ParseMemoryCardTypeName(const char* str);
    451   static const char* GetMemoryCardTypeName(MemoryCardType type);
    452   static const char* GetMemoryCardTypeDisplayName(MemoryCardType type);
    453 
    454   static std::optional<MultitapMode> ParseMultitapModeName(const char* str);
    455   static const char* GetMultitapModeName(MultitapMode mode);
    456   static const char* GetMultitapModeDisplayName(MultitapMode mode);
    457 
    458   static std::optional<CDROMMechaconVersion> ParseCDROMMechVersionName(const char* str);
    459   static const char* GetCDROMMechVersionName(CDROMMechaconVersion mode);
    460   static const char* GetCDROMMechVersionDisplayName(CDROMMechaconVersion mode);
    461 
    462   static std::optional<SaveStateCompressionMode> ParseSaveStateCompressionModeName(const char* str);
    463   static const char* GetSaveStateCompressionModeName(SaveStateCompressionMode mode);
    464   static const char* GetSaveStateCompressionModeDisplayName(SaveStateCompressionMode mode);
    465 
    466   static constexpr GPURenderer DEFAULT_GPU_RENDERER = GPURenderer::Automatic;
    467   static constexpr GPUTextureFilter DEFAULT_GPU_TEXTURE_FILTER = GPUTextureFilter::Nearest;
    468   static constexpr GPULineDetectMode DEFAULT_GPU_LINE_DETECT_MODE = GPULineDetectMode::Disabled;
    469   static constexpr GPUDownsampleMode DEFAULT_GPU_DOWNSAMPLE_MODE = GPUDownsampleMode::Disabled;
    470   static constexpr GPUWireframeMode DEFAULT_GPU_WIREFRAME_MODE = GPUWireframeMode::Disabled;
    471   static constexpr ConsoleRegion DEFAULT_CONSOLE_REGION = ConsoleRegion::Auto;
    472   static constexpr float DEFAULT_GPU_PGXP_DEPTH_THRESHOLD = 300.0f;
    473   static constexpr float GPU_PGXP_DEPTH_THRESHOLD_SCALE = 4096.0f;
    474 
    475   // Prefer oldrec over newrec for now. Except on RISC-V, where there is no oldrec.
    476 #if defined(CPU_ARCH_RISCV64)
    477   static constexpr CPUExecutionMode DEFAULT_CPU_EXECUTION_MODE = CPUExecutionMode::NewRec;
    478 #else
    479   static constexpr CPUExecutionMode DEFAULT_CPU_EXECUTION_MODE = CPUExecutionMode::Recompiler;
    480 #endif
    481 
    482   // LUT still ends up faster on Apple Silicon for now, because of 16K pages.
    483 #if defined(ENABLE_MMAP_FASTMEM) && (!defined(__APPLE__) || !defined(__aarch64__))
    484   static constexpr CPUFastmemMode DEFAULT_CPU_FASTMEM_MODE = CPUFastmemMode::MMap;
    485 #else
    486   static constexpr CPUFastmemMode DEFAULT_CPU_FASTMEM_MODE = CPUFastmemMode::LUT;
    487 #endif
    488 
    489   static constexpr DisplayDeinterlacingMode DEFAULT_DISPLAY_DEINTERLACING_MODE = DisplayDeinterlacingMode::Adaptive;
    490   static constexpr DisplayCropMode DEFAULT_DISPLAY_CROP_MODE = DisplayCropMode::Overscan;
    491   static constexpr DisplayAspectRatio DEFAULT_DISPLAY_ASPECT_RATIO = DisplayAspectRatio::Auto;
    492   static constexpr DisplayAlignment DEFAULT_DISPLAY_ALIGNMENT = DisplayAlignment::Center;
    493   static constexpr DisplayRotation DEFAULT_DISPLAY_ROTATION = DisplayRotation::Normal;
    494   static constexpr DisplayScalingMode DEFAULT_DISPLAY_SCALING = DisplayScalingMode::BilinearSmooth;
    495   static constexpr DisplayExclusiveFullscreenControl DEFAULT_DISPLAY_EXCLUSIVE_FULLSCREEN_CONTROL =
    496     DisplayExclusiveFullscreenControl::Automatic;
    497   static constexpr DisplayScreenshotMode DEFAULT_DISPLAY_SCREENSHOT_MODE = DisplayScreenshotMode::ScreenResolution;
    498   static constexpr DisplayScreenshotFormat DEFAULT_DISPLAY_SCREENSHOT_FORMAT = DisplayScreenshotFormat::PNG;
    499   static constexpr u8 DEFAULT_DISPLAY_SCREENSHOT_QUALITY = 85;
    500   static constexpr float DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER = 2.0f;
    501   static constexpr float DEFAULT_OSD_SCALE = 100.0f;
    502 
    503   static constexpr u8 DEFAULT_CDROM_READAHEAD_SECTORS = 8;
    504   static constexpr CDROMMechaconVersion DEFAULT_CDROM_MECHACON_VERSION = CDROMMechaconVersion::VC1A;
    505 
    506   static constexpr ControllerType DEFAULT_CONTROLLER_1_TYPE = ControllerType::AnalogController;
    507   static constexpr ControllerType DEFAULT_CONTROLLER_2_TYPE = ControllerType::None;
    508   static constexpr MemoryCardType DEFAULT_MEMORY_CARD_1_TYPE = MemoryCardType::PerGameTitle;
    509   static constexpr MemoryCardType DEFAULT_MEMORY_CARD_2_TYPE = MemoryCardType::None;
    510   static constexpr MultitapMode DEFAULT_MULTITAP_MODE = MultitapMode::Disabled;
    511 
    512   static constexpr s32 DEFAULT_ACHIEVEMENT_NOTIFICATION_TIME = 5;
    513   static constexpr s32 DEFAULT_LEADERBOARD_NOTIFICATION_TIME = 10;
    514 
    515   static constexpr LOGLEVEL DEFAULT_LOG_LEVEL = LOGLEVEL_INFO;
    516 
    517   static constexpr SaveStateCompressionMode DEFAULT_SAVE_STATE_COMPRESSION_MODE = SaveStateCompressionMode::ZstDefault;
    518 
    519 #ifndef __ANDROID__
    520   static const MediaCaptureBackend DEFAULT_MEDIA_CAPTURE_BACKEND;
    521   static constexpr const char* DEFAULT_MEDIA_CAPTURE_CONTAINER = "mp4";
    522   static constexpr u32 DEFAULT_MEDIA_CAPTURE_VIDEO_WIDTH = 640;
    523   static constexpr u32 DEFAULT_MEDIA_CAPTURE_VIDEO_HEIGHT = 480;
    524   static constexpr u32 DEFAULT_MEDIA_CAPTURE_VIDEO_BITRATE = 6000;
    525   static constexpr u32 DEFAULT_MEDIA_CAPTURE_AUDIO_BITRATE = 128;
    526 #endif
    527 
    528   // Enable console logging by default on Linux platforms.
    529 #if defined(__linux__) && !defined(__ANDROID__)
    530   static constexpr bool DEFAULT_LOG_TO_CONSOLE = true;
    531 #else
    532   static constexpr bool DEFAULT_LOG_TO_CONSOLE = false;
    533 #endif
    534 
    535   // Android doesn't create settings until they're first opened, so we have to override the defaults here.
    536 #ifndef __ANDROID__
    537   static constexpr bool DEFAULT_SAVE_STATE_BACKUPS = true;
    538   static constexpr bool DEFAULT_FAST_BOOT_VALUE = false;
    539   static constexpr bool DEFAULT_THREADED_PRESENTATION = false;
    540 #else
    541   static constexpr bool DEFAULT_SAVE_STATE_BACKUPS = false;
    542   static constexpr bool DEFAULT_FAST_BOOT_VALUE = true;
    543   static constexpr bool DEFAULT_THREADED_PRESENTATION = true;
    544 #endif
    545 
    546   // PINE uses a concept of "slot" to be able to communicate with multiple
    547   // emulators at the same time, each slot should be unique to each emulator to
    548   // allow PnP and configurable by the end user so that several runs don't
    549   // conflict with each others
    550   static constexpr u16 DEFAULT_PINE_SLOT = 28011;
    551 };
    552 
    553 extern Settings g_settings;
    554 
    555 namespace EmuFolders {
    556 extern std::string AppRoot;
    557 extern std::string DataRoot;
    558 extern std::string Bios;
    559 extern std::string Cache;
    560 extern std::string Cheats;
    561 extern std::string Covers;
    562 extern std::string Dumps;
    563 extern std::string GameIcons;
    564 extern std::string GameSettings;
    565 extern std::string InputProfiles;
    566 extern std::string MemoryCards;
    567 extern std::string Resources;
    568 extern std::string SaveStates;
    569 extern std::string Screenshots;
    570 extern std::string Shaders;
    571 extern std::string Textures;
    572 extern std::string UserResources;
    573 extern std::string Videos;
    574 
    575 // Assumes that AppRoot and DataRoot have been initialized.
    576 void SetDefaults();
    577 bool EnsureFoldersExist();
    578 void LoadConfig(SettingsInterface& si);
    579 void Save(SettingsInterface& si);
    580 
    581 /// Updates the variables in the EmuFolders namespace, reloading subsystems if needed.
    582 void Update();
    583 
    584 /// Returns the path to a resource file, allowing the user to override it.
    585 std::string GetOverridableResourcePath(std::string_view name);
    586 } // namespace EmuFolders