gui: General UX pass on the Settings Dialog (#19604)

### Remove 
- gui: Remove Debug "Approximate PPU Vector NaN Handling"
- gui: Remove I/O "Load SDL GameController Mappings"
- gui: Remove Advanced "VBlank NTSC Fixup", enable by default
- gui: Remove Debug "Accurate DFMA"

### Move
- gui: Move Advanced "Enable SPU Events Busy Loop" to Debug
- gui: Move Advanced "Set DAZ and FTZ" to Debug
- gui: Move Audio Device to the left column in Audio

### Group
- gui: Add "Savestates" section in Advanced

### Order
- gui: Alphabetically order the Advanced Tab
- gui: Alphabetically order the I/O tab

### Visibility
- gui: Hide formats list when Audio Format is not Manual
- gui: Hide 3D settings if GPU "Enable 3D Support" is disabled
- gui: Hide RCAS if GPU "Output Scaling" is not FSR1
This commit is contained in:
Ani
2026-09-29 10:25:30 +00:00
committed by GitHub
parent 56fabd9760
commit d9a72d6ca7
4 changed files with 68 additions and 101 deletions
+1 -1
View File
@@ -171,7 +171,7 @@ struct cfg_root : cfg::node
cfg::_int<0, 30000000> driver_recovery_timeout{ this, "Driver Recovery Timeout", 1000000, true };
cfg::uint<0, 16667> driver_wakeup_delay{ this, "Driver Wake-Up Delay", 0, true };
cfg::_int<1, 6000> vblank_rate{ this, "Vblank Rate", 60, true }; // Changing this from 60 may affect game speed in unexpected ways
cfg::_bool vblank_ntsc{ this, "Vblank NTSC Fixup", false, true };
cfg::_bool vblank_ntsc{ this, "Vblank NTSC Fixup", true, true };
cfg::_bool decr_memory_layout{ this, "DECR memory layout", false}; // Force enable increased allowed main memory range as DECR console
cfg::_bool host_label_synchronization{ this, "Allow Host GPU Labels", false };
cfg::_bool disable_msl_fast_math{ this, "Disable MSL Fast Math", false };
+9 -18
View File
@@ -564,10 +564,10 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
const auto [text, value] = get_data(ui->resBox, ui->resBox->currentIndex());
const bool stereo_allowed = value == static_cast<int>(video_resolution::_720p);
const bool stereo_enabled = ui->stereoRenderEnabled->checkState() == Qt::CheckState::Checked;
ui->stereoRenderMode->setEnabled(stereo_allowed && stereo_enabled);
ui->stereoRenderEnabled->setEnabled(stereo_allowed);
ui->gb_screen_size->setEnabled(stereo_allowed && stereo_enabled);
ui->gb_anaglyph_settings->setEnabled(stereo_allowed && stereo_enabled);
ui->stereoRenderMode->setVisible(stereo_allowed && stereo_enabled);
ui->gb_screen_size->setVisible(stereo_allowed && stereo_enabled);
ui->gb_anaglyph_settings->setVisible(stereo_allowed && stereo_enabled);
};
connect(ui->resBox, &QComboBox::currentIndexChanged, this, [enable_3D_modes](int){ enable_3D_modes(); });
connect(ui->stereoRenderEnabled, &QCheckBox::checkStateChanged, this, [enable_3D_modes](Qt::CheckState){ enable_3D_modes(); });
@@ -582,8 +582,10 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
{
ui->stereoRenderMode->setCurrentIndex(find_item(ui->stereoRenderMode, static_cast<int>(g_cfg.video.stereo_render_mode.def)));
ui->stereoRenderEnabled->setChecked(false);
ui->stereoRenderMode->setVisible(false);
ui->gb_screen_size->setVisible(false);
ui->gb_anaglyph_settings->setVisible(false);
ui->gb_stereo->setEnabled(false);
ui->gb_anaglyph_settings->setEnabled(false);
}
// Checkboxes: main options
@@ -840,8 +842,7 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
{
const auto [text, value] = get_data(ui->outputScalingMode, ui->outputScalingMode->currentIndex());
const bool fsr_selected = static_cast<output_scaling_mode>(value) == output_scaling_mode::fsr;
ui->fsrSharpeningStrength->setEnabled(fsr_selected);
ui->fsrSharpeningStrengthReset->setEnabled(fsr_selected);
ui->fsrSharpeningStrengthWidget->setVisible(fsr_selected);
};
// Handle connects to disable specific checkboxes that depend on GUI state.
@@ -991,6 +992,7 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
connect(ui->combo_audio_format, &QComboBox::currentIndexChanged, this, [this](int index)
{
const auto [text, value] = get_data(ui->combo_audio_format, index);
ui->list_audio_formats->setVisible(static_cast<audio_format>(value) == audio_format::manual);
ui->list_audio_formats->setEnabled(static_cast<audio_format>(value) == audio_format::manual);
});
EnhanceComboBox(emu_settings_type::AudioFormat, ui->combo_audio_format, tooltips.settings.audio_format, ui->gb_audio_format);
@@ -1171,12 +1173,6 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
EnhanceCheckBox(emu_settings_type::LockOvlIptToP1, ui->lockOverlayInputToPlayerOne, tooltips.settings.lock_overlay_input_to_player_one);
EnhanceCheckBox(emu_settings_type::MouseBasedGyro, ui->mouseBasedGyroBox, tooltips.settings.mouse_based_gyro);
#if HAVE_SDL3
EnhanceCheckBox(emu_settings_type::SDLMappings, ui->loadSdlMappings, tooltips.settings.sdl_mappings);
#else
ui->loadSdlMappings->setVisible(false);
#endif
#ifndef _WIN32
// Remove raw mouse handler
remove_item(ui->mouseHandlerBox, static_cast<int>(mouse_handler::raw), static_cast<int>(g_cfg.io.mouse.def));
@@ -1416,11 +1412,8 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
// Checkboxes
EnhanceCheckBox(emu_settings_type::DebugConsoleMode, ui->debugConsoleMode, tooltips.settings.debug_console_mode);
EnhanceCheckBox(emu_settings_type::AccurateDFMA, ui->accurateDFMA, tooltips.settings.accurate_dfma);
ui->accurateDFMA->setDisabled(utils::has_fma3() || utils::has_fma4());
EnhanceCheckBox(emu_settings_type::AccurateRSXAccess, ui->accurateRSXAccess, tooltips.settings.accurate_rsx_access);
EnhanceCheckBox(emu_settings_type::AccurateSpuDMA, ui->accurateSpuDMA, tooltips.settings.accurate_spu_dma);
EnhanceCheckBox(emu_settings_type::PPUVNANFixup, ui->PPUVNANfixup, tooltips.settings.fixup_ppuvnan);
EnhanceCheckBox(emu_settings_type::LLVMPrecompilation, ui->llvmPrecompilation, tooltips.settings.llvm_precompilation);
EnhanceCheckBox(emu_settings_type::SuspendEmulationSavestateMode, ui->antiCheatSavestates, tooltips.settings.anti_cheat_savestates);
EnhanceCheckBox(emu_settings_type::CompatibleEmulationSavestateMode, ui->compatibleSavestates, tooltips.settings.compatible_savestates);
@@ -1431,7 +1424,6 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
EnhanceCheckBox(emu_settings_type::WriteDepthBuffer, ui->dumpDepth, tooltips.settings.dump_depth);
EnhanceCheckBox(emu_settings_type::HandleRSXTiledMemory, ui->handleTiledMemory, tooltips.settings.handle_tiled_memory);
EnhanceCheckBox(emu_settings_type::SetDAZandFTZ, ui->setDAZandFTZ, tooltips.settings.set_daz_and_ftz);
EnhanceCheckBox(emu_settings_type::VBlankNTSCFixup, ui->vblankNTSCFixup, {});
ui->mfcDelayCommand->setChecked(m_emu_settings->GetSetting(emu_settings_type::MFCCommandsShuffling) == "1");
SubscribeTooltip(ui->mfcDelayCommand, tooltips.settings.mfc_delay_command);
@@ -1448,7 +1440,6 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
EnhanceCheckBox(emu_settings_type::DisableAsyncHostMM, ui->disableAsyncHostMM, tooltips.settings.disable_async_host_mm);
EnhanceCheckBox(emu_settings_type::DisableSpinOptimization, ui->disableSpinOptimization, tooltips.settings.disable_spin_optimization);
EnhanceCheckBox(emu_settings_type::EnabledSPUEventsBusyLoop, ui->enableSpuEventsBusyLoop, tooltips.settings.enable_spu_events_busy_loop);
EnhanceCheckBox(emu_settings_type::DisableHWTexelRemapping, ui->disableHardwareTexelRemapping, tooltips.settings.disable_hw_texel_remapping);
EnhanceCheckBox(emu_settings_type::DisableHWBlending, ui->disableHardwareBlending, tooltips.settings.disable_hw_blending);
@@ -1523,7 +1514,6 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
}
else
{
SubscribeTooltip(ui->vblankNTSCFixup, tooltips.settings.vblank_ntsc_fixup);
SubscribeTooltip(ui->gb_vblank, tooltips.settings.vblank_rate);
SubscribeTooltip(ui->gb_clockScale, tooltips.settings.clocks_scale);
SubscribeTooltip(ui->gb_wakeupDelay, tooltips.settings.wake_up_delay);
@@ -2266,6 +2256,7 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
EnhanceCheckBox(emu_settings_type::AccurateClineStores, ui->accurateClineStores, tooltips.settings.accurate_cache_line_stores);
EnhanceCheckBox(emu_settings_type::HookStaticFuncs, ui->hookStFunc, tooltips.settings.hook_static_functions);
EnhanceCheckBox(emu_settings_type::PerformanceReport, ui->perfReport, tooltips.settings.enable_performance_report);
EnhanceCheckBox(emu_settings_type::EnabledSPUEventsBusyLoop, ui->enableSpuEventsBusyLoop, tooltips.settings.enable_spu_events_busy_loop);
// Checkboxes: IO debug options
EnhanceCheckBox(emu_settings_type::IoDebugOverlay, ui->debugOverlayIO, tooltips.settings.debug_overlay_io);
+58 -78
View File
@@ -784,13 +784,6 @@
<item>
<widget class="QComboBox" name="outputScalingMode"/>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="fsrSharpeningStrengthWidget" native="true">
<layout class="QVBoxLayout" name="fsrSharpeningWidgetLayout">
@@ -1092,6 +1085,18 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_audio_device">
<property name="title">
<string>Audio Device</string>
</property>
<layout class="QVBoxLayout" name="gb_audio_device_layout">
<item>
<widget class="QComboBox" name="audioDeviceBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_audio_format">
<property name="title">
@@ -1176,18 +1181,6 @@
</item>
<item>
<layout class="QVBoxLayout" name="audioTabLayoutTopMiddle">
<item>
<widget class="QGroupBox" name="gb_audio_device">
<property name="title">
<string>Audio Device</string>
</property>
<layout class="QVBoxLayout" name="gb_audio_device_layout">
<item>
<widget class="QComboBox" name="audioDeviceBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_audio_channel_layout">
<property name="title">
@@ -1835,16 +1828,16 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="padConnectionBox">
<widget class="QCheckBox" name="mouseBasedGyroBox">
<property name="text">
<string>Keep Pads Connected</string>
<string>Enable Mouse-based Gyro</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showMoveCursorBox">
<widget class="QCheckBox" name="padConnectionBox">
<property name="text">
<string>Show PS Move Cursor</string>
<string>Keep Pads Connected</string>
</property>
</widget>
</item>
@@ -1856,16 +1849,9 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="loadSdlMappings">
<widget class="QCheckBox" name="showMoveCursorBox">
<property name="text">
<string>Use SDL GameController Database</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="mouseBasedGyroBox">
<property name="text">
<string>Enable Mouse-based Gyro</string>
<string>Show PS Move Cursor</string>
</property>
</widget>
</item>
@@ -2517,9 +2503,9 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="antiCheatSavestates">
<widget class="QCheckBox" name="accurateSpuReservations">
<property name="text">
<string>Anti-Cheat Savestates Mode</string>
<string>Accurate SPU Reservations</string>
</property>
</widget>
</item>
@@ -2530,17 +2516,10 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="setDAZandFTZ">
<property name="text">
<string>PPU Set DAZ and FTZ</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="mfcDelayCommand">
<property name="text">
<string>Delay each odd MFC Command</string>
<string>Delay Each Odd MFC Command</string>
</property>
</widget>
</item>
@@ -2551,17 +2530,10 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="enableSpuEventsBusyLoop">
<property name="text">
<string>Enable SPU Events Busy Loop</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="spuLoopDetection">
<property name="text">
<string>Enable SPU loop detection</string>
<string>Enable SPU Loop Detection</string>
</property>
</widget>
</item>
@@ -2572,13 +2544,6 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="accurateSpuReservations">
<property name="text">
<string>Accurate SPU Reservations</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="llvmPrecompilation">
<property name="text">
@@ -2593,6 +2558,28 @@
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_advanced_savestates">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Savestates</string>
</property>
<layout class="QVBoxLayout" name="gb_advanced_savestates_layout">
<item>
<widget class="QCheckBox" name="antiCheatSavestates">
<property name="text">
<string>Anti-Cheat Savestates Mode</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="compatibleSavestates">
<property name="text">
@@ -2972,13 +2959,6 @@
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="vblankNTSCFixup">
<property name="text">
<string>VBlank NTSC Fixup</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@@ -4597,6 +4577,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="enableSpuEventsBusyLoop">
<property name="text">
<string>Enable SPU Events Busy Loop</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="hookStFunc">
<property name="text">
@@ -4618,6 +4605,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="setDAZandFTZ">
<property name="text">
<string>PPU Set DAZ and FTZ</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="spuDebug">
<property name="text">
@@ -4654,13 +4648,6 @@
<string>CPU Accuracy</string>
</property>
<layout class="QVBoxLayout" name="gb_debug_cpu_layout">
<item>
<widget class="QCheckBox" name="accurateDFMA">
<property name="text">
<string>Accurate PPU/SPU Double-Precision FMA</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="accurateClineStores">
<property name="text">
@@ -4696,13 +4683,6 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="PPUVNANfixup">
<property name="text">
<string>Approximate PPU Vector NaN Handling</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacerDebugCpu">
<property name="orientation">
-4
View File
@@ -28,8 +28,6 @@ public:
const QString debug_console_mode = tr("Increases the amount of usable system memory to match a DECR console and more.\nCauses some software to behave differently than on retail hardware.");
const QString accurate_rsx_access = tr("Forces RSX pauses on SPU MFC_GETLLAR and SPU MFC_PUTLLUC operations.");
const QString accurate_spu_dma = tr("Accurately processes SPU DMA operations.");
const QString accurate_dfma = tr("Use accurate double-precision FMA instructions in PPU and SPU backends.\nWhile disabling it might give a decent performance boost if your CPU doesn't support FMA, it may also introduce subtle bugs that otherwise do not occur.\nYou shouldn't disable it if your CPU supports FMA.");
const QString fixup_ppuvnan = tr("Fixup NaN results in vector instructions in PPU backends.\nIf unsure, do not modify this setting.");
const QString silence_all_logs = tr("Stop writing any logs after game startup. Don't use unless you believe it's necessary.");
const QString read_color = tr("Initializes render target memory using vm memory.");
const QString read_depth = tr("Initializes render target memory using vm memory.");
@@ -48,7 +46,6 @@ public:
const QString sleep_timers_accuracy = tr("Changes the sleep period accuracy.\n'As Host' uses default accuracy of the underlying operating system, while 'All Timers' attempts to improve it.\n'Usleep Only' limits the adjustments to usleep syscall only.\nCan affect performance in unexpected ways.");
const QString rsx_fifo_accuracy = tr("\"Fast\" is the least accurate setting, RSX does not emulate atomic FIFO buffer.\n\"Atomic\" benefits stability greatly in many games with little performance penalty.\n\"Atomic & Ordered\" is the most accurate but it is the slowest and without much stability benefit in games.");
const QString vblank_rate = tr("Adjusts the frequency of vertical blanking signals that the emulator sends.\nAffects timing of events which rely on these signals.");
const QString vblank_ntsc_fixup = tr("Multiplies the rate of VBLANK by 1000/1001 for values like 59.94Hz.\nKnown to fix the rhythm game Space Channel 5 Part 2");
const QString clocks_scale = tr("Changes the scale of emulated system time.\nAffects software which uses system time to calculate things such as dynamic timesteps.");
const QString wake_up_delay = tr("Controls how much time it takes for RSX to start processing after waking up by the Cell processor.\nIncreasing wakeup delay improves stability, but very high values can lower RSX/GPU performance.\nIt is recommend to adjust this at 20µs to 40µs increments until the best value for optimal stability is reached.");
const QString disabled_from_global = tr("Do not change this setting globally.\nRight-click a game in the game list and choose \"Configure\" instead.");
@@ -259,7 +256,6 @@ public:
const QString background_input = tr("Allows pad and keyboard input while the game window is unfocused.");
const QString show_move_cursor = tr("Shows the raw position of the PS Move input.\nThis can be very helpful during calibration screens.");
const QString midi_devices = tr("Select up to 3 emulated MIDI devices and their types.");
const QString sdl_mappings = tr("Loads the SDL GameController database for improved gamepad compatibility. Only used in the SDL pad handler.");
const QString mouse_based_gyro = tr("Enables mouse-based gyro emulation at game startup. It can also be toggled at any time with the associated hotkey.\nHold the right mouse button to activate gyro input: moving the mouse maps to the X and Z motion axes, and the scroll wheel maps to the Y axis. Release the button to reset the motion values.");
const QString lock_overlay_input_to_player_one = tr("Locks the native overlay input to the first player.");