From 61a66ed908a254cb745ac36627bce89de40868cd Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Wed, 30 Sep 2020 00:29:47 +1000 Subject: [PATCH] Qt: Add options for CPU overclocking --- src/duckstation-qt/consolesettingswidget.cpp | 66 +++++++++++++++++++ src/duckstation-qt/consolesettingswidget.h | 7 ++ src/duckstation-qt/consolesettingswidget.ui | 69 +++++++++++++++++++- 3 files changed, 140 insertions(+), 2 deletions(-) diff --git a/src/duckstation-qt/consolesettingswidget.cpp b/src/duckstation-qt/consolesettingswidget.cpp index ec0033712..7e43cc10e 100644 --- a/src/duckstation-qt/consolesettingswidget.cpp +++ b/src/duckstation-qt/consolesettingswidget.cpp @@ -1,6 +1,9 @@ #include "consolesettingswidget.h" +#include "core/system.h" +#include "qtutils.h" #include "settingsdialog.h" #include "settingwidgetbinder.h" +#include ConsoleSettingsWidget::ConsoleSettingsWidget(QtHostInterface* host_interface, QWidget* parent, SettingsDialog* dialog) : QWidget(parent), m_host_interface(host_interface) @@ -25,6 +28,8 @@ ConsoleSettingsWidget::ConsoleSettingsWidget(QtHostInterface* host_interface, QW SettingWidgetBinder::BindWidgetToEnumSetting(m_host_interface, m_ui.cpuExecutionMode, "CPU", "ExecutionMode", &Settings::ParseCPUExecutionMode, &Settings::GetCPUExecutionModeName, Settings::DEFAULT_CPU_EXECUTION_MODE); + SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.enableCPUClockSpeedControl, "CPU", + "OverclockEnable", false); SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cdromReadThread, "CDROM", "ReadThread"); SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cdromRegionCheck, "CDROM", "RegionCheck"); SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cdromLoadImageToRAM, "CDROM", "LoadImageToRAM", @@ -34,6 +39,67 @@ ConsoleSettingsWidget::ConsoleSettingsWidget(QtHostInterface* host_interface, QW m_ui.cdromLoadImageToRAM, tr("Preload Image to RAM"), tr("Unchecked"), tr("Loads the game image into RAM. Useful for network paths that may become unreliable during gameplay. In some " "cases also eliminates stutter when games initiate audio track playback.")); + + m_ui.cpuClockSpeed->setEnabled(m_ui.enableCPUClockSpeedControl->checkState() == Qt::Checked); + connect(m_ui.enableCPUClockSpeedControl, &QCheckBox::stateChanged, this, + &ConsoleSettingsWidget::onEnableCPUClockSpeedControlChecked); + connect(m_ui.cpuClockSpeed, &QSlider::valueChanged, this, &ConsoleSettingsWidget::onCPUClockSpeedValueChanged); + + calculateCPUClockValue(); } ConsoleSettingsWidget::~ConsoleSettingsWidget() = default; + +void ConsoleSettingsWidget::onEnableCPUClockSpeedControlChecked(int state) +{ + if (state == Qt::Checked && !m_host_interface->GetBoolSettingValue("UI", "CPUOverclockingWarningShown", false)) + { + const QString message = + tr("Enabling CPU overclocking will break games, cause bugs, reduce performance and can significantly increase " + "system requirements.\n\nBy enabling this option you are agreeing to not create any bug reports unless you " + "have confirmed the bug also occurs with overclocking disabled.\n\nThis warning will only be shown once."); + const QString yes_button = tr("Yes, I will confirm bugs without overclocking before reporting."); + const QString no_button = tr("No, take me back to safety."); + + if (QMessageBox::question(QtUtils::GetRootWidget(this), tr("CPU Overclocking Warning"), message, yes_button, + no_button) != 0) + { + QSignalBlocker sb(m_ui.enableCPUClockSpeedControl); + m_ui.enableCPUClockSpeedControl->setChecked(Qt::Unchecked); + return; + } + + m_host_interface->SetBoolSettingValue("UI", "CPUOverclockingWarningShown", true); + } + + m_ui.cpuClockSpeed->setEnabled(state == Qt::Checked); + updateCPUClockSpeedLabel(); +} + +void ConsoleSettingsWidget::onCPUClockSpeedValueChanged(int value) +{ + const u32 percent = static_cast(m_ui.cpuClockSpeed->value()); + u32 numerator, denominator; + Settings::CPUOverclockPercentToFraction(percent, &numerator, &denominator); + m_host_interface->SetIntSettingValue("CPU", "OverclockNumerator", static_cast(numerator)); + m_host_interface->SetIntSettingValue("CPU", "OverclockDenominator", static_cast(denominator)); + updateCPUClockSpeedLabel(); + m_host_interface->applySettings(); +} + +void ConsoleSettingsWidget::updateCPUClockSpeedLabel() +{ + const int percent = m_ui.enableCPUClockSpeedControl->isChecked() ? m_ui.cpuClockSpeed->value() : 100; + const double frequency = (static_cast(System::MASTER_CLOCK) * static_cast(percent)) / 100.0; + m_ui.cpuClockSpeedLabel->setText(tr("%1% (%2MHz)").arg(percent).arg(frequency / 1000000.0, 0, 'f', 2)); +} + +void ConsoleSettingsWidget::calculateCPUClockValue() +{ + const u32 numerator = static_cast(m_host_interface->GetIntSettingValue("CPU", "OverclockNumerator", 1)); + const u32 denominator = static_cast(m_host_interface->GetIntSettingValue("CPU", "OverclockDenominator", 1)); + const u32 percent = Settings::CPUOverclockFractionToPercent(numerator, denominator); + QSignalBlocker sb(m_ui.cpuClockSpeed); + m_ui.cpuClockSpeed->setValue(static_cast(percent)); + updateCPUClockSpeedLabel(); +} diff --git a/src/duckstation-qt/consolesettingswidget.h b/src/duckstation-qt/consolesettingswidget.h index 17d498681..9f339f8c1 100644 --- a/src/duckstation-qt/consolesettingswidget.h +++ b/src/duckstation-qt/consolesettingswidget.h @@ -15,7 +15,14 @@ public: explicit ConsoleSettingsWidget(QtHostInterface* host_interface, QWidget* parent, SettingsDialog* dialog); ~ConsoleSettingsWidget(); +private Q_SLOTS: + void onEnableCPUClockSpeedControlChecked(int state); + void onCPUClockSpeedValueChanged(int value); + void updateCPUClockSpeedLabel(); + private: + void calculateCPUClockValue(); + Ui::ConsoleSettingsWidget m_ui; QtHostInterface* m_host_interface; diff --git a/src/duckstation-qt/consolesettingswidget.ui b/src/duckstation-qt/consolesettingswidget.ui index 99c3ce0bd..ab570636d 100644 --- a/src/duckstation-qt/consolesettingswidget.ui +++ b/src/duckstation-qt/consolesettingswidget.ui @@ -6,8 +6,8 @@ 0 0 - 502 - 255 + 541 + 351 @@ -64,6 +64,71 @@ + + + + CPU Clock Speed Control + + + + + + + + Enable Clock Speed Control (Overclocking/Underclocking) + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 100% (effective 33.3mhz) + + + Qt::AlignCenter + + + + + + + + + 10 + + + 1000 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBothSides + + + 50 + + + + + +