From 45426910e0e8ee6f163c2bda9dd6e3a8fcef0009 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Mon, 16 Dec 2024 19:01:00 +0800 Subject: [PATCH] Implement gamma correction in main config menu --- src/common/config.cpp | 14 +++++- src/common/config.h | 2 + src/qt_gui/main_window.cpp | 2 + src/qt_gui/main_window.h | 2 +- src/qt_gui/settings_dialog.cpp | 26 ++++++++++ src/qt_gui/settings_dialog.h | 2 + src/qt_gui/settings_dialog.ui | 48 ++++++++++++------- .../renderer_vulkan/vk_presenter.cpp | 1 - src/video_core/renderer_vulkan/vk_presenter.h | 3 +- 9 files changed, 79 insertions(+), 21 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 403b0e32f..28205c0a4 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -64,6 +64,7 @@ static bool vkCrashDiagnostic = false; static s16 cursorState = HideCursorState::Idle; static int cursorHideTimeout = 5; // 5 seconds (default) static bool separateupdatefolder = false; +static int GammaValue = 1000; // Gui std::vector settings_install_dirs = {}; @@ -224,6 +225,10 @@ bool getSeparateUpdateEnabled() { return separateupdatefolder; } +int getGammaValue() { + return GammaValue; +} + void setGpuId(s32 selectedGpuId) { gpuId = selectedGpuId; } @@ -344,6 +349,10 @@ void setSeparateUpdateEnabled(bool use) { separateupdatefolder = use; } +void setGammaValue(int value) { + GammaValue = value; +} + void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h) { main_window_geometry_x = x; main_window_geometry_y = y; @@ -566,6 +575,7 @@ void load(const std::filesystem::path& path) { shouldDumpShaders = toml::find_or(gpu, "dumpShaders", false); shouldPatchShaders = toml::find_or(gpu, "patchShaders", true); vblankDivider = toml::find_or(gpu, "vblankDivider", 1); + GammaValue = toml::find_or(gpu, "GammaValue", 1000); } if (data.contains("Vulkan")) { @@ -668,6 +678,7 @@ void save(const std::filesystem::path& path) { data["GPU"]["dumpShaders"] = shouldDumpShaders; data["GPU"]["patchShaders"] = shouldPatchShaders; data["GPU"]["vblankDivider"] = vblankDivider; + data["GPU"]["GammaValue"] = GammaValue; data["Vulkan"]["gpuId"] = gpuId; data["Vulkan"]["validation"] = vkValidation; data["Vulkan"]["validation_sync"] = vkValidationSync; @@ -775,6 +786,7 @@ void setDefaultValues() { m_language = 1; gpuId = -1; separateupdatefolder = false; + GammaValue = 1000; } -} // namespace Config +} // namespace Config \ No newline at end of file diff --git a/src/common/config.h b/src/common/config.h index ff3b3703f..cd82ba098 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -21,6 +21,7 @@ bool getPlayBGM(); int getBGMvolume(); bool getEnableDiscordRPC(); bool getSeparateUpdateEnabled(); +int getGammaValue(); std::string getLogFilter(); std::string getLogType(); @@ -68,6 +69,7 @@ void setNeoMode(bool enable); void setUserName(const std::string& type); void setUpdateChannel(const std::string& type); void setSeparateUpdateEnabled(bool use); +void setGammaValue(int value); void setGameInstallDirs(const std::vector& settings_install_dirs_config); void setCursorState(s16 cursorState); diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 0b5137c4b..bccef11a5 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -26,6 +26,8 @@ #include "common/discord_rpc_handler.h" #endif +bool isGameRunning = false; + MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); installEventFilter(this); diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h index 5ae2540ec..2ea3433db 100644 --- a/src/qt_gui/main_window.h +++ b/src/qt_gui/main_window.h @@ -22,6 +22,7 @@ #include "main_window_ui.h" #include "pkg_viewer.h" +extern bool isGameRunning; class GameListFrame; class MainWindow : public QMainWindow { @@ -70,7 +71,6 @@ private: QIcon RecolorIcon(const QIcon& icon, bool isWhite); bool isIconBlack = false; bool isTableList = true; - bool isGameRunning = false; QActionGroup* m_icon_size_act_group = nullptr; QActionGroup* m_list_mode_act_group = nullptr; QActionGroup* m_theme_act_group = nullptr; diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 09d3674f7..346e39a2e 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -19,6 +19,9 @@ #include "main_window.h" #include "settings_dialog.h" #include "ui_settings_dialog.h" +#include "video_core/renderer_vulkan/vk_presenter.h" + +extern std::unique_ptr presenter; QStringList languageNames = {"Arabic", "Czech", "Danish", @@ -108,6 +111,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge } else if (button == ui->buttonBox->button(QDialogButtonBox::Close)) { ResetInstallFolders(); } + if (Common::Log::IsActive()) { Common::Log::Filter filter; filter.ParseFilterString(Config::getLogFilter()); @@ -148,6 +152,13 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge [this](s16 index) { OnCursorStateChanged(index); }); } + // Graphics TAB + { + connect(ui->GammaSlider, &QSlider::valueChanged, this, + [this](int value) { GammaSliderChange(value); }); + connect(ui->ResetGammaButton, &QPushButton::clicked, this, [this]() { ResetGamma(); }); + } + // PATH TAB { connect(ui->addFolderButton, &QPushButton::clicked, this, [this]() { @@ -207,6 +218,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge ui->heightDivider->installEventFilter(this); ui->dumpShadersCheckBox->installEventFilter(this); ui->nullGpuCheckBox->installEventFilter(this); + ui->GammaSlider->installEventFilter(this); // Paths ui->gameFoldersGroupBox->installEventFilter(this); @@ -282,6 +294,7 @@ void SettingsDialog::LoadValuesFromConfig() { ui->vkSyncValidationCheckBox->setChecked( toml::find_or(data, "Vulkan", "validation_sync", false)); ui->rdocCheckBox->setChecked(toml::find_or(data, "Vulkan", "rdocEnable", false)); + ui->GammaSlider->setValue(toml::find_or(data, "GPU", "GammaValue", 1000)); #ifdef ENABLE_UPDATER ui->updateCheckBox->setChecked(toml::find_or(data, "General", "autoUpdate", false)); @@ -361,6 +374,18 @@ void SettingsDialog::OnCursorStateChanged(s16 index) { } } +void SettingsDialog::GammaSliderChange(int value) { + float Gammafloat = static_cast((value / 1000.0f)); + + if (isGameRunning) { + presenter->GetGammaRef() = Gammafloat; + } +} + +void SettingsDialog::ResetGamma() { + ui->GammaSlider->setValue(1000); +} + int SettingsDialog::exec() { return QDialog::exec(); } @@ -509,6 +534,7 @@ void SettingsDialog::UpdateSettings() { Config::setRdocEnabled(ui->rdocCheckBox->isChecked()); Config::setAutoUpdate(ui->updateCheckBox->isChecked()); Config::setUpdateChannel(ui->updateComboBox->currentText().toStdString()); + Config::setGammaValue(ui->GammaSlider->value()); #ifdef ENABLE_DISCORD_RPC auto* rpc = Common::Singleton::Instance(); diff --git a/src/qt_gui/settings_dialog.h b/src/qt_gui/settings_dialog.h index 987b35d45..b6ebc4a0d 100644 --- a/src/qt_gui/settings_dialog.h +++ b/src/qt_gui/settings_dialog.h @@ -36,6 +36,8 @@ private: void InitializeEmulatorLanguages(); void OnLanguageChanged(int index); void OnCursorStateChanged(s16 index); + void GammaSliderChange(int value); + void ResetGamma(); std::unique_ptr ui; diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index cce728f65..5f6472eb5 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -60,8 +60,8 @@ 0 0 - 832 - 431 + 815 + 623 @@ -696,7 +696,7 @@ 5 - + true @@ -897,20 +897,34 @@ - - - - 0 - - - 0 - - - 0 - - - 0 - + + + Gamma Correction + + + + + + 1 + + + 2000 + + + 1000 + + + Qt::Orientation::Horizontal + + + + + + + Reset Gamma + + + diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index b7d829316..1ac75b8db 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/config.h" #include "common/debug.h" #include "common/singleton.h" #include "core/debug_state.h" diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 4c29af0f0..c51136f50 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -5,6 +5,7 @@ #include +#include "common/config.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" @@ -42,7 +43,7 @@ class Rasterizer; class Presenter { struct PostProcessSettings { - float gamma = 1.0f; + float gamma = static_cast((Config::getGammaValue() / 1000.0f)); }; public: