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