From 081c094c5ade60cf8d7eb60fb0b7129337724cc8 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Sun, 19 Apr 2026 11:42:31 -0700 Subject: [PATCH 1/7] Improve Mac Translation download (#18598) Switch from API to direct download. Fixes 403 error code. jammy-aarch64 needs `unzip` from universe in the Dockerfile. eg: ``` add-apt-repository universe apt update -qq apt-get install -y unzip ``` Fixes https://github.com/RPCS3/rpcs3/issues/18560 --- .ci/deploy-mac.sh | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index 930a87eee2..0b8c1994e0 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -31,21 +31,18 @@ rm -rf "rpcs3.app/Contents/Frameworks/QtPdf.framework" \ # Download translations mkdir -p "rpcs3.app/Contents/translations" -ZIP_URL=$(curl -fsSL "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \ - | grep "browser_download_url" \ - | grep "RPCS3-languages.zip" \ - | cut -d '"' -f 4) -if [ -z "$ZIP_URL" ]; then - echo "Failed to find RPCS3-languages.zip in the latest release. Continuing without translations." -else - echo "Downloading translations from: $ZIP_URL" - curl -L -o translations.zip "$ZIP_URL" || { - echo "Failed to download translations.zip. Continuing without translations." - exit 0 - } - unzip -o translations.zip -d "rpcs3.app/Contents/translations" >/dev/null 2>&1 || \ +ZIP_URL="https://github.com/RPCS3/rpcs3_translations/releases/latest/download/RPCS3-languages.zip" +echo "Downloading translations from: $ZIP_URL" +if curl -fsSL "$ZIP_URL" -o "translations.zip"; then + echo "Successfully downloaded translations." + if unzip -o translations.zip -d "rpcs3.app/Contents/translations" >/dev/null 2>&1; then + rm -f translations.zip + else echo "Failed to extract translations.zip. Continuing without translations." - rm -f translations.zip + rm -f translations.zip + fi +else + echo "Warning: Failed to download translations. Skipping..." fi # Copy Qt translations manually From c5db9899e4d90ade31e0dda4dffdae41ff86a77d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 19 Apr 2026 16:42:33 +0200 Subject: [PATCH 2/7] cfg: remove redundant prefix from variable names --- .../Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp | 4 ++-- rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp | 4 ++-- rpcs3/Emu/RSX/RSXThread.cpp | 2 +- rpcs3/Emu/system_config.h | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index 9147b7e5c5..d8e60b7592 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -239,7 +239,7 @@ namespace rsx home_menu_settings_performance_overlay::home_menu_settings_performance_overlay(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent) : home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY)) { - add_checkbox(&g_cfg.video.perf_overlay.perf_overlay_enabled, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_ENABLE); + add_checkbox(&g_cfg.video.perf_overlay.enabled, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_ENABLE); add_checkbox(&g_cfg.video.perf_overlay.framerate_graph_enabled, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_ENABLE_FRAMERATE_GRAPH); add_checkbox(&g_cfg.video.perf_overlay.frametime_graph_enabled, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_ENABLE_FRAMETIME_GRAPH); @@ -258,7 +258,7 @@ namespace rsx add_float_slider(&g_cfg.video.perf_overlay.margin_y, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_MARGIN_Y, " %", 0.25f); add_unsigned_slider(&g_cfg.video.perf_overlay.font_size, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_FONT_SIZE, " px", 1); add_unsigned_slider(&g_cfg.video.perf_overlay.opacity, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_OPACITY, " %", 1); - add_checkbox(&g_cfg.video.perf_overlay.perf_overlay_use_window_space, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_USE_WINDOW_SPACE); + add_checkbox(&g_cfg.video.perf_overlay.use_window_space, localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_USE_WINDOW_SPACE); apply_layout(); } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp index 635833c9d8..afaf7eb772 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp @@ -934,7 +934,7 @@ namespace rsx auto& perf_settings = g_cfg.video.perf_overlay; auto perf_overlay = manager->get(); - if (perf_settings.perf_overlay_enabled) + if (perf_settings.enabled) { if (!perf_overlay) { @@ -949,7 +949,7 @@ namespace rsx perf_overlay->set_font(perf_settings.font); perf_overlay->set_font_size(perf_settings.font_size); perf_overlay->set_margins(static_cast(perf_settings.margin_x.get()), static_cast(perf_settings.margin_y.get()), perf_settings.center_x.get(), perf_settings.center_y.get()); - perf_overlay->use_window_space = perf_settings.perf_overlay_use_window_space.get(); + perf_overlay->use_window_space = perf_settings.use_window_space.get(); perf_overlay->set_opacity(perf_settings.opacity / 100.f); perf_overlay->set_body_colors(perf_settings.color_body, perf_settings.background_body); perf_overlay->set_title_colors(perf_settings.color_title, perf_settings.background_title); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 33fd4a662b..425985c5ba 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -3414,7 +3414,7 @@ namespace rsx current_display_buffer = buffer; m_queued_flip.emu_flip = true; m_queued_flip.in_progress = true; - m_queued_flip.skip_frame |= g_cfg.video.disable_video_output && !g_cfg.video.perf_overlay.perf_overlay_enabled; + m_queued_flip.skip_frame |= g_cfg.video.disable_video_output && !g_cfg.video.perf_overlay.enabled; flip(m_queued_flip); diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index ba52f14d5d..f9f6f2c8d3 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -198,7 +198,7 @@ struct cfg_root : cfg::node { node_perf_overlay(cfg::node* _this) : cfg::node(_this, "Performance Overlay") {} - cfg::_bool perf_overlay_enabled{ this, "Enabled", false, true }; + cfg::_bool enabled{ this, "Enabled", false, true }; cfg::_bool framerate_graph_enabled{ this, "Enable Framerate Graph", false, true }; cfg::_bool frametime_graph_enabled{ this, "Enable Frametime Graph", false, true }; cfg::uint<2, 6000> framerate_datapoint_count{ this, "Framerate datapoints", 50, true }; @@ -219,7 +219,7 @@ struct cfg_root : cfg::node cfg::string background_body{ this, "Body Background (hex)", "#002339FF", true }; cfg::string color_title{ this, "Title Color (hex)", "#F26C24FF", true }; cfg::string background_title{ this, "Title Background (hex)", "#00000000", true }; - cfg::_bool perf_overlay_use_window_space{this, "Use Window Space", false, true}; + cfg::_bool use_window_space{this, "Use Window Space", false, true}; } perf_overlay{ this }; From b6b043b23de7fe576c99b0920a2b0d6b826148c1 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 19 Apr 2026 16:43:54 +0200 Subject: [PATCH 3/7] qt: remove unused emu_settings_type --- rpcs3/rpcs3qt/emu_settings_type.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 4824719769..6f6589c893 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -40,7 +40,6 @@ enum class emu_settings_type SleepTimersAccuracy, ClocksScale, PerformanceReport, - FullWidthAVX512, PPUNJFixup, PPUVNANFixup, AccurateDFMA, @@ -256,7 +255,6 @@ inline static const std::map settings_location { emu_settings_type::ClocksScale, { "Core", "Clocks scale"}}, { emu_settings_type::AccuratePPU128Loop, { "Core", "Accurate PPU 128-byte Reservation Op Max Length"}}, { emu_settings_type::PerformanceReport, { "Core", "Enable Performance Report"}}, - { emu_settings_type::FullWidthAVX512, { "Core", "Full Width AVX-512"}}, { emu_settings_type::NumPPUThreads, { "Core", "PPU Threads"}}, { emu_settings_type::PPUNJFixup, { "Core", "PPU LLVM Java Mode Handling"}}, { emu_settings_type::PPUVNANFixup, { "Core", "PPU Vector NaN Handling"}}, From 7a8c88056ac4123f0c7d1316fffe5e74ad699f0b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 19 Apr 2026 16:52:45 +0200 Subject: [PATCH 4/7] Qt: make emu_settings_type cfg_location dynamic --- rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 3 + rpcs3/rpcs3qt/CMakeLists.txt | 1 + rpcs3/rpcs3qt/emu_settings.cpp | 2 +- rpcs3/rpcs3qt/emu_settings_type.cpp | 240 ++++++++++++++++++++++++++++ rpcs3/rpcs3qt/emu_settings_type.h | 227 +------------------------- 6 files changed, 250 insertions(+), 224 deletions(-) create mode 100644 rpcs3/rpcs3qt/emu_settings_type.cpp diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 0181ce8c84..2ab3e592bc 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -837,6 +837,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 793e695d77..8c5b6b2905 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1299,6 +1299,9 @@ Gui\utils + + Gui\settings + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index fdfb437fe7..0a63343e96 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -22,6 +22,7 @@ add_library(rpcs3_ui STATIC dimensions_dialog.cpp _discord_utils.cpp emu_settings.cpp + emu_settings_type.cpp elf_memory_dumping_dialog.cpp emulated_pad_settings_dialog.cpp emulated_logitech_g27_settings_dialog.cpp diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index a5bd055432..38fd5d2a94 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -1531,7 +1531,7 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ std::string type_string; if (const auto it = settings_location.find(type); it != settings_location.cend()) { - for (const char* loc : it->second) + for (const std::string& loc : it->second) { if (!type_string.empty()) type_string += ": "; type_string += loc; diff --git a/rpcs3/rpcs3qt/emu_settings_type.cpp b/rpcs3/rpcs3qt/emu_settings_type.cpp new file mode 100644 index 0000000000..4b032c78c5 --- /dev/null +++ b/rpcs3/rpcs3qt/emu_settings_type.cpp @@ -0,0 +1,240 @@ +#include "stdafx.h" +#include "emu_settings_type.h" +#include "Emu/system_config.h" + +const cfg_root local_cfg {}; // Local config to ensure we have an initialized object + +cfg_location get_cfg_location(const cfg::_base& leaf) +{ + cfg_location loc {}; + loc.push_back(leaf.get_name()); + + for (const cfg::_base* node = leaf.get_parent(); node && !node->get_name().empty(); node = node->get_parent()) + { + loc.push_front(node->get_name()); + } + + return loc; +} + +const std::map settings_location = +{ + // Core Tab + { emu_settings_type::PPUDecoder, get_cfg_location(local_cfg.core.ppu_decoder) }, + { emu_settings_type::SPUDecoder, get_cfg_location(local_cfg.core.spu_decoder) }, + { emu_settings_type::HookStaticFuncs, get_cfg_location(local_cfg.core.hook_functions) }, + { emu_settings_type::ThreadSchedulerMode, get_cfg_location(local_cfg.core.thread_scheduler) }, + { emu_settings_type::SPULoopDetection, get_cfg_location(local_cfg.core.spu_loop_detection) }, + { emu_settings_type::PreferredSPUThreads, get_cfg_location(local_cfg.core.preferred_spu_threads) }, + { emu_settings_type::PPUDebug, get_cfg_location(local_cfg.core.ppu_debug) }, + { emu_settings_type::SPUDebug, get_cfg_location(local_cfg.core.spu_debug) }, + { emu_settings_type::MFCDebug, get_cfg_location(local_cfg.core.mfc_debug) }, + { emu_settings_type::MaxLLVMThreads, get_cfg_location(local_cfg.core.llvm_threads) }, + { emu_settings_type::LLVMPrecompilation, get_cfg_location(local_cfg.core.llvm_precompilation) }, + { emu_settings_type::AccurateSpuDMA, get_cfg_location(local_cfg.core.spu_accurate_dma) }, + { emu_settings_type::AccurateClineStores, get_cfg_location(local_cfg.core.accurate_cache_line_stores) }, + { emu_settings_type::AccurateRSXAccess, get_cfg_location(local_cfg.core.rsx_accurate_res_access) }, + { emu_settings_type::FIFOAccuracy, get_cfg_location(local_cfg.core.rsx_fifo_accuracy) }, + { emu_settings_type::XFloatAccuracy, get_cfg_location(local_cfg.core.spu_xfloat_accuracy) }, + { emu_settings_type::MFCCommandsShuffling, get_cfg_location(local_cfg.core.mfc_transfers_shuffling) }, + { emu_settings_type::SetDAZandFTZ, get_cfg_location(local_cfg.core.set_daz_and_ftz) }, + { emu_settings_type::SPUBlockSize, get_cfg_location(local_cfg.core.spu_block_size) }, + { emu_settings_type::SPUCache, get_cfg_location(local_cfg.core.spu_cache) }, + { emu_settings_type::DebugConsoleMode, get_cfg_location(local_cfg.core.debug_console_mode) }, + { emu_settings_type::MaxSPURSThreads, get_cfg_location(local_cfg.core.max_spurs_threads) }, + { emu_settings_type::SleepTimersAccuracy, get_cfg_location(local_cfg.core.sleep_timers_accuracy) }, + { emu_settings_type::ClocksScale, get_cfg_location(local_cfg.core.clocks_scale) }, + { emu_settings_type::AccuratePPU128Loop, get_cfg_location(local_cfg.core.ppu_128_reservations_loop_max_length) }, + { emu_settings_type::PerformanceReport, get_cfg_location(local_cfg.core.perf_report) }, + { emu_settings_type::NumPPUThreads, get_cfg_location(local_cfg.core.ppu_threads) }, + { emu_settings_type::PPUNJFixup, get_cfg_location(local_cfg.core.ppu_llvm_nj_fixup) }, + { emu_settings_type::PPUVNANFixup, get_cfg_location(local_cfg.core.ppu_fix_vnan) }, + { emu_settings_type::AccurateDFMA, get_cfg_location(local_cfg.core.use_accurate_dfma) }, + { emu_settings_type::AccuratePPUSAT, get_cfg_location(local_cfg.core.ppu_set_sat_bit) }, + { emu_settings_type::AccuratePPUNJ, get_cfg_location(local_cfg.core.ppu_use_nj_bit) }, + { emu_settings_type::AccuratePPUVNAN, get_cfg_location(local_cfg.core.ppu_set_vnan) }, + { emu_settings_type::AccuratePPUFPCC, get_cfg_location(local_cfg.core.ppu_set_fpcc) }, + { emu_settings_type::MaxPreemptCount, get_cfg_location(local_cfg.core.max_cpu_preempt_count_per_frame) }, + { emu_settings_type::SPUProfiler, get_cfg_location(local_cfg.core.spu_prof) }, + { emu_settings_type::DisableSpinOptimization, get_cfg_location(local_cfg.core.spu_getllar_spin_optimization_disabled) }, + { emu_settings_type::EnabledSPUEventsBusyLoop, get_cfg_location(local_cfg.core.spu_reservation_busy_waiting_enabled) }, + + // Graphics Tab + { emu_settings_type::Renderer, get_cfg_location(local_cfg.video.renderer) }, + { emu_settings_type::Resolution, get_cfg_location(local_cfg.video.resolution) }, + { emu_settings_type::AspectRatio, get_cfg_location(local_cfg.video.aspect_ratio) }, + { emu_settings_type::FrameLimit, get_cfg_location(local_cfg.video.frame_limit) }, + { emu_settings_type::MSAA, get_cfg_location(local_cfg.video.antialiasing_level) }, + { emu_settings_type::LogShaderPrograms, get_cfg_location(local_cfg.video.log_programs) }, + { emu_settings_type::WriteDepthBuffer, get_cfg_location(local_cfg.video.write_depth_buffer) }, + { emu_settings_type::WriteColorBuffers, get_cfg_location(local_cfg.video.write_color_buffers) }, + { emu_settings_type::ReadColorBuffers, get_cfg_location(local_cfg.video.read_color_buffers) }, + { emu_settings_type::ReadDepthBuffer, get_cfg_location(local_cfg.video.read_depth_buffer) }, + { emu_settings_type::HandleRSXTiledMemory, get_cfg_location(local_cfg.video.handle_tiled_memory) }, + { emu_settings_type::VSync, get_cfg_location(local_cfg.video.vsync) }, + { emu_settings_type::DebugOutput, get_cfg_location(local_cfg.video.debug_output) }, + { emu_settings_type::DebugOverlay, get_cfg_location(local_cfg.video.debug_overlay) }, + { emu_settings_type::RenderdocCompatibility, get_cfg_location(local_cfg.video.renderdoc_compatiblity) }, + { emu_settings_type::GPUTextureScaling, get_cfg_location(local_cfg.video.use_gpu_texture_scaling) }, + { emu_settings_type::StretchToDisplayArea, get_cfg_location(local_cfg.video.stretch_to_display_area) }, + { emu_settings_type::ForceHighpZ, get_cfg_location(local_cfg.video.force_high_precision_z_buffer) }, + { emu_settings_type::StrictRenderingMode, get_cfg_location(local_cfg.video.strict_rendering_mode) }, + { emu_settings_type::DisableVertexCache, get_cfg_location(local_cfg.video.disable_vertex_cache) }, + { emu_settings_type::DisableOcclusionQueries, get_cfg_location(local_cfg.video.disable_zcull_queries) }, + { emu_settings_type::DisableVideoOutput, get_cfg_location(local_cfg.video.disable_video_output) }, + { emu_settings_type::DisableFIFOReordering, get_cfg_location(local_cfg.video.disable_FIFO_reordering) }, + { emu_settings_type::StereoRenderEnabled, get_cfg_location(local_cfg.video.stereo_enabled) }, + { emu_settings_type::StereoRenderMode, get_cfg_location(local_cfg.video.stereo_render_mode) }, + { emu_settings_type::ScreenSize, get_cfg_location(local_cfg.video.screen_size) }, + { emu_settings_type::StrictTextureFlushing, get_cfg_location(local_cfg.video.strict_texture_flushing) }, + { emu_settings_type::ForceCPUBlitEmulation, get_cfg_location(local_cfg.video.force_cpu_blit_processing) }, + { emu_settings_type::DisableOnDiskShaderCache, get_cfg_location(local_cfg.video.disable_on_disk_shader_cache) }, + { emu_settings_type::DisableVulkanMemAllocator, get_cfg_location(local_cfg.video.disable_vulkan_mem_allocator) }, + { emu_settings_type::ShaderMode, get_cfg_location(local_cfg.video.shadermode) }, + { emu_settings_type::ShaderCompilerNumThreads, get_cfg_location(local_cfg.video.shader_compiler_threads_count) }, + { emu_settings_type::ShaderPrecisionQuality, get_cfg_location(local_cfg.video.shader_precision) }, + { emu_settings_type::MultithreadedRSX, get_cfg_location(local_cfg.video.multithreaded_rsx) }, + { emu_settings_type::RelaxedZCULL, get_cfg_location(local_cfg.video.relaxed_zcull_sync) }, + { emu_settings_type::PreciseZCULL, get_cfg_location(local_cfg.video.precise_zpass_count) }, + { emu_settings_type::AnisotropicFilterOverride, get_cfg_location(local_cfg.video.anisotropic_level_override) }, + { emu_settings_type::TextureLodBias, get_cfg_location(local_cfg.video.texture_lod_bias) }, + { emu_settings_type::ResolutionScale, get_cfg_location(local_cfg.video.resolution_scale_percent) }, + { emu_settings_type::MinimumScalableDimension, get_cfg_location(local_cfg.video.min_scalable_dimension) }, + { emu_settings_type::VBlankRate, get_cfg_location(local_cfg.video.vblank_rate) }, + { emu_settings_type::VBlankNTSCFixup, get_cfg_location(local_cfg.video.vblank_ntsc) }, + { emu_settings_type::DriverWakeUpDelay, get_cfg_location(local_cfg.video.driver_wakeup_delay) }, + { emu_settings_type::AllowHostGPULabels, get_cfg_location(local_cfg.video.host_label_synchronization) }, + { emu_settings_type::DisableMSLFastMath, get_cfg_location(local_cfg.video.disable_msl_fast_math) }, + { emu_settings_type::OutputScalingMode, get_cfg_location(local_cfg.video.output_scaling) }, + { emu_settings_type::ForceHwMSAAResolve, get_cfg_location(local_cfg.video.force_hw_MSAA_resolve) }, + { emu_settings_type::DisableAsyncHostMM, get_cfg_location(local_cfg.video.disable_async_host_memory_manager) }, + { emu_settings_type::RecordWithOverlays, get_cfg_location(local_cfg.video.record_with_overlays) }, + { emu_settings_type::DisableHWTexelRemapping, get_cfg_location(local_cfg.video.disable_hardware_texel_remapping) }, + { emu_settings_type::FsrSharpeningStrength, get_cfg_location(local_cfg.video.rcas_sharpening_intensity) }, + + // Vulkan + { emu_settings_type::VulkanAdapter, get_cfg_location(local_cfg.video.vk.adapter) }, + { emu_settings_type::VulkanAsyncTextureUploads, get_cfg_location(local_cfg.video.vk.asynchronous_texture_streaming) }, + { emu_settings_type::VulkanAsyncSchedulerDriver, get_cfg_location(local_cfg.video.vk.asynchronous_scheduler) }, + { emu_settings_type::ExclusiveFullscreenMode, get_cfg_location(local_cfg.video.vk.exclusive_fullscreen_mode) }, + { emu_settings_type::UseReBAR, get_cfg_location(local_cfg.video.vk.use_rebar_upload_heap) }, + + // Performance Overlay + { emu_settings_type::PerfOverlayEnabled, get_cfg_location(local_cfg.video.perf_overlay.enabled) }, + { emu_settings_type::PerfOverlayFramerateGraphEnabled, get_cfg_location(local_cfg.video.perf_overlay.framerate_graph_enabled) }, + { emu_settings_type::PerfOverlayFrametimeGraphEnabled, get_cfg_location(local_cfg.video.perf_overlay.frametime_graph_enabled) }, + { emu_settings_type::PerfOverlayFramerateDatapoints, get_cfg_location(local_cfg.video.perf_overlay.framerate_datapoint_count) }, + { emu_settings_type::PerfOverlayFrametimeDatapoints, get_cfg_location(local_cfg.video.perf_overlay.frametime_datapoint_count) }, + { emu_settings_type::PerfOverlayDetailLevel, get_cfg_location(local_cfg.video.perf_overlay.level) }, + { emu_settings_type::PerfOverlayFramerateDetailLevel, get_cfg_location(local_cfg.video.perf_overlay.framerate_graph_detail_level) }, + { emu_settings_type::PerfOverlayFrametimeDetailLevel, get_cfg_location(local_cfg.video.perf_overlay.frametime_graph_detail_level) }, + { emu_settings_type::PerfOverlayPosition, get_cfg_location(local_cfg.video.perf_overlay.position) }, + { emu_settings_type::PerfOverlayUpdateInterval, get_cfg_location(local_cfg.video.perf_overlay.update_interval) }, + { emu_settings_type::PerfOverlayFontSize, get_cfg_location(local_cfg.video.perf_overlay.font_size) }, + { emu_settings_type::PerfOverlayOpacity, get_cfg_location(local_cfg.video.perf_overlay.opacity) }, + { emu_settings_type::PerfOverlayMarginX, get_cfg_location(local_cfg.video.perf_overlay.margin_x) }, + { emu_settings_type::PerfOverlayMarginY, get_cfg_location(local_cfg.video.perf_overlay.margin_y) }, + { emu_settings_type::PerfOverlayCenterX, get_cfg_location(local_cfg.video.perf_overlay.center_x) }, + { emu_settings_type::PerfOverlayCenterY, get_cfg_location(local_cfg.video.perf_overlay.center_y) }, + { emu_settings_type::PerfOverlayUseWindowSpace, get_cfg_location(local_cfg.video.perf_overlay.use_window_space) }, + + // Shader Loading Dialog + { emu_settings_type::ShaderLoadBgEnabled, get_cfg_location(local_cfg.video.shader_preloading_dialog.use_custom_background) }, + { emu_settings_type::ShaderLoadBgDarkening, get_cfg_location(local_cfg.video.shader_preloading_dialog.darkening_strength) }, + { emu_settings_type::ShaderLoadBgBlur, get_cfg_location(local_cfg.video.shader_preloading_dialog.blur_strength) }, + + // Audio + { emu_settings_type::AudioRenderer, get_cfg_location(local_cfg.audio.renderer) }, + { emu_settings_type::DumpToFile, get_cfg_location(local_cfg.audio.dump_to_file) }, + { emu_settings_type::ConvertTo16Bit, get_cfg_location(local_cfg.audio.convert_to_s16) }, + { emu_settings_type::AudioFormat, get_cfg_location(local_cfg.audio.format) }, + { emu_settings_type::AudioFormats, get_cfg_location(local_cfg.audio.formats) }, + { emu_settings_type::AudioProvider, get_cfg_location(local_cfg.audio.provider) }, + { emu_settings_type::AudioAvport, get_cfg_location(local_cfg.audio.rsxaudio_port) }, + { emu_settings_type::AudioDevice, get_cfg_location(local_cfg.audio.audio_device) }, + { emu_settings_type::AudioChannelLayout, get_cfg_location(local_cfg.audio.channel_layout) }, + { emu_settings_type::MasterVolume, get_cfg_location(local_cfg.audio.volume) }, + { emu_settings_type::EnableBuffering, get_cfg_location(local_cfg.audio.enable_buffering) }, + { emu_settings_type::AudioBufferDuration, get_cfg_location(local_cfg.audio.desired_buffer_duration) }, + { emu_settings_type::EnableTimeStretching, get_cfg_location(local_cfg.audio.enable_time_stretching) }, + { emu_settings_type::TimeStretchingThreshold, get_cfg_location(local_cfg.audio.time_stretching_threshold) }, + { emu_settings_type::MicrophoneType, get_cfg_location(local_cfg.audio.microphone_type) }, + { emu_settings_type::MicrophoneDevices, get_cfg_location(local_cfg.audio.microphone_devices) }, + { emu_settings_type::MusicHandler, get_cfg_location(local_cfg.audio.music) }, + + // Input / Output + { emu_settings_type::BackgroundInput, get_cfg_location(local_cfg.io.background_input_enabled) }, + { emu_settings_type::ShowMoveCursor, get_cfg_location(local_cfg.io.show_move_cursor) }, + { emu_settings_type::LockOvlIptToP1, get_cfg_location(local_cfg.io.lock_overlay_input_to_player_one) }, + { emu_settings_type::PadHandlerMode, get_cfg_location(local_cfg.io.pad_mode) }, + { emu_settings_type::PadConnection, get_cfg_location(local_cfg.io.keep_pads_connected) }, + { emu_settings_type::KeyboardHandler, get_cfg_location(local_cfg.io.keyboard) }, + { emu_settings_type::MouseHandler, get_cfg_location(local_cfg.io.mouse) }, + { emu_settings_type::Camera, get_cfg_location(local_cfg.io.camera) }, + { emu_settings_type::CameraType, get_cfg_location(local_cfg.io.camera_type) }, + { emu_settings_type::CameraFlip, get_cfg_location(local_cfg.io.camera_flip_option) }, + { emu_settings_type::CameraID, get_cfg_location(local_cfg.io.camera_id) }, + { emu_settings_type::Move, get_cfg_location(local_cfg.io.move) }, + { emu_settings_type::Buzz, get_cfg_location(local_cfg.io.buzz) }, + { emu_settings_type::Turntable, get_cfg_location(local_cfg.io.turntable) }, + { emu_settings_type::GHLtar, get_cfg_location(local_cfg.io.ghltar) }, + { emu_settings_type::MidiDevices, get_cfg_location(local_cfg.io.midi_devices) }, + { emu_settings_type::SDLMappings, get_cfg_location(local_cfg.io.load_sdl_mappings) }, + { emu_settings_type::IoDebugOverlay, get_cfg_location(local_cfg.io.pad_debug_overlay) }, + { emu_settings_type::MouseDebugOverlay, get_cfg_location(local_cfg.io.mouse_debug_overlay) }, + + // Misc + { emu_settings_type::ExitRPCS3OnFinish, get_cfg_location(local_cfg.misc.autoexit) }, + { emu_settings_type::StartOnBoot, get_cfg_location(local_cfg.misc.autostart) }, + { emu_settings_type::PauseOnFocusLoss, get_cfg_location(local_cfg.misc.autopause) }, + { emu_settings_type::StartGameFullscreen, get_cfg_location(local_cfg.misc.start_fullscreen) }, + { emu_settings_type::PreventDisplaySleep, get_cfg_location(local_cfg.misc.prevent_display_sleep) }, + { emu_settings_type::ShowTrophyPopups, get_cfg_location(local_cfg.misc.show_trophy_popups) }, + { emu_settings_type::ShowRpcnPopups, get_cfg_location(local_cfg.misc.show_rpcn_popups) }, + { emu_settings_type::UseNativeInterface, get_cfg_location(local_cfg.misc.use_native_interface) }, + { emu_settings_type::ShowShaderCompilationHint, get_cfg_location(local_cfg.misc.show_shader_compilation_hint) }, + { emu_settings_type::ShowPPUCompilationHint, get_cfg_location(local_cfg.misc.show_ppu_compilation_hint) }, + { emu_settings_type::ShowAutosaveAutoloadHint, get_cfg_location(local_cfg.misc.show_autosave_autoload_hint) }, + { emu_settings_type::ShowPressureIntensityToggleHint, get_cfg_location(local_cfg.misc.show_pressure_intensity_toggle_hint) }, + { emu_settings_type::ShowAnalogLimiterToggleHint, get_cfg_location(local_cfg.misc.show_analog_limiter_toggle_hint) }, + { emu_settings_type::ShowMouseAndKeyboardToggleHint, get_cfg_location(local_cfg.misc.show_mouse_and_keyboard_toggle_hint) }, + { emu_settings_type::ShowFatalErrorHints, get_cfg_location(local_cfg.misc.show_fatal_error_hints) }, + { emu_settings_type::ShowCaptureHints, get_cfg_location(local_cfg.misc.show_capture_hints) }, + { emu_settings_type::SilenceAllLogs, get_cfg_location(local_cfg.misc.silence_all_logs) }, + { emu_settings_type::WindowTitleFormat, get_cfg_location(local_cfg.misc.title_format) }, + { emu_settings_type::PauseDuringHomeMenu, get_cfg_location(local_cfg.misc.pause_during_home_menu) }, + { emu_settings_type::PlayMusicDuringBoot, get_cfg_location(local_cfg.misc.play_music_during_boot) }, + { emu_settings_type::EnableGamemode, get_cfg_location(local_cfg.misc.enable_gamemode) }, + + // Networking + { emu_settings_type::InternetStatus, get_cfg_location(local_cfg.net.net_active) }, + { emu_settings_type::DNSAddress, get_cfg_location(local_cfg.net.dns) }, + { emu_settings_type::IpSwapList, get_cfg_location(local_cfg.net.swap_list) }, + { emu_settings_type::PSNStatus, get_cfg_location(local_cfg.net.psn_status) }, + { emu_settings_type::BindAddress, get_cfg_location(local_cfg.net.bind_address) }, + { emu_settings_type::EnableUpnp, get_cfg_location(local_cfg.net.upnp_enabled) }, + { emu_settings_type::PSNCountry, get_cfg_location(local_cfg.net.country) }, + { emu_settings_type::EnableClans, get_cfg_location(local_cfg.net.clans_enabled) }, + + // System + { emu_settings_type::LicenseArea, get_cfg_location(local_cfg.sys.license_area) }, + { emu_settings_type::Language, get_cfg_location(local_cfg.sys.language) }, + { emu_settings_type::KeyboardType, get_cfg_location(local_cfg.sys.keyboard_type) }, + { emu_settings_type::EnterButtonAssignment, get_cfg_location(local_cfg.sys.enter_button_assignment) }, + { emu_settings_type::DateFormat, get_cfg_location(local_cfg.sys.date_fmt) }, + { emu_settings_type::TimeFormat, get_cfg_location(local_cfg.sys.time_fmt) }, + { emu_settings_type::ConsoleTimeOffset, get_cfg_location(local_cfg.sys.console_time_offset) }, + + { emu_settings_type::EnableHostRoot, get_cfg_location(local_cfg.vfs.host_root) }, + { emu_settings_type::EmptyHdd0Tmp, get_cfg_location(local_cfg.vfs.empty_hdd0_tmp) }, + { emu_settings_type::LimitCacheSize, get_cfg_location(local_cfg.vfs.limit_cache_size) }, + { emu_settings_type::MaximumCacheSize, get_cfg_location(local_cfg.vfs.cache_max_size) }, + + // Savestates + { emu_settings_type::SuspendEmulationSavestateMode, get_cfg_location(local_cfg.savestate.suspend_emu) }, + { emu_settings_type::CompatibleEmulationSavestateMode, get_cfg_location(local_cfg.savestate.compatible_mode) }, + { emu_settings_type::StartSavestatePaused, get_cfg_location(local_cfg.savestate.start_paused) }, + + // Logs + { emu_settings_type::Log, get_cfg_location(local_cfg.log)}, +}; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 6f6589c893..de04b81e85 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -1,10 +1,11 @@ #pragma once +#include #include -#include +#include // Node location -using cfg_location = std::vector; +using cfg_location = std::deque; enum class emu_settings_type { @@ -226,224 +227,4 @@ enum class emu_settings_type }; /** A helper map that keeps track of where a given setting type is located*/ -inline static const std::map settings_location = -{ - // Core Tab - { emu_settings_type::PPUDecoder, { "Core", "PPU Decoder"}}, - { emu_settings_type::SPUDecoder, { "Core", "SPU Decoder"}}, - { emu_settings_type::HookStaticFuncs, { "Core", "Hook static functions"}}, - { emu_settings_type::ThreadSchedulerMode, { "Core", "Thread Scheduler Mode"}}, - { emu_settings_type::SPULoopDetection, { "Core", "SPU loop detection"}}, - { emu_settings_type::PreferredSPUThreads, { "Core", "Preferred SPU Threads"}}, - { emu_settings_type::PPUDebug, { "Core", "PPU Debug"}}, - { emu_settings_type::SPUDebug, { "Core", "SPU Debug"}}, - { emu_settings_type::MFCDebug, { "Core", "MFC Debug"}}, - { emu_settings_type::MaxLLVMThreads, { "Core", "Max LLVM Compile Threads"}}, - { emu_settings_type::LLVMPrecompilation, { "Core", "LLVM Precompilation"}}, - { emu_settings_type::AccurateSpuDMA, { "Core", "Accurate SPU DMA"}}, - { emu_settings_type::AccurateClineStores, { "Core", "Accurate Cache Line Stores"}}, - { emu_settings_type::AccurateRSXAccess, { "Core", "Accurate RSX reservation access"}}, - { emu_settings_type::FIFOAccuracy, { "Core", "RSX FIFO Fetch Accuracy"}}, - { emu_settings_type::XFloatAccuracy, { "Core", "SPU XFloat Accuracy"}}, - { emu_settings_type::MFCCommandsShuffling, { "Core", "MFC Commands Shuffling Limit"}}, - { emu_settings_type::SetDAZandFTZ, { "Core", "Set DAZ and FTZ"}}, - { emu_settings_type::SPUBlockSize, { "Core", "SPU Block Size"}}, - { emu_settings_type::SPUCache, { "Core", "SPU Cache"}}, - { emu_settings_type::DebugConsoleMode, { "Core", "Debug Console Mode"}}, - { emu_settings_type::MaxSPURSThreads, { "Core", "Max SPURS Threads"}}, - { emu_settings_type::SleepTimersAccuracy, { "Core", "Sleep Timers Accuracy"}}, - { emu_settings_type::ClocksScale, { "Core", "Clocks scale"}}, - { emu_settings_type::AccuratePPU128Loop, { "Core", "Accurate PPU 128-byte Reservation Op Max Length"}}, - { emu_settings_type::PerformanceReport, { "Core", "Enable Performance Report"}}, - { emu_settings_type::NumPPUThreads, { "Core", "PPU Threads"}}, - { emu_settings_type::PPUNJFixup, { "Core", "PPU LLVM Java Mode Handling"}}, - { emu_settings_type::PPUVNANFixup, { "Core", "PPU Vector NaN Handling"}}, - { emu_settings_type::AccurateDFMA, { "Core", "Use Accurate DFMA"}}, - { emu_settings_type::AccuratePPUSAT, { "Core", "PPU Set Saturation Bit"}}, - { emu_settings_type::AccuratePPUNJ, { "Core", "PPU Accurate Non-Java Mode"}}, - { emu_settings_type::AccuratePPUVNAN, { "Core", "PPU Accurate Vector NaN Values"}}, - { emu_settings_type::AccuratePPUFPCC, { "Core", "PPU Set FPCC Bits"}}, - { emu_settings_type::MaxPreemptCount, { "Core", "Max CPU Preempt Count"}}, - { emu_settings_type::SPUProfiler, { "Core", "SPU Profiler"}}, - { emu_settings_type::DisableSpinOptimization, { "Core", "Disable SPU GETLLAR Spin Optimization"}}, - { emu_settings_type::EnabledSPUEventsBusyLoop, { "Core", "SPU Reservation Busy Waiting Enabled"}}, - - // Graphics Tab - { emu_settings_type::Renderer, { "Video", "Renderer"}}, - { emu_settings_type::Resolution, { "Video", "Resolution"}}, - { emu_settings_type::AspectRatio, { "Video", "Aspect ratio"}}, - { emu_settings_type::FrameLimit, { "Video", "Frame limit"}}, - { emu_settings_type::MSAA, { "Video", "MSAA"}}, - { emu_settings_type::LogShaderPrograms, { "Video", "Log shader programs"}}, - { emu_settings_type::WriteDepthBuffer, { "Video", "Write Depth Buffer"}}, - { emu_settings_type::WriteColorBuffers, { "Video", "Write Color Buffers"}}, - { emu_settings_type::ReadColorBuffers, { "Video", "Read Color Buffers"}}, - { emu_settings_type::ReadDepthBuffer, { "Video", "Read Depth Buffer"}}, - { emu_settings_type::HandleRSXTiledMemory, { "Video", "Handle RSX Memory Tiling"}}, - { emu_settings_type::VSync, { "Video", "VSync Mode"}}, - { emu_settings_type::DebugOutput, { "Video", "Debug output"}}, - { emu_settings_type::DebugOverlay, { "Video", "Debug overlay"}}, - { emu_settings_type::RenderdocCompatibility, { "Video", "Renderdoc Compatibility Mode"}}, - { emu_settings_type::GPUTextureScaling, { "Video", "Use GPU texture scaling"}}, - { emu_settings_type::StretchToDisplayArea, { "Video", "Stretch To Display Area"}}, - { emu_settings_type::ForceHighpZ, { "Video", "Force High Precision Z buffer"}}, - { emu_settings_type::StrictRenderingMode, { "Video", "Strict Rendering Mode"}}, - { emu_settings_type::DisableVertexCache, { "Video", "Disable Vertex Cache"}}, - { emu_settings_type::DisableOcclusionQueries, { "Video", "Disable ZCull Occlusion Queries"}}, - { emu_settings_type::DisableVideoOutput, { "Video", "Disable Video Output"}}, - { emu_settings_type::DisableFIFOReordering, { "Video", "Disable FIFO Reordering"}}, - { emu_settings_type::StereoRenderEnabled, { "Video", "3D Display Enabled"}}, - { emu_settings_type::StereoRenderMode, { "Video", "3D Display Mode"}}, - { emu_settings_type::ScreenSize, { "Video", "Screen size in inches"}}, - { emu_settings_type::StrictTextureFlushing, { "Video", "Strict Texture Flushing"}}, - { emu_settings_type::ForceCPUBlitEmulation, { "Video", "Force CPU Blit"}}, - { emu_settings_type::DisableOnDiskShaderCache, { "Video", "Disable On-Disk Shader Cache"}}, - { emu_settings_type::DisableVulkanMemAllocator, { "Video", "Disable Vulkan Memory Allocator"}}, - { emu_settings_type::ShaderMode, { "Video", "Shader Mode"}}, - { emu_settings_type::ShaderCompilerNumThreads, { "Video", "Shader Compiler Threads"}}, - { emu_settings_type::ShaderPrecisionQuality, { "Video", "Shader Precision"}}, - { emu_settings_type::MultithreadedRSX, { "Video", "Multithreaded RSX"}}, - { emu_settings_type::RelaxedZCULL, { "Video", "Relaxed ZCULL Sync"}}, - { emu_settings_type::PreciseZCULL, { "Video", "Accurate ZCULL stats"}}, - { emu_settings_type::AnisotropicFilterOverride, { "Video", "Anisotropic Filter Override"}}, - { emu_settings_type::TextureLodBias, { "Video", "Texture LOD Bias Addend"}}, - { emu_settings_type::ResolutionScale, { "Video", "Resolution Scale"}}, - { emu_settings_type::MinimumScalableDimension, { "Video", "Minimum Scalable Dimension"}}, - { emu_settings_type::VulkanAdapter, { "Video", "Vulkan", "Adapter"}}, - { emu_settings_type::VBlankRate, { "Video", "Vblank Rate"}}, - { emu_settings_type::VBlankNTSCFixup, { "Video", "Vblank NTSC Fixup"}}, - { emu_settings_type::DriverWakeUpDelay, { "Video", "Driver Wake-Up Delay"}}, - { emu_settings_type::AllowHostGPULabels, { "Video", "Allow Host GPU Labels"}}, - { emu_settings_type::DisableMSLFastMath, { "Video", "Disable MSL Fast Math"}}, - { emu_settings_type::OutputScalingMode, { "Video", "Output Scaling Mode"}}, - { emu_settings_type::ForceHwMSAAResolve, { "Video", "Force Hardware MSAA Resolve"}}, - { emu_settings_type::DisableAsyncHostMM, { "Video", "Disable Asynchronous Memory Manager"}}, - { emu_settings_type::RecordWithOverlays, { "Video", "Record With Overlays"}}, - { emu_settings_type::DisableHWTexelRemapping, { "Video", "Disable Hardware ColorSpace Remapping"}}, - { emu_settings_type::FsrSharpeningStrength, { "Video", "FidelityFX CAS Sharpening Intensity"}}, - - // Vulkan - { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming"}}, - { emu_settings_type::VulkanAsyncSchedulerDriver, { "Video", "Vulkan", "Asynchronous Queue Scheduler"}}, - { emu_settings_type::ExclusiveFullscreenMode, { "Video", "Vulkan", "Exclusive Fullscreen Mode"}}, - { emu_settings_type::UseReBAR, { "Video", "Vulkan", "Use Re-BAR for GPU uploads"}}, - - // Performance Overlay - { emu_settings_type::PerfOverlayEnabled, { "Video", "Performance Overlay", "Enabled" } }, - { emu_settings_type::PerfOverlayFramerateGraphEnabled, { "Video", "Performance Overlay", "Enable Framerate Graph" } }, - { emu_settings_type::PerfOverlayFrametimeGraphEnabled, { "Video", "Performance Overlay", "Enable Frametime Graph" } }, - { emu_settings_type::PerfOverlayFramerateDatapoints, { "Video", "Performance Overlay", "Framerate datapoints" } }, - { emu_settings_type::PerfOverlayFrametimeDatapoints, { "Video", "Performance Overlay", "Frametime datapoints" } }, - { emu_settings_type::PerfOverlayDetailLevel, { "Video", "Performance Overlay", "Detail level" } }, - { emu_settings_type::PerfOverlayFramerateDetailLevel, { "Video", "Performance Overlay", "Framerate graph detail level" } }, - { emu_settings_type::PerfOverlayFrametimeDetailLevel, { "Video", "Performance Overlay", "Frametime graph detail level" } }, - { emu_settings_type::PerfOverlayPosition, { "Video", "Performance Overlay", "Position" } }, - { emu_settings_type::PerfOverlayUpdateInterval, { "Video", "Performance Overlay", "Metrics update interval (ms)" } }, - { emu_settings_type::PerfOverlayFontSize, { "Video", "Performance Overlay", "Font size (px)" } }, - { emu_settings_type::PerfOverlayOpacity, { "Video", "Performance Overlay", "Opacity (%)" } }, - { emu_settings_type::PerfOverlayMarginX, { "Video", "Performance Overlay", "Horizontal Margin (%)" } }, - { emu_settings_type::PerfOverlayMarginY, { "Video", "Performance Overlay", "Vertical Margin (%)" } }, - { emu_settings_type::PerfOverlayCenterX, { "Video", "Performance Overlay", "Center Horizontally" } }, - { emu_settings_type::PerfOverlayCenterY, { "Video", "Performance Overlay", "Center Vertically" } }, - { emu_settings_type::PerfOverlayUseWindowSpace, { "Video", "Performance Overlay", "Use Window Space"}}, - - // Shader Loading Dialog - { emu_settings_type::ShaderLoadBgEnabled, { "Video", "Shader Loading Dialog", "Allow custom background" } }, - { emu_settings_type::ShaderLoadBgDarkening, { "Video", "Shader Loading Dialog", "Darkening effect strength" } }, - { emu_settings_type::ShaderLoadBgBlur, { "Video", "Shader Loading Dialog", "Blur effect strength" } }, - - // Audio - { emu_settings_type::AudioRenderer, { "Audio", "Renderer"}}, - { emu_settings_type::DumpToFile, { "Audio", "Dump to file"}}, - { emu_settings_type::ConvertTo16Bit, { "Audio", "Convert to 16 bit"}}, - { emu_settings_type::AudioFormat, { "Audio", "Audio Format"}}, - { emu_settings_type::AudioFormats, { "Audio", "Audio Formats"}}, - { emu_settings_type::AudioProvider, { "Audio", "Audio Provider"}}, - { emu_settings_type::AudioAvport, { "Audio", "RSXAudio Avport"}}, - { emu_settings_type::AudioDevice, { "Audio", "Audio Device"}}, - { emu_settings_type::AudioChannelLayout, { "Audio", "Audio Channel Layout"}}, - { emu_settings_type::MasterVolume, { "Audio", "Master Volume"}}, - { emu_settings_type::EnableBuffering, { "Audio", "Enable Buffering"}}, - { emu_settings_type::AudioBufferDuration, { "Audio", "Desired Audio Buffer Duration"}}, - { emu_settings_type::EnableTimeStretching, { "Audio", "Enable Time Stretching"}}, - { emu_settings_type::TimeStretchingThreshold, { "Audio", "Time Stretching Threshold"}}, - { emu_settings_type::MicrophoneType, { "Audio", "Microphone Type" }}, - { emu_settings_type::MicrophoneDevices, { "Audio", "Microphone Devices" }}, - { emu_settings_type::MusicHandler, { "Audio", "Music Handler"}}, - - // Input / Output - { emu_settings_type::BackgroundInput, { "Input/Output", "Background input enabled"}}, - { emu_settings_type::ShowMoveCursor, { "Input/Output", "Show move cursor"}}, - { emu_settings_type::LockOvlIptToP1, { "Input/Output", "Lock overlay input to player one"}}, - { emu_settings_type::PadHandlerMode, { "Input/Output", "Pad handler mode"}}, - { emu_settings_type::PadConnection, { "Input/Output", "Keep pads connected" }}, - { emu_settings_type::KeyboardHandler, { "Input/Output", "Keyboard"}}, - { emu_settings_type::MouseHandler, { "Input/Output", "Mouse"}}, - { emu_settings_type::Camera, { "Input/Output", "Camera"}}, - { emu_settings_type::CameraType, { "Input/Output", "Camera type"}}, - { emu_settings_type::CameraFlip, { "Input/Output", "Camera flip"}}, - { emu_settings_type::CameraID, { "Input/Output", "Camera ID"}}, - { emu_settings_type::Move, { "Input/Output", "Move" }}, - { emu_settings_type::Buzz, { "Input/Output", "Buzz emulated controller" }}, - { emu_settings_type::Turntable, { "Input/Output", "Turntable emulated controller" }}, - { emu_settings_type::GHLtar, { "Input/Output", "GHLtar emulated controller" }}, - { emu_settings_type::MidiDevices, { "Input/Output", "Emulated Midi devices" }}, - { emu_settings_type::SDLMappings, { "Input/Output", "Load SDL GameController Mappings" }}, - { emu_settings_type::IoDebugOverlay, { "Input/Output", "IO Debug overlay" }}, - { emu_settings_type::MouseDebugOverlay, { "Input/Output", "Mouse Debug overlay" }}, - - // Misc - { emu_settings_type::ExitRPCS3OnFinish, { "Miscellaneous", "Exit RPCS3 when process finishes" }}, - { emu_settings_type::StartOnBoot, { "Miscellaneous", "Automatically start games after boot" }}, - { emu_settings_type::PauseOnFocusLoss, { "Miscellaneous", "Pause emulation on RPCS3 focus loss" }}, - { emu_settings_type::StartGameFullscreen, { "Miscellaneous", "Start games in fullscreen mode"}}, - { emu_settings_type::PreventDisplaySleep, { "Miscellaneous", "Prevent display sleep while running games"}}, - { emu_settings_type::ShowTrophyPopups, { "Miscellaneous", "Show trophy popups"}}, - { emu_settings_type::ShowRpcnPopups, { "Miscellaneous", "Show RPCN popups"}}, - { emu_settings_type::UseNativeInterface, { "Miscellaneous", "Use native user interface"}}, - { emu_settings_type::ShowShaderCompilationHint, { "Miscellaneous", "Show shader compilation hint"}}, - { emu_settings_type::ShowPPUCompilationHint, { "Miscellaneous", "Show PPU compilation hint"}}, - { emu_settings_type::ShowAutosaveAutoloadHint, { "Miscellaneous", "Show autosave/autoload hint"}}, - { emu_settings_type::ShowPressureIntensityToggleHint, { "Miscellaneous", "Show pressure intensity toggle hint"}}, - { emu_settings_type::ShowAnalogLimiterToggleHint, { "Miscellaneous", "Show analog limiter toggle hint"}}, - { emu_settings_type::ShowMouseAndKeyboardToggleHint, { "Miscellaneous", "Show mouse and keyboard toggle hint"}}, - { emu_settings_type::ShowFatalErrorHints, { "Miscellaneous", "Show fatal error hints"}}, - { emu_settings_type::ShowCaptureHints, { "Miscellaneous", "Show capture hints" }}, - { emu_settings_type::SilenceAllLogs, { "Miscellaneous", "Silence All Logs" }}, - { emu_settings_type::WindowTitleFormat, { "Miscellaneous", "Window Title Format" }}, - { emu_settings_type::PauseDuringHomeMenu, { "Miscellaneous", "Pause Emulation During Home Menu" }}, - { emu_settings_type::PlayMusicDuringBoot, { "Miscellaneous", "Play music during boot sequence" }}, - { emu_settings_type::EnableGamemode, { "Miscellaneous", "Enable GameMode" }}, - - // Networking - { emu_settings_type::InternetStatus, { "Net", "Internet enabled"}}, - { emu_settings_type::DNSAddress, { "Net", "DNS address"}}, - { emu_settings_type::IpSwapList, { "Net", "IP swap list"}}, - { emu_settings_type::PSNStatus, { "Net", "PSN status"}}, - { emu_settings_type::BindAddress, { "Net", "Bind address"}}, - { emu_settings_type::EnableUpnp, { "Net", "UPNP Enabled"}}, - { emu_settings_type::PSNCountry, { "Net", "PSN Country"}}, - { emu_settings_type::EnableClans, { "Net", "Clans Enabled"}}, - - // System - { emu_settings_type::LicenseArea, { "System", "License Area"}}, - { emu_settings_type::Language, { "System", "Language"}}, - { emu_settings_type::KeyboardType, { "System", "Keyboard Type"}}, - { emu_settings_type::EnterButtonAssignment, { "System", "Enter button assignment"}}, - { emu_settings_type::DateFormat, { "System", "Date Format"}}, - { emu_settings_type::TimeFormat, { "System", "Time Format"}}, - { emu_settings_type::ConsoleTimeOffset, { "System", "Console time offset (s)"}}, - - { emu_settings_type::EnableHostRoot, { "VFS", "Enable /host_root/"}}, - { emu_settings_type::EmptyHdd0Tmp, { "VFS", "Empty /dev_hdd0/tmp/"}}, - { emu_settings_type::LimitCacheSize, { "VFS", "Limit disk cache size"}}, - { emu_settings_type::MaximumCacheSize, { "VFS", "Disk cache maximum size (MB)"}}, - - // Savestates - { emu_settings_type::SuspendEmulationSavestateMode, { "Savestate", "Suspend Emulation Savestate Mode" }}, - { emu_settings_type::CompatibleEmulationSavestateMode, { "Savestate", "Compatible Savestate Mode" }}, - { emu_settings_type::StartSavestatePaused, { "Savestate", "Start Paused" }}, - - // Logs - { emu_settings_type::Log, { "Log" }}, -}; +extern const std::map settings_location; From 814821d76047209739d1290079b694991fad661b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 20 Apr 2026 16:12:18 +0200 Subject: [PATCH 5/7] SPU LLVM: Fix unused variable warnings - Remove unused block_optimization_exit_early - Pass mod_val instead of value --- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index b6d0791ab9..d3c4a6a8f9 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -2161,7 +2161,7 @@ public: { auto value = m_ir->CreateLoad(get_type(), spu_ptr(&spu_thread::last_getllar_lsa)); auto mod_val = m_ir->CreateFDiv(value, llvm::ConstantFP::get(value->getType(), 1.1 + i)); - m_ir->CreateStore(value, spu_ptr(&spu_thread::last_getllar_lsa)); + m_ir->CreateStore(mod_val, spu_ptr(&spu_thread::last_getllar_lsa)); } } @@ -2285,7 +2285,6 @@ public: BasicBlock* block_optimization_phi_parent = nullptr; const auto block_optimization_inner = is_reduced_loop ? BasicBlock::Create(m_context, fmt::format("b-loop-it-0x%x", m_pos), m_function) : nullptr; - const auto block_optimization_exit_early = is_reduced_loop ? BasicBlock::Create(m_context, fmt::format("b-loop-exit-0x%x", m_pos), m_function) : nullptr; const auto block_optimization_next = is_reduced_loop ? BasicBlock::Create(m_context, fmt::format("b2-0x%x", m_pos), m_function) : nullptr; std::array reduced_loop_phi_nodes{}; From e5af69d7b253f968b2cea708bd2be3adbf5fb383 Mon Sep 17 00:00:00 2001 From: digant73 Date: Thu, 16 Apr 2026 20:20:24 +0200 Subject: [PATCH 6/7] Add recursive scan support --- rpcs3/Emu/System.cpp | 84 +++++++++++++++++-------------- rpcs3/Emu/system_config.h | 1 + rpcs3/rpcs3qt/emu_settings_type.h | 1 + rpcs3/rpcs3qt/settings_dialog.cpp | 3 ++ rpcs3/rpcs3qt/settings_dialog.ui | 7 +++ rpcs3/rpcs3qt/tooltips.h | 1 + 6 files changed, 59 insertions(+), 38 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 5a1c41072b..492aed799a 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -4213,54 +4213,62 @@ u32 Emulator::AddGamesFromDir(const std::string& path) m_games_config.set_save_on_dirty(false); - // search dropped path first or else the direct parent to an elf is wrongly skipped + // search for a game on the provided path first (game on ISO file or on folder type) if (const game_boot_result error = AddGame(path); error == game_boot_result::no_errors) { games_added++; } - std::vector entries; - - for (auto&& dir_entry : fs::dir(path)) + // search for games on subfolders only if not nested inside a discovered game folder + if (games_added == 0) { - // Prefetch entries, it is unsafe to keep fs::dir for a long time or for many operations - entries.emplace_back(std::move(dir_entry)); - } + std::vector entries; - auto path_it = entries.begin(); - - qt_events_aware_op(0, [&]() - { - // search direct subdirectories, that way we can drop one folder containing all games - for (; path_it != entries.end(); ++path_it) + for (auto&& dir_entry : fs::dir(path)) { - auto dir_entry = std::move(*path_it); - - if (dir_entry.name == "." || dir_entry.name == "..") - { - continue; - } - - const std::string dir_path = path + '/' + dir_entry.name; - - if (!dir_entry.is_directory && !is_file_iso(dir_path)) - { - continue; - } - - if (const game_boot_result error = AddGame(dir_path); error == game_boot_result::no_errors) - { - games_added++; - } - - // Process events - ++path_it; - return false; + // Prefetch entries, it is unsafe to keep fs::dir for a long time or for many operations + entries.emplace_back(std::move(dir_entry)); } - // Exit loop - return true; - }); + auto path_it = entries.begin(); + + qt_events_aware_op(0, [&]() + { + // search direct subdirectories, that way we can drop one folder containing all games + for (; path_it != entries.end(); ++path_it) + { + auto dir_entry = std::move(*path_it); + + if (dir_entry.name == "." || dir_entry.name == "..") + { + continue; + } + + const std::string dir_path = path + '/' + dir_entry.name; + + if (!dir_entry.is_directory && !is_file_iso(dir_path)) + { + continue; + } + + if (const game_boot_result error = AddGame(dir_path); error == game_boot_result::no_errors) + { + games_added++; + } + else if (g_cfg.misc.use_recursive_scan) + { + games_added += AddGamesFromDir(dir_path); + } + + // Process events + ++path_it; + return false; + } + + // Exit loop + return true; + }); + } m_games_config.set_save_on_dirty(true); diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index f9f6f2c8d3..18d3555555 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -361,6 +361,7 @@ struct cfg_root : cfg::node cfg::_bool show_fatal_error_hints{ this, "Show fatal error hints", false, true }; cfg::_bool show_capture_hints{ this, "Show capture hints", true, true }; cfg::_bool use_native_interface{ this, "Use native user interface", true }; + cfg::_bool use_recursive_scan{this, "Use recursive scan", false}; cfg::string gdb_server{ this, "GDB Server", "127.0.0.1:2345" }; cfg::_bool silence_all_logs{ this, "Silence All Logs", false, true }; cfg::string title_format{ this, "Window Title Format", "FPS: %F | %R | %V | %T [%t]", true }; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index de04b81e85..834e71771e 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -184,6 +184,7 @@ enum class emu_settings_type ShowTrophyPopups, ShowRpcnPopups, UseNativeInterface, + UseRecursiveScan, ShowShaderCompilationHint, ShowPPUCompilationHint, ShowAutosaveAutoloadHint, diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 26e062b67b..5ef783c473 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -1819,6 +1819,9 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceCheckBox(ui->useNativeInterface, emu_settings_type::UseNativeInterface); SubscribeTooltip(ui->useNativeInterface, tooltips.settings.use_native_interface); + m_emu_settings->EnhanceCheckBox(ui->useRecursiveScan, emu_settings_type::UseRecursiveScan); + SubscribeTooltip(ui->useRecursiveScan, tooltips.settings.use_recursive_scan); + #if defined(__linux__) #if defined(GAMEMODE_AVAILABLE) m_emu_settings->EnhanceCheckBox(ui->enableGamemode, emu_settings_type::EnableGamemode); diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 77b3f26593..5f0267d865 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -3012,6 +3012,13 @@ + + + + Use recursive scan + + + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index 9ec1355392..c7f82c4010 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -157,6 +157,7 @@ public: const QString show_fatal_error_hints = tr("Shows fatal error hints using the native overlay."); const QString show_capture_hints = tr("Shows screenshot and recording hints using the native overlay."); const QString use_native_interface = tr("Enables use of native HUD within the game window that can interact with game controllers.\nWhen disabled, regular Qt dialogs are used instead.\nCurrently, the on-screen keyboard only supports the English key layout."); + const QString use_recursive_scan = tr("Enables use of recursive scan on subfolders when scanning games from the selected folder.\nWhen disabled, games are scanned only on the selected folder."); const QString record_with_overlays = tr("Enables recording with overlays.\nThis also affects screenshots."); const QString pause_during_home_menu = tr("When enabled, opening the home menu will also pause emulation.\nWhile most games pause themselves while the home menu is shown, some do not.\nIn that case it can be helpful to pause the emulation whenever the home menu is open."); const QString play_music_during_boot = tr("Play music during boot sequence if available."); From a088b18e955e01c4a63b32baa1fc6a56c3af475a Mon Sep 17 00:00:00 2001 From: digant73 Date: Tue, 21 Apr 2026 00:11:22 +0200 Subject: [PATCH 7/7] Add missing default setting after settings rework --- rpcs3/rpcs3qt/emu_settings_type.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/rpcs3qt/emu_settings_type.cpp b/rpcs3/rpcs3qt/emu_settings_type.cpp index 4b032c78c5..ae8e24434f 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.cpp +++ b/rpcs3/rpcs3qt/emu_settings_type.cpp @@ -192,6 +192,7 @@ const std::map settings_location = { emu_settings_type::ShowTrophyPopups, get_cfg_location(local_cfg.misc.show_trophy_popups) }, { emu_settings_type::ShowRpcnPopups, get_cfg_location(local_cfg.misc.show_rpcn_popups) }, { emu_settings_type::UseNativeInterface, get_cfg_location(local_cfg.misc.use_native_interface) }, + { emu_settings_type::UseRecursiveScan, get_cfg_location(local_cfg.misc.use_recursive_scan) }, { emu_settings_type::ShowShaderCompilationHint, get_cfg_location(local_cfg.misc.show_shader_compilation_hint) }, { emu_settings_type::ShowPPUCompilationHint, get_cfg_location(local_cfg.misc.show_ppu_compilation_hint) }, { emu_settings_type::ShowAutosaveAutoloadHint, get_cfg_location(local_cfg.misc.show_autosave_autoload_hint) },