diff options
| author | 2020-07-11 16:25:49 +0100 | |
|---|---|---|
| committer | 2020-07-11 16:38:38 +0100 | |
| commit | 505aa3a4c1eb2384ab5a46aecf6431db239b74e3 (patch) | |
| tree | 8576d3b825f7cd85122b857f5b10c6f9eae1b87e /src | |
| parent | configuration: Add settings to enable/disable specific CPU optimizations (diff) | |
| download | yuzu-505aa3a4c1eb2384ab5a46aecf6431db239b74e3.tar.gz yuzu-505aa3a4c1eb2384ab5a46aecf6431db239b74e3.tar.xz yuzu-505aa3a4c1eb2384ab5a46aecf6431db239b74e3.zip | |
configure_cpu: Show/Hide debugging options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 48 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 48 | ||||
| -rw-r--r-- | src/core/settings.h | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 6 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.cpp | 22 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.ui | 48 |
7 files changed, 135 insertions, 46 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 369a081cd..443ca72eb 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -143,29 +143,31 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& | |||
| 143 | config.wall_clock_cntpct = uses_wall_clock; | 143 | config.wall_clock_cntpct = uses_wall_clock; |
| 144 | 144 | ||
| 145 | // Safe optimizations | 145 | // Safe optimizations |
| 146 | if (!Settings::values.cpuopt_page_tables) { | 146 | if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) { |
| 147 | config.page_table = nullptr; | 147 | if (!Settings::values.cpuopt_page_tables) { |
| 148 | } | 148 | config.page_table = nullptr; |
| 149 | if (!Settings::values.cpuopt_block_linking) { | 149 | } |
| 150 | config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking; | 150 | if (!Settings::values.cpuopt_block_linking) { |
| 151 | } | 151 | config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking; |
| 152 | if (!Settings::values.cpuopt_return_stack_buffer) { | 152 | } |
| 153 | config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer; | 153 | if (!Settings::values.cpuopt_return_stack_buffer) { |
| 154 | } | 154 | config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer; |
| 155 | if (!Settings::values.cpuopt_fast_dispatcher) { | 155 | } |
| 156 | config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch; | 156 | if (!Settings::values.cpuopt_fast_dispatcher) { |
| 157 | } | 157 | config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch; |
| 158 | if (!Settings::values.cpuopt_context_elimination) { | 158 | } |
| 159 | config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination; | 159 | if (!Settings::values.cpuopt_context_elimination) { |
| 160 | } | 160 | config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination; |
| 161 | if (!Settings::values.cpuopt_const_prop) { | 161 | } |
| 162 | config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp; | 162 | if (!Settings::values.cpuopt_const_prop) { |
| 163 | } | 163 | config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp; |
| 164 | if (!Settings::values.cpuopt_misc_ir) { | 164 | } |
| 165 | config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt; | 165 | if (!Settings::values.cpuopt_misc_ir) { |
| 166 | } | 166 | config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt; |
| 167 | if (!Settings::values.cpuopt_reduce_misalign_checks) { | 167 | } |
| 168 | config.only_detect_misalignment_via_page_table_on_page_boundary = false; | 168 | if (!Settings::values.cpuopt_reduce_misalign_checks) { |
| 169 | config.only_detect_misalignment_via_page_table_on_page_boundary = false; | ||
| 170 | } | ||
| 169 | } | 171 | } |
| 170 | 172 | ||
| 171 | return std::make_unique<Dynarmic::A32::Jit>(config); | 173 | return std::make_unique<Dynarmic::A32::Jit>(config); |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index e208a4aa7..a63a04a25 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -195,29 +195,31 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable& | |||
| 195 | config.wall_clock_cntpct = uses_wall_clock; | 195 | config.wall_clock_cntpct = uses_wall_clock; |
| 196 | 196 | ||
| 197 | // Safe optimizations | 197 | // Safe optimizations |
| 198 | if (!Settings::values.cpuopt_page_tables) { | 198 | if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) { |
| 199 | config.page_table = nullptr; | 199 | if (!Settings::values.cpuopt_page_tables) { |
| 200 | } | 200 | config.page_table = nullptr; |
| 201 | if (!Settings::values.cpuopt_block_linking) { | 201 | } |
| 202 | config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking; | 202 | if (!Settings::values.cpuopt_block_linking) { |
| 203 | } | 203 | config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking; |
| 204 | if (!Settings::values.cpuopt_return_stack_buffer) { | 204 | } |
| 205 | config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer; | 205 | if (!Settings::values.cpuopt_return_stack_buffer) { |
| 206 | } | 206 | config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer; |
| 207 | if (!Settings::values.cpuopt_fast_dispatcher) { | 207 | } |
| 208 | config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch; | 208 | if (!Settings::values.cpuopt_fast_dispatcher) { |
| 209 | } | 209 | config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch; |
| 210 | if (!Settings::values.cpuopt_context_elimination) { | 210 | } |
| 211 | config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination; | 211 | if (!Settings::values.cpuopt_context_elimination) { |
| 212 | } | 212 | config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination; |
| 213 | if (!Settings::values.cpuopt_const_prop) { | 213 | } |
| 214 | config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp; | 214 | if (!Settings::values.cpuopt_const_prop) { |
| 215 | } | 215 | config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp; |
| 216 | if (!Settings::values.cpuopt_misc_ir) { | 216 | } |
| 217 | config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt; | 217 | if (!Settings::values.cpuopt_misc_ir) { |
| 218 | } | 218 | config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt; |
| 219 | if (!Settings::values.cpuopt_reduce_misalign_checks) { | 219 | } |
| 220 | config.only_detect_misalignment_via_page_table_on_page_boundary = false; | 220 | if (!Settings::values.cpuopt_reduce_misalign_checks) { |
| 221 | config.only_detect_misalignment_via_page_table_on_page_boundary = false; | ||
| 222 | } | ||
| 221 | } | 223 | } |
| 222 | 224 | ||
| 223 | return std::make_shared<Dynarmic::A64::Jit>(config); | 225 | return std::make_shared<Dynarmic::A64::Jit>(config); |
diff --git a/src/core/settings.h b/src/core/settings.h index c081c083f..b3451a704 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -382,6 +382,11 @@ enum class GPUAccuracy : u32 { | |||
| 382 | Extreme = 2, | 382 | Extreme = 2, |
| 383 | }; | 383 | }; |
| 384 | 384 | ||
| 385 | enum class CPUAccuracy { | ||
| 386 | Accurate = 0, | ||
| 387 | DebugMode = 1, | ||
| 388 | }; | ||
| 389 | |||
| 385 | extern bool configuring_global; | 390 | extern bool configuring_global; |
| 386 | 391 | ||
| 387 | template <typename Type> | 392 | template <typename Type> |
| @@ -428,6 +433,8 @@ struct Values { | |||
| 428 | Setting<bool> use_multi_core; | 433 | Setting<bool> use_multi_core; |
| 429 | 434 | ||
| 430 | // Cpu | 435 | // Cpu |
| 436 | CPUAccuracy cpu_accuracy; | ||
| 437 | |||
| 431 | bool cpuopt_page_tables; | 438 | bool cpuopt_page_tables; |
| 432 | bool cpuopt_block_linking; | 439 | bool cpuopt_block_linking; |
| 433 | bool cpuopt_return_stack_buffer; | 440 | bool cpuopt_return_stack_buffer; |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index f28e345a5..430e78e5f 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -635,6 +635,9 @@ void Config::ReadCpuValues() { | |||
| 635 | qt_config->beginGroup(QStringLiteral("Cpu")); | 635 | qt_config->beginGroup(QStringLiteral("Cpu")); |
| 636 | 636 | ||
| 637 | if (global) { | 637 | if (global) { |
| 638 | Settings::values.cpu_accuracy = static_cast<Settings::CPUAccuracy>( | ||
| 639 | ReadSetting(QStringLiteral("cpu_accuracy"), 0).toInt()); | ||
| 640 | |||
| 638 | Settings::values.cpuopt_page_tables = | 641 | Settings::values.cpuopt_page_tables = |
| 639 | ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool(); | 642 | ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool(); |
| 640 | Settings::values.cpuopt_block_linking = | 643 | Settings::values.cpuopt_block_linking = |
| @@ -1125,6 +1128,9 @@ void Config::SaveCpuValues() { | |||
| 1125 | qt_config->beginGroup(QStringLiteral("Cpu")); | 1128 | qt_config->beginGroup(QStringLiteral("Cpu")); |
| 1126 | 1129 | ||
| 1127 | if (global) { | 1130 | if (global) { |
| 1131 | WriteSetting(QStringLiteral("cpu_accuracy"), | ||
| 1132 | static_cast<int>(Settings::values.cpu_accuracy), 0); | ||
| 1133 | |||
| 1128 | WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables, | 1134 | WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables, |
| 1129 | true); | 1135 | true); |
| 1130 | WriteSetting(QStringLiteral("cpuopt_block_linking"), Settings::values.cpuopt_block_linking, | 1136 | WriteSetting(QStringLiteral("cpuopt_block_linking"), Settings::values.cpuopt_block_linking, |
diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 28e010b6b..4fc392a7e 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp | |||
| @@ -15,6 +15,9 @@ ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::Config | |||
| 15 | ui->setupUi(this); | 15 | ui->setupUi(this); |
| 16 | 16 | ||
| 17 | SetConfiguration(); | 17 | SetConfiguration(); |
| 18 | |||
| 19 | connect(ui->accuracy, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||
| 20 | &ConfigureCpu::UpdateGroups); | ||
| 18 | } | 21 | } |
| 19 | 22 | ||
| 20 | ConfigureCpu::~ConfigureCpu() = default; | 23 | ConfigureCpu::~ConfigureCpu() = default; |
| @@ -22,6 +25,10 @@ ConfigureCpu::~ConfigureCpu() = default; | |||
| 22 | void ConfigureCpu::SetConfiguration() { | 25 | void ConfigureCpu::SetConfiguration() { |
| 23 | const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); | 26 | const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); |
| 24 | 27 | ||
| 28 | ui->accuracy->setEnabled(runtime_lock); | ||
| 29 | ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy)); | ||
| 30 | UpdateGroups(static_cast<int>(Settings::values.cpu_accuracy)); | ||
| 31 | |||
| 25 | ui->cpuopt_page_tables->setEnabled(runtime_lock); | 32 | ui->cpuopt_page_tables->setEnabled(runtime_lock); |
| 26 | ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables); | 33 | ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables); |
| 27 | ui->cpuopt_block_linking->setEnabled(runtime_lock); | 34 | ui->cpuopt_block_linking->setEnabled(runtime_lock); |
| @@ -40,7 +47,22 @@ void ConfigureCpu::SetConfiguration() { | |||
| 40 | ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks); | 47 | ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks); |
| 41 | } | 48 | } |
| 42 | 49 | ||
| 50 | void ConfigureCpu::UpdateGroups(int index) { | ||
| 51 | switch (index) { | ||
| 52 | case 0: | ||
| 53 | default: | ||
| 54 | ui->group_safe->setVisible(false); | ||
| 55 | break; | ||
| 56 | case 1: | ||
| 57 | ui->group_safe->setVisible(true); | ||
| 58 | break; | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 43 | void ConfigureCpu::ApplyConfiguration() { | 62 | void ConfigureCpu::ApplyConfiguration() { |
| 63 | Settings::values.cpu_accuracy = | ||
| 64 | static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()); | ||
| 65 | |||
| 44 | Settings::values.cpuopt_page_tables = ui->cpuopt_page_tables->isChecked(); | 66 | Settings::values.cpuopt_page_tables = ui->cpuopt_page_tables->isChecked(); |
| 45 | Settings::values.cpuopt_block_linking = ui->cpuopt_block_linking->isChecked(); | 67 | Settings::values.cpuopt_block_linking = ui->cpuopt_block_linking->isChecked(); |
| 46 | Settings::values.cpuopt_return_stack_buffer = ui->cpuopt_return_stack_buffer->isChecked(); | 68 | Settings::values.cpuopt_return_stack_buffer = ui->cpuopt_return_stack_buffer->isChecked(); |
diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h index a4c6e5f20..cf55980b0 100644 --- a/src/yuzu/configuration/configure_cpu.h +++ b/src/yuzu/configuration/configure_cpu.h | |||
| @@ -25,6 +25,8 @@ private: | |||
| 25 | void changeEvent(QEvent* event) override; | 25 | void changeEvent(QEvent* event) override; |
| 26 | void RetranslateUI(); | 26 | void RetranslateUI(); |
| 27 | 27 | ||
| 28 | void UpdateGroups(int index); | ||
| 29 | |||
| 28 | void SetConfiguration(); | 30 | void SetConfiguration(); |
| 29 | 31 | ||
| 30 | std::unique_ptr<Ui::ConfigureCpu> ui; | 32 | std::unique_ptr<Ui::ConfigureCpu> ui; |
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui index d04cfb2d5..27bd4aa42 100644 --- a/src/yuzu/configuration/configure_cpu.ui +++ b/src/yuzu/configuration/configure_cpu.ui | |||
| @@ -19,6 +19,54 @@ | |||
| 19 | <item> | 19 | <item> |
| 20 | <widget class="QGroupBox"> | 20 | <widget class="QGroupBox"> |
| 21 | <property name="title"> | 21 | <property name="title"> |
| 22 | <string>General</string> | ||
| 23 | </property> | ||
| 24 | <layout class="QVBoxLayout"> | ||
| 25 | <item> | ||
| 26 | <layout class="QHBoxLayout"> | ||
| 27 | <item> | ||
| 28 | <widget class="QLabel"> | ||
| 29 | <property name="text"> | ||
| 30 | <string>Accuracy:</string> | ||
| 31 | </property> | ||
| 32 | </widget> | ||
| 33 | </item> | ||
| 34 | <item> | ||
| 35 | <widget class="QComboBox" name="accuracy"> | ||
| 36 | <item> | ||
| 37 | <property name="text"> | ||
| 38 | <string>Accurate</string> | ||
| 39 | </property> | ||
| 40 | </item> | ||
| 41 | <item> | ||
| 42 | <property name="text"> | ||
| 43 | <string>Debugging Mode (Debugging ONLY)</string> | ||
| 44 | </property> | ||
| 45 | </item> | ||
| 46 | </widget> | ||
| 47 | </item> | ||
| 48 | </layout> | ||
| 49 | </item> | ||
| 50 | <item> | ||
| 51 | <widget class="QLabel"> | ||
| 52 | <property name="wordWrap"> | ||
| 53 | <bool>1</bool> | ||
| 54 | </property> | ||
| 55 | <property name="text"> | ||
| 56 | <string>We recommend setting accuracy to "Accurate".</string> | ||
| 57 | </property> | ||
| 58 | </widget> | ||
| 59 | </item> | ||
| 60 | </layout> | ||
| 61 | </widget> | ||
| 62 | </item> | ||
| 63 | </layout> | ||
| 64 | </item> | ||
| 65 | <item> | ||
| 66 | <layout class="QVBoxLayout"> | ||
| 67 | <item> | ||
| 68 | <widget class="QGroupBox" name="group_safe"> | ||
| 69 | <property name="title"> | ||
| 22 | <string>Safe CPU Optimizations</string> | 70 | <string>Safe CPU Optimizations</string> |
| 23 | </property> | 71 | </property> |
| 24 | <layout class="QVBoxLayout"> | 72 | <layout class="QVBoxLayout"> |