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 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{}; 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.cpp b/rpcs3/Emu/System.cpp index 520f4c1be9..d0b0d0d959 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 ba52f14d5d..18d3555555 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 }; @@ -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/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..ae8e24434f --- /dev/null +++ b/rpcs3/rpcs3qt/emu_settings_type.cpp @@ -0,0 +1,241 @@ +#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::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) }, + { 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 4824719769..834e71771e 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 { @@ -40,7 +41,6 @@ enum class emu_settings_type SleepTimersAccuracy, ClocksScale, PerformanceReport, - FullWidthAVX512, PPUNJFixup, PPUVNANFixup, AccurateDFMA, @@ -184,6 +184,7 @@ enum class emu_settings_type ShowTrophyPopups, ShowRpcnPopups, UseNativeInterface, + UseRecursiveScan, ShowShaderCompilationHint, ShowPPUCompilationHint, ShowAutosaveAutoloadHint, @@ -227,225 +228,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::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"}}, - { 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; 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.");