Merge branch 'master' into feature/iso-multigame-support

This commit is contained in:
Vishrut Sachan 2026-04-21 10:17:27 +05:30 committed by GitHub
commit 4b85a56f07
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 329 additions and 287 deletions

View file

@ -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

View file

@ -2161,7 +2161,7 @@ public:
{
auto value = m_ir->CreateLoad(get_type<f32>(), 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<llvm::PHINode*, s_reg_max> reduced_loop_phi_nodes{};

View file

@ -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();
}

View file

@ -934,7 +934,7 @@ namespace rsx
auto& perf_settings = g_cfg.video.perf_overlay;
auto perf_overlay = manager->get<rsx::overlays::perf_metrics_overlay>();
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<f32>(perf_settings.margin_x.get()), static_cast<f32>(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);

View file

@ -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);

View file

@ -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<fs::dir_entry> 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<fs::dir_entry> 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);

View file

@ -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 };

View file

@ -837,6 +837,7 @@
<ClCompile Include="rpcs3qt\breakpoint_list.cpp" />
<ClCompile Include="rpcs3qt\call_stack_list.cpp" />
<ClCompile Include="rpcs3qt\camera_settings_dialog.cpp" />
<ClCompile Include="rpcs3qt\emu_settings_type.cpp" />
<ClCompile Include="rpcs3qt\gui_game_info.cpp" />
<ClCompile Include="rpcs3qt\log_level_dialog.cpp" />
<ClCompile Include="rpcs3qt\permissions.cpp" />

View file

@ -1299,6 +1299,9 @@
<ClCompile Include="rpcs3qt\steam_utils.cpp">
<Filter>Gui\utils</Filter>
</ClCompile>
<ClCompile Include="rpcs3qt\emu_settings_type.cpp">
<Filter>Gui\settings</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Input\ds4_pad_handler.h">

View file

@ -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

View file

@ -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;

View file

@ -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<emu_settings_type, cfg_location> 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)},
};

View file

@ -1,10 +1,11 @@
#pragma once
#include <deque>
#include <map>
#include <vector>
#include <string>
// Node location
using cfg_location = std::vector<const char*>;
using cfg_location = std::deque<std::string>;
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<emu_settings_type, cfg_location> 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<emu_settings_type, cfg_location> settings_location;

View file

@ -1819,6 +1819,9 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> 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);

View file

@ -3012,6 +3012,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="useRecursiveScan">
<property name="text">
<string>Use recursive scan</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View file

@ -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.");