summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar MerryMage2020-07-11 16:25:49 +0100
committerGravatar MerryMage2020-07-11 16:38:38 +0100
commit505aa3a4c1eb2384ab5a46aecf6431db239b74e3 (patch)
tree8576d3b825f7cd85122b857f5b10c6f9eae1b87e /src
parentconfiguration: Add settings to enable/disable specific CPU optimizations (diff)
downloadyuzu-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.cpp48
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp48
-rw-r--r--src/core/settings.h7
-rw-r--r--src/yuzu/configuration/config.cpp6
-rw-r--r--src/yuzu/configuration/configure_cpu.cpp22
-rw-r--r--src/yuzu/configuration/configure_cpu.h2
-rw-r--r--src/yuzu/configuration/configure_cpu.ui48
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
385enum class CPUAccuracy {
386 Accurate = 0,
387 DebugMode = 1,
388};
389
385extern bool configuring_global; 390extern bool configuring_global;
386 391
387template <typename Type> 392template <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
20ConfigureCpu::~ConfigureCpu() = default; 23ConfigureCpu::~ConfigureCpu() = default;
@@ -22,6 +25,10 @@ ConfigureCpu::~ConfigureCpu() = default;
22void ConfigureCpu::SetConfiguration() { 25void 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
50void 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
43void ConfigureCpu::ApplyConfiguration() { 62void 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">