diff --git a/src/duckstation-qt/advancedsettingswidget.cpp b/src/duckstation-qt/advancedsettingswidget.cpp index 837485555..a8fb78b0e 100644 --- a/src/duckstation-qt/advancedsettingswidget.cpp +++ b/src/duckstation-qt/advancedsettingswidget.cpp @@ -1,8 +1,60 @@ #include "advancedsettingswidget.h" #include "mainwindow.h" +#include "qtutils.h" #include "settingsdialog.h" #include "settingwidgetbinder.h" +static void addBooleanTweakOption(QtHostInterface* host_interface, QTableWidget* table, QString name, + std::string section, std::string key, bool default_value) +{ + const int row = table->rowCount(); + const bool current_value = host_interface->GetBoolSettingValue(section.c_str(), key.c_str(), default_value); + + table->insertRow(row); + + QTableWidgetItem* name_item = new QTableWidgetItem(name); + table->setItem(row, 0, name_item); + + QCheckBox* cb = new QCheckBox(table); + SettingWidgetBinder::BindWidgetToBoolSetting(host_interface, cb, std::move(section), std::move(key), default_value); + table->setCellWidget(row, 1, cb); +} + +static void setBooleanTweakOption(QTableWidget* table, int row, bool value) +{ + QWidget* widget = table->cellWidget(row, 1); + QCheckBox* cb = qobject_cast(widget); + Assert(cb); + cb->setChecked(value); +} + +static void addIntRangeTweakOption(QtHostInterface* host_interface, QTableWidget* table, QString name, + std::string section, std::string key, int min_value, int max_value, + int default_value) +{ + const int row = table->rowCount(); + const bool current_value = host_interface->GetBoolSettingValue(section.c_str(), key.c_str(), default_value); + + table->insertRow(row); + + QTableWidgetItem* name_item = new QTableWidgetItem(name); + table->setItem(row, 0, name_item); + + QSpinBox* cb = new QSpinBox(table); + cb->setMinimum(min_value); + cb->setMaximum(max_value); + SettingWidgetBinder::BindWidgetToIntSetting(host_interface, cb, std::move(section), std::move(key), default_value); + table->setCellWidget(row, 1, cb); +} + +static void setIntRangeTweakOption(QTableWidget* table, int row, int value) +{ + QWidget* widget = table->cellWidget(row, 1); + QSpinBox* cb = qobject_cast(widget); + Assert(cb); + cb->setValue(value); +} + AdvancedSettingsWidget::AdvancedSettingsWidget(QtHostInterface* host_interface, QWidget* parent, SettingsDialog* dialog) : QWidget(parent), m_host_interface(host_interface) { @@ -20,39 +72,46 @@ AdvancedSettingsWidget::AdvancedSettingsWidget(QtHostInterface* host_interface, SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.logToWindow, "Logging", "LogToWindow"); SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.logToFile, "Logging", "LogToFile"); - // Tweaks/Hacks section - SettingWidgetBinder::BindWidgetToIntSetting(m_host_interface, m_ui.dmaMaxSliceTicks, "Hacks", "DMAMaxSliceTicks"); - SettingWidgetBinder::BindWidgetToIntSetting(m_host_interface, m_ui.dmaHaltTicks, "Hacks", "DMAHaltTicks"); - SettingWidgetBinder::BindWidgetToIntSetting(m_host_interface, m_ui.gpuFIFOSize, "Hacks", "GPUFIFOSize"); - SettingWidgetBinder::BindWidgetToIntSetting(m_host_interface, m_ui.gpuMaxRunAhead, "Hacks", "GPUMaxRunAhead"); - SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cpuRecompilerMemoryExceptions, "CPU", - "RecompilerMemoryExceptions", false); - SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cpuRecompilerICache, "CPU", "RecompilerICache", - false); - SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.showDebugMenu, "Main", "ShowDebugMenu"); - SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.gpuUseDebugDevice, "GPU", "UseDebugDevice"); connect(m_ui.resetToDefaultButton, &QPushButton::clicked, this, &AdvancedSettingsWidget::onResetToDefaultClicked); connect(m_ui.showDebugMenu, &QCheckBox::toggled, m_host_interface->getMainWindow(), &MainWindow::updateDebugMenuVisibility, Qt::QueuedConnection); - dialog->registerWidgetHelp(m_ui.gpuUseDebugDevice, tr("Use Debug Host GPU Device"), tr("Unchecked"), - tr("Enables the usage of debug devices and shaders for rendering APIs which support them. " - "Should only be used when debugging the emulator.")); - dialog->registerWidgetHelp( - m_ui.cpuRecompilerICache, tr("Enable Recompiler ICache"), tr("Unchecked"), - tr("Determines whether the CPU's instruction cache is simulated in the recompiler. Improves accuracy at a small " - "cost to performance. If games are running too fast, try enabling this option.")); + m_ui.tweakOptionTable->setColumnWidth(0, 380); + + addBooleanTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("PGXP Vertex Cache"), "GPU", "PGXPVertexCache", + false); + addBooleanTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("PGXP CPU Mode"), "GPU", "PGXPCPUMode", false); + + addBooleanTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("Enable Recompiler Memory Exceptions"), "CPU", + "RecompilerMemoryExceptions", false); + addBooleanTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("Enable Recompiler ICache"), "CPU", + "RecompilerICache", false); + + addIntRangeTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("DMA Max Slice Ticks"), "Hacks", + "DMAMaxSliceTicks", 100, 10000, Settings::DEFAULT_DMA_MAX_SLICE_TICKS); + addIntRangeTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("DMA Halt Ticks"), "Hacks", "DMAHaltTicks", 100, + 10000, Settings::DEFAULT_DMA_HALT_TICKS); + addIntRangeTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("GPU FIFO Size"), "Hacks", "GPUFIFOSize", 16, 4096, + Settings::DEFAULT_GPU_FIFO_SIZE); + addIntRangeTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("GPU Max Run-Ahead"), "Hacks", "GPUMaxRunAhead", 0, + 1000, Settings::DEFAULT_GPU_MAX_RUN_AHEAD); + addBooleanTweakOption(m_host_interface, m_ui.tweakOptionTable, tr("Use Debug Host GPU Device"), "GPU", + "UseDebugDevice", false); } AdvancedSettingsWidget::~AdvancedSettingsWidget() = default; void AdvancedSettingsWidget::onResetToDefaultClicked() { - m_ui.dmaMaxSliceTicks->setValue(static_cast(Settings::DEFAULT_DMA_MAX_SLICE_TICKS)); - m_ui.dmaHaltTicks->setValue(static_cast(Settings::DEFAULT_DMA_HALT_TICKS)); - m_ui.gpuFIFOSize->setValue(static_cast(Settings::DEFAULT_GPU_FIFO_SIZE)); - m_ui.gpuMaxRunAhead->setValue(static_cast(Settings::DEFAULT_GPU_MAX_RUN_AHEAD)); - m_ui.cpuRecompilerMemoryExceptions->setChecked(false); + setBooleanTweakOption(m_ui.tweakOptionTable, 0, false); + setBooleanTweakOption(m_ui.tweakOptionTable, 1, false); + setBooleanTweakOption(m_ui.tweakOptionTable, 2, false); + setBooleanTweakOption(m_ui.tweakOptionTable, 3, false); + setIntRangeTweakOption(m_ui.tweakOptionTable, 4, static_cast(Settings::DEFAULT_DMA_MAX_SLICE_TICKS)); + setIntRangeTweakOption(m_ui.tweakOptionTable, 5, static_cast(Settings::DEFAULT_DMA_HALT_TICKS)); + setIntRangeTweakOption(m_ui.tweakOptionTable, 6, static_cast(Settings::DEFAULT_GPU_FIFO_SIZE)); + setIntRangeTweakOption(m_ui.tweakOptionTable, 7, static_cast(Settings::DEFAULT_GPU_MAX_RUN_AHEAD)); + setBooleanTweakOption(m_ui.tweakOptionTable, 8, false); } diff --git a/src/duckstation-qt/advancedsettingswidget.h b/src/duckstation-qt/advancedsettingswidget.h index 366cef5b9..85ae96387 100644 --- a/src/duckstation-qt/advancedsettingswidget.h +++ b/src/duckstation-qt/advancedsettingswidget.h @@ -1,5 +1,5 @@ #pragma once - +#include #include #include "ui_advancedsettingswidget.h" @@ -16,9 +16,40 @@ public: ~AdvancedSettingsWidget(); private: + struct TweakOption + { + enum class Type + { + Boolean, + IntRange + }; + + Type type; + QString description; + std::string key; + std::string section; + + union + { + struct + { + bool default_value; + } boolean; + + struct + { + int min_value; + int max_value; + int default_value; + } int_range; + }; + }; + Ui::AdvancedSettingsWidget m_ui; void onResetToDefaultClicked(); QtHostInterface* m_host_interface; + + QVector m_tweak_options; }; diff --git a/src/duckstation-qt/advancedsettingswidget.ui b/src/duckstation-qt/advancedsettingswidget.ui index d75529513..861525121 100644 --- a/src/duckstation-qt/advancedsettingswidget.ui +++ b/src/duckstation-qt/advancedsettingswidget.ui @@ -6,8 +6,8 @@ 0 0 - 502 - 623 + 973 + 507 @@ -91,129 +91,12 @@ - - - - Tweaks/Hacks - - - - - - These options are tweakable to improve performance/game compatibility. Use at your own risk, modified values will not be supported. - - - true - - - - - - - DMA Max Slice Ticks: - - - - - - - 100 - - - 10000 - - - 1000 - - - - - - - DMA Halt Ticks: - - - - - - - 100 - - - 10000 - - - 100 - - - - - - - 16 - - - 4096 - - - 16 - - - - - - - GPU FIFO Size: - - - - - - - GPU Max Run-Ahead: - - - - - - - 1000 - - - 128 - - - - - - - Enable Recompiler Memory Exceptions - - - - - - - Enable Recompiler ICache - - - - - - - Reset To Default - - - - - - System Settings - + @@ -221,10 +104,54 @@ - - + + + + + + + Tweaks/Hacks + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + false + + + false + + + false + + + + Option + + + + + Value + + + + + + - Use Debug Host GPU Device + Reset To Default diff --git a/src/duckstation-qt/gpusettingswidget.cpp b/src/duckstation-qt/gpusettingswidget.cpp index 15964ad4f..dc64c8118 100644 --- a/src/duckstation-qt/gpusettingswidget.cpp +++ b/src/duckstation-qt/gpusettingswidget.cpp @@ -44,8 +44,6 @@ GPUSettingsWidget::GPUSettingsWidget(QtHostInterface* host_interface, QWidget* p SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.pgxpCulling, "GPU", "PGXPCulling", true); SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.pgxpTextureCorrection, "GPU", "PGXPTextureCorrection", true); - SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.pgxpVertexCache, "GPU", "PGXPVertexCache", false); - SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.pgxpCPUMode, "GPU", "PGXPCPUMode", false); connect(m_ui.resolutionScale, QOverload::of(&QComboBox::currentIndexChanged), this, &GPUSettingsWidget::updateScaledDitheringEnabled); @@ -144,13 +142,6 @@ GPUSettingsWidget::GPUSettingsWidget(QtHostInterface* host_interface, QWidget* p dialog->registerWidgetHelp(m_ui.pgxpTextureCorrection, tr("Texture Correction"), tr("Checked"), tr("Uses perspective-correct interpolation for texture coordinates and colors, " "straightening out warped textures. Requires geometry correction enabled.")); - dialog->registerWidgetHelp(m_ui.pgxpVertexCache, tr("Vertex Cache"), tr("Unchecked"), - tr("Uses screen coordinates as a fallback when tracking vertices through memory fails. " - "May improve PGXP compatibility.")); - dialog->registerWidgetHelp( - m_ui.pgxpCPUMode, tr("CPU Mode"), tr("Unchecked"), - tr("Tries to track vertex manipulation through the CPU. Some games require this option for PGXP to be effective. " - "Very slow, and incompatible with the recompiler.")); } GPUSettingsWidget::~GPUSettingsWidget() = default; @@ -244,6 +235,4 @@ void GPUSettingsWidget::updatePGXPSettingsEnabled() const bool enabled = m_ui.pgxpEnable->isChecked(); m_ui.pgxpCulling->setEnabled(enabled); m_ui.pgxpTextureCorrection->setEnabled(enabled); - m_ui.pgxpVertexCache->setEnabled(enabled); - m_ui.pgxpCPUMode->setEnabled(enabled); } diff --git a/src/duckstation-qt/gpusettingswidget.ui b/src/duckstation-qt/gpusettingswidget.ui index 0d858dde2..f4e8b4b4b 100644 --- a/src/duckstation-qt/gpusettingswidget.ui +++ b/src/duckstation-qt/gpusettingswidget.ui @@ -208,20 +208,6 @@ - - - - Vertex Cache - - - - - - - CPU Mode - - -