From 77b1d1179622ba74c60c957baaa0e7878d494220 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Wed, 3 Sep 2025 03:03:33 +0800 Subject: [PATCH] Qt: Add FSR options to settings GUI (#3504) * Qt: Add FSR settings to settings GUI * Move FSR settings from Imgui.ini to main config * move passing fsr settings to presenter constuctor * cleanup: use struct instead of function call * cleanup: make variable names consistent with others * Update fsr settings real-time in qt, save button in Imgui * Linux build fix, missing running game check * syntax fix * Change gamerunning checks to if (presenter) --- src/common/config.cpp | 36 ++++++ src/common/config.h | 6 + src/core/devtools/layer.cpp | 10 ++ src/core/devtools/options.cpp | 14 --- src/qt_gui/settings_dialog.cpp | 50 ++++++++- src/qt_gui/settings_dialog.h | 1 - src/qt_gui/settings_dialog.ui | 103 +++++++++++++++--- .../renderer_vulkan/vk_presenter.cpp | 4 + 8 files changed, 189 insertions(+), 35 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 12ad47d93..1fb0382fd 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -81,6 +81,9 @@ static bool isFullscreen = false; static std::string fullscreenMode = "Windowed"; static std::string presentMode = "Mailbox"; static bool isHDRAllowed = false; +static bool fsrEnabled = true; +static bool rcasEnabled = true; +static int rcasAttenuation = 250; // Vulkan static s32 gpuId = -1; @@ -652,6 +655,30 @@ void setBackgroundControllerInput(bool enable) { backgroundControllerInput = enable; } +bool getFsrEnabled() { + return fsrEnabled; +} + +void setFsrEnabled(bool enable) { + fsrEnabled = enable; +} + +bool getRcasEnabled() { + return rcasEnabled; +} + +void setRcasEnabled(bool enable) { + rcasEnabled = enable; +} + +int getRcasAttenuation() { + return rcasAttenuation; +} + +void setRcasAttenuation(int value) { + rcasAttenuation = value; +} + void load(const std::filesystem::path& path) { // If the configuration file does not exist, create it and return std::error_code error; @@ -737,6 +764,9 @@ void load(const std::filesystem::path& path) { fullscreenMode = toml::find_or(gpu, "FullscreenMode", fullscreenMode); presentMode = toml::find_or(gpu, "presentMode", presentMode); isHDRAllowed = toml::find_or(gpu, "allowHDR", isHDRAllowed); + fsrEnabled = toml::find_or(gpu, "fsrEnabled", fsrEnabled); + rcasEnabled = toml::find_or(gpu, "rcasEnabled", rcasEnabled); + rcasAttenuation = toml::find_or(gpu, "rcasAttenuation", rcasAttenuation); } if (data.contains("Vulkan")) { @@ -906,6 +936,9 @@ void save(const std::filesystem::path& path) { data["GPU"]["FullscreenMode"] = fullscreenMode; data["GPU"]["presentMode"] = presentMode; data["GPU"]["allowHDR"] = isHDRAllowed; + data["GPU"]["fsrEnabled"] = fsrEnabled; + data["GPU"]["rcasEnabled"] = rcasEnabled; + data["GPU"]["rcasAttenuation"] = rcasAttenuation; data["Vulkan"]["gpuId"] = gpuId; data["Vulkan"]["validation"] = vkValidation; data["Vulkan"]["validation_sync"] = vkValidationSync; @@ -1016,6 +1049,9 @@ void setDefaultValues() { fullscreenMode = "Windowed"; presentMode = "Mailbox"; isHDRAllowed = false; + fsrEnabled = true; + rcasEnabled = true; + rcasAttenuation = 250; // Vulkan gpuId = -1; diff --git a/src/common/config.h b/src/common/config.h index 2862ea12a..61a2583e9 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -115,6 +115,12 @@ bool getBackgroundControllerInput(); void setBackgroundControllerInput(bool enable); bool getLoggingEnabled(); void setLoggingEnabled(bool enable); +bool getFsrEnabled(); +void setFsrEnabled(bool enable); +bool getRcasEnabled(); +void setRcasEnabled(bool enable); +int getRcasAttenuation(); +void setRcasAttenuation(int value); // TODO bool GetLoadGameSizeEnabled(); diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index 8e8c7b969..d811974d8 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -104,6 +104,16 @@ void L::DrawMenuBar() { EndDisabled(); } EndDisabled(); + + if (Button("Save")) { + Config::setFsrEnabled(fsr.enable); + Config::setRcasEnabled(fsr.use_rcas); + Config::setRcasAttenuation(static_cast(fsr.rcas_attenuation * 1000)); + Config::save(Common::FS::GetUserPath(Common::FS::PathType::UserDir) / + "config.toml"); + CloseCurrentPopup(); + } + ImGui::EndMenu(); } ImGui::EndMenu(); diff --git a/src/core/devtools/options.cpp b/src/core/devtools/options.cpp index f4b0ceb9a..b4915f28a 100644 --- a/src/core/devtools/options.cpp +++ b/src/core/devtools/options.cpp @@ -30,26 +30,12 @@ void LoadOptionsConfig(const char* line) { Options.frame_dump_render_on_collapse = i != 0; return; } - if (sscanf(line, "fsr_enabled=%d", &i) == 1) { - presenter->GetFsrSettingsRef().enable = i != 0; - return; - } - if (sscanf(line, "fsr_rcas_enabled=%d", &i) == 1) { - presenter->GetFsrSettingsRef().use_rcas = i != 0; - return; - } - if (sscanf(line, "fsr_rcas_attenuation=%f", &f) == 1) { - presenter->GetFsrSettingsRef().rcas_attenuation = f; - } } void SerializeOptionsConfig(ImGuiTextBuffer* buf) { buf->appendf("disassembler_cli_isa=%s\n", Options.disassembler_cli_isa.c_str()); buf->appendf("disassembler_cli_spv=%s\n", Options.disassembler_cli_spv.c_str()); buf->appendf("frame_dump_render_on_collapse=%d\n", Options.frame_dump_render_on_collapse); - buf->appendf("fsr_enabled=%d\n", presenter->GetFsrSettingsRef().enable); - buf->appendf("fsr_rcas_enabled=%d\n", presenter->GetFsrSettingsRef().use_rcas); - buf->appendf("fsr_rcas_attenuation=%f\n", presenter->GetFsrSettingsRef().rcas_attenuation); } } // namespace Core::Devtools diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 9b04e9e95..aedb1823e 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -29,6 +29,9 @@ #include "settings_dialog.h" #include "ui_settings_dialog.h" #include "video_core/renderer_vulkan/vk_instance.h" +#include "video_core/renderer_vulkan/vk_presenter.h" + +extern std::unique_ptr presenter; QStringList languageNames = {"Arabic", "Czech", @@ -263,7 +266,7 @@ SettingsDialog::SettingsDialog(std::shared_ptr gui_settings, }); } - // Gui TAB + // GUI TAB { connect(ui->backgroundImageOpacitySlider, &QSlider::valueChanged, this, [this](int value) { emit BackgroundOpacityChanged(value); }); @@ -284,7 +287,7 @@ SettingsDialog::SettingsDialog(std::shared_ptr gui_settings, }); } - // User TAB + // USER TAB { connect(ui->OpenCustomTrophyLocationButton, &QPushButton::clicked, this, []() { QString userPath; @@ -294,7 +297,7 @@ SettingsDialog::SettingsDialog(std::shared_ptr gui_settings, }); } - // Input TAB + // INPUT TAB { connect(ui->hideCursorComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this](s16 index) { OnCursorStateChanged(index); }); @@ -385,6 +388,32 @@ SettingsDialog::SettingsDialog(std::shared_ptr gui_settings, }); } + // GRAPHICS TAB + connect(ui->RCASSlider, &QSlider::valueChanged, this, [this](int value) { + QString RCASValue = QString::number(value / 1000.0, 'f', 3); + ui->RCASValue->setText(RCASValue); + }); + + if (presenter) { + connect(ui->RCASSlider, &QSlider::valueChanged, this, [this](int value) { + presenter->GetFsrSettingsRef().rcas_attenuation = static_cast(value / 1000.0f); + }); + +#if (QT_VERSION < QT_VERSION_CHECK(6, 7, 0)) + connect(ui->FSRCheckBox, &QCheckBox::stateChanged, this, + [this](int state) { presenter->GetFsrSettingsRef().enable = state; }); + + connect(ui->RCASCheckBox, &QCheckBox::stateChanged, this, + [this](int state) { presenter->GetFsrSettingsRef().use_rcas = state; }); +#else + connect(ui->FSRCheckBox, &QCheckBox::checkStateChanged, this, + [this](Qt::CheckState state) { presenter->GetFsrSettingsRef().enable = state; }); + + connect(ui->RCASCheckBox, &QCheckBox::checkStateChanged, this, + [this](Qt::CheckState state) { presenter->GetFsrSettingsRef().use_rcas = state; }); +#endif + } + // Descriptions { // General @@ -525,6 +554,11 @@ void SettingsDialog::LoadValuesFromConfig() { ui->dumpShadersCheckBox->setChecked(toml::find_or(data, "GPU", "dumpShaders", false)); ui->nullGpuCheckBox->setChecked(toml::find_or(data, "GPU", "nullGpu", false)); ui->enableHDRCheckBox->setChecked(toml::find_or(data, "GPU", "allowHDR", false)); + ui->FSRCheckBox->setChecked(toml::find_or(data, "GPU", "fsrEnabled", true)); + ui->RCASCheckBox->setChecked(toml::find_or(data, "GPU", "rcasEnabled", true)); + ui->RCASSlider->setValue(toml::find_or(data, "GPU", "rcasAttenuation", 500)); + ui->RCASValue->setText(QString::number(ui->RCASSlider->value() / 1000.0, 'f', 3)); + ui->playBGMCheckBox->setChecked(m_gui_settings->GetValue(gui::gl_playBackgroundMusic).toBool()); ui->disableTrophycheckBox->setChecked( toml::find_or(data, "General", "isTrophyPopupDisabled", false)); @@ -883,6 +917,9 @@ void SettingsDialog::UpdateSettings() { Config::setVblankDiv(ui->vblankSpinBox->value()); Config::setDumpShaders(ui->dumpShadersCheckBox->isChecked()); Config::setNullGpu(ui->nullGpuCheckBox->isChecked()); + Config::setFsrEnabled(ui->FSRCheckBox->isChecked()); + Config::setRcasEnabled(ui->RCASCheckBox->isChecked()); + Config::setRcasAttenuation(ui->RCASSlider->value()); Config::setLoadGameSizeEnabled(ui->gameSizeCheckBox->isChecked()); Config::setShowSplash(ui->showSplashCheckBox->isChecked()); Config::setDebugDump(ui->debugDump->isChecked()); @@ -978,6 +1015,13 @@ void SettingsDialog::SyncRealTimeWidgetstoConfig() { Config::setAllGameInstallDirs(settings_install_dirs_config); } + + if (presenter) { + presenter->GetFsrSettingsRef().enable = Config::getFsrEnabled(); + presenter->GetFsrSettingsRef().use_rcas = Config::getRcasEnabled(); + presenter->GetFsrSettingsRef().rcas_attenuation = + static_cast(Config::getRcasAttenuation() / 1000.f); + } } void SettingsDialog::setDefaultValues() { m_gui_settings->SetValue(gui::gl_showBackgroundImage, true); diff --git a/src/qt_gui/settings_dialog.h b/src/qt_gui/settings_dialog.h index 13fab36a2..38c4a7688 100644 --- a/src/qt_gui/settings_dialog.h +++ b/src/qt_gui/settings_dialog.h @@ -54,7 +54,6 @@ private: QString defaultTextEdit; int initialHeight; - bool is_saving = false; std::shared_ptr m_gui_settings; }; diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 36cf12be7..0407d62e4 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -59,7 +59,7 @@ - 5 + 2 @@ -73,8 +73,8 @@ 0 0 - 944 - 537 + 946 + 536 @@ -452,8 +452,8 @@ 0 0 - 414 - 69 + 402 + 68 @@ -538,8 +538,8 @@ 0 0 - 944 - 537 + 946 + 536 @@ -987,8 +987,8 @@ 0 0 - 944 - 537 + 946 + 536 @@ -1271,6 +1271,75 @@ 12 + + + + FSR Settings + + + + + + Enable FSR + + + + + + + Enable RCAS (sharpening) + + + + + + + + + + 9 + false + + + + RCAS Attenuation: + + + + + + + + 9 + false + + + + 0.250 + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + 3000 + + + 250 + + + Qt::Orientation::Horizontal + + + + + + @@ -1316,8 +1385,8 @@ 0 0 - 944 - 537 + 946 + 536 @@ -1558,8 +1627,8 @@ 0 0 - 944 - 537 + 946 + 536 @@ -1830,8 +1899,8 @@ 0 0 - 944 - 537 + 946 + 536 @@ -1999,8 +2068,8 @@ 0 0 - 944 - 537 + 946 + 536 diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 09dd23cb6..12f522a82 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -129,6 +129,10 @@ Presenter::Presenter(Frontend::WindowSDL& window_, AmdGpu::Liverpool* liverpool_ free_queue.push(&frame); } + fsr_settings.enable = Config::getFsrEnabled(); + fsr_settings.use_rcas = Config::getRcasEnabled(); + fsr_settings.rcas_attenuation = static_cast(Config::getRcasAttenuation() / 1000.f); + fsr_pass.Create(device, instance.GetAllocator(), num_images); pp_pass.Create(device, swapchain.GetSurfaceFormat().format);