summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar MerryMage2020-07-11 14:26:36 +0100
committerGravatar MerryMage2020-07-11 14:34:09 +0100
commit0193202964449ba7a6ae46d614a63bf5caa589a7 (patch)
treef762a6569bf1a0e6240e76657fe387d006c3dc71 /src
parentMerge pull request #4203 from VolcaEM/services (diff)
downloadyuzu-0193202964449ba7a6ae46d614a63bf5caa589a7.tar.gz
yuzu-0193202964449ba7a6ae46d614a63bf5caa589a7.tar.xz
yuzu-0193202964449ba7a6ae46d614a63bf5caa589a7.zip
configuration: Add settings to enable/disable specific CPU optimizations
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp28
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp32
-rw-r--r--src/core/settings.h11
-rw-r--r--src/yuzu/CMakeLists.txt3
-rw-r--r--src/yuzu/configuration/config.cpp53
-rw-r--r--src/yuzu/configuration/config.h2
-rw-r--r--src/yuzu/configuration/configure.ui11
-rw-r--r--src/yuzu/configuration/configure_cpu.cpp64
-rw-r--r--src/yuzu/configuration/configure_cpu.h31
-rw-r--r--src/yuzu/configuration/configure_cpu.ui113
-rw-r--r--src/yuzu/configuration/configure_debug.cpp2
-rw-r--r--src/yuzu/configuration/configure_debug.ui7
-rw-r--r--src/yuzu/configuration/configure_dialog.cpp5
-rw-r--r--src/yuzu_cmd/config.cpp2
-rw-r--r--src/yuzu_cmd/default_ini.h36
-rw-r--r--src/yuzu_tester/default_ini.h33
16 files changed, 404 insertions, 29 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 0d4ab95b7..369a081cd 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -142,10 +142,30 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
142 // Timing 142 // Timing
143 config.wall_clock_cntpct = uses_wall_clock; 143 config.wall_clock_cntpct = uses_wall_clock;
144 144
145 // Optimizations 145 // Safe optimizations
146 if (Settings::values.disable_cpu_opt) { 146 if (!Settings::values.cpuopt_page_tables) {
147 config.enable_optimizations = false; 147 config.page_table = nullptr;
148 config.enable_fast_dispatch = false; 148 }
149 if (!Settings::values.cpuopt_block_linking) {
150 config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
151 }
152 if (!Settings::values.cpuopt_return_stack_buffer) {
153 config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
154 }
155 if (!Settings::values.cpuopt_fast_dispatcher) {
156 config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
157 }
158 if (!Settings::values.cpuopt_context_elimination) {
159 config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
160 }
161 if (!Settings::values.cpuopt_const_prop) {
162 config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
163 }
164 if (!Settings::values.cpuopt_misc_ir) {
165 config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
166 }
167 if (!Settings::values.cpuopt_reduce_misalign_checks) {
168 config.only_detect_misalignment_via_page_table_on_page_boundary = false;
149 } 169 }
150 170
151 return std::make_unique<Dynarmic::A32::Jit>(config); 171 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 790981034..e208a4aa7 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -191,15 +191,35 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
191 // Unpredictable instructions 191 // Unpredictable instructions
192 config.define_unpredictable_behaviour = true; 192 config.define_unpredictable_behaviour = true;
193 193
194 // Optimizations
195 if (Settings::values.disable_cpu_opt) {
196 config.enable_optimizations = false;
197 config.enable_fast_dispatch = false;
198 }
199
200 // Timing 194 // Timing
201 config.wall_clock_cntpct = uses_wall_clock; 195 config.wall_clock_cntpct = uses_wall_clock;
202 196
197 // Safe optimizations
198 if (!Settings::values.cpuopt_page_tables) {
199 config.page_table = nullptr;
200 }
201 if (!Settings::values.cpuopt_block_linking) {
202 config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
203 }
204 if (!Settings::values.cpuopt_return_stack_buffer) {
205 config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
206 }
207 if (!Settings::values.cpuopt_fast_dispatcher) {
208 config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
209 }
210 if (!Settings::values.cpuopt_context_elimination) {
211 config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
212 }
213 if (!Settings::values.cpuopt_const_prop) {
214 config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
215 }
216 if (!Settings::values.cpuopt_misc_ir) {
217 config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
218 }
219 if (!Settings::values.cpuopt_reduce_misalign_checks) {
220 config.only_detect_misalignment_via_page_table_on_page_boundary = false;
221 }
222
203 return std::make_shared<Dynarmic::A64::Jit>(config); 223 return std::make_shared<Dynarmic::A64::Jit>(config);
204} 224}
205 225
diff --git a/src/core/settings.h b/src/core/settings.h
index 850ca4072..c081c083f 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -427,6 +427,16 @@ struct Values {
427 // Core 427 // Core
428 Setting<bool> use_multi_core; 428 Setting<bool> use_multi_core;
429 429
430 // Cpu
431 bool cpuopt_page_tables;
432 bool cpuopt_block_linking;
433 bool cpuopt_return_stack_buffer;
434 bool cpuopt_fast_dispatcher;
435 bool cpuopt_context_elimination;
436 bool cpuopt_const_prop;
437 bool cpuopt_misc_ir;
438 bool cpuopt_reduce_misalign_checks;
439
430 // Renderer 440 // Renderer
431 Setting<RendererBackend> renderer_backend; 441 Setting<RendererBackend> renderer_backend;
432 bool renderer_debug; 442 bool renderer_debug;
@@ -505,7 +515,6 @@ struct Values {
505 bool dump_nso; 515 bool dump_nso;
506 bool reporting_services; 516 bool reporting_services;
507 bool quest_flag; 517 bool quest_flag;
508 bool disable_cpu_opt;
509 bool disable_macro_jit; 518 bool disable_macro_jit;
510 519
511 // Misceallaneous 520 // Misceallaneous
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index 6b25a7fa0..39efa962b 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -30,6 +30,9 @@ add_executable(yuzu
30 configuration/configure_audio.cpp 30 configuration/configure_audio.cpp
31 configuration/configure_audio.h 31 configuration/configure_audio.h
32 configuration/configure_audio.ui 32 configuration/configure_audio.ui
33 configuration/configure_cpu.cpp
34 configuration/configure_cpu.h
35 configuration/configure_cpu.ui
33 configuration/configure_debug.cpp 36 configuration/configure_debug.cpp
34 configuration/configure_debug.h 37 configuration/configure_debug.h
35 configuration/configure_debug.ui 38 configuration/configure_debug.ui
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 1b2b1b2bb..f28e345a5 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -540,8 +540,6 @@ void Config::ReadDebuggingValues() {
540 Settings::values.reporting_services = 540 Settings::values.reporting_services =
541 ReadSetting(QStringLiteral("reporting_services"), false).toBool(); 541 ReadSetting(QStringLiteral("reporting_services"), false).toBool();
542 Settings::values.quest_flag = ReadSetting(QStringLiteral("quest_flag"), false).toBool(); 542 Settings::values.quest_flag = ReadSetting(QStringLiteral("quest_flag"), false).toBool();
543 Settings::values.disable_cpu_opt =
544 ReadSetting(QStringLiteral("disable_cpu_opt"), false).toBool();
545 Settings::values.disable_macro_jit = 543 Settings::values.disable_macro_jit =
546 ReadSetting(QStringLiteral("disable_macro_jit"), false).toBool(); 544 ReadSetting(QStringLiteral("disable_macro_jit"), false).toBool();
547 545
@@ -633,6 +631,31 @@ void Config::ReadPathValues() {
633 qt_config->endGroup(); 631 qt_config->endGroup();
634} 632}
635 633
634void Config::ReadCpuValues() {
635 qt_config->beginGroup(QStringLiteral("Cpu"));
636
637 if (global) {
638 Settings::values.cpuopt_page_tables =
639 ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool();
640 Settings::values.cpuopt_block_linking =
641 ReadSetting(QStringLiteral("cpuopt_block_linking"), true).toBool();
642 Settings::values.cpuopt_return_stack_buffer =
643 ReadSetting(QStringLiteral("cpuopt_return_stack_buffer"), true).toBool();
644 Settings::values.cpuopt_fast_dispatcher =
645 ReadSetting(QStringLiteral("cpuopt_fast_dispatcher"), true).toBool();
646 Settings::values.cpuopt_context_elimination =
647 ReadSetting(QStringLiteral("cpuopt_context_elimination"), true).toBool();
648 Settings::values.cpuopt_const_prop =
649 ReadSetting(QStringLiteral("cpuopt_const_prop"), true).toBool();
650 Settings::values.cpuopt_misc_ir =
651 ReadSetting(QStringLiteral("cpuopt_misc_ir"), true).toBool();
652 Settings::values.cpuopt_reduce_misalign_checks =
653 ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool();
654 }
655
656 qt_config->endGroup();
657}
658
636void Config::ReadRendererValues() { 659void Config::ReadRendererValues() {
637 qt_config->beginGroup(QStringLiteral("Renderer")); 660 qt_config->beginGroup(QStringLiteral("Renderer"));
638 661
@@ -829,6 +852,7 @@ void Config::ReadValues() {
829 ReadMiscellaneousValues(); 852 ReadMiscellaneousValues();
830 } 853 }
831 ReadCoreValues(); 854 ReadCoreValues();
855 ReadCpuValues();
832 ReadRendererValues(); 856 ReadRendererValues();
833 ReadAudioValues(); 857 ReadAudioValues();
834 ReadSystemValues(); 858 ReadSystemValues();
@@ -929,6 +953,7 @@ void Config::SaveValues() {
929 SaveMiscellaneousValues(); 953 SaveMiscellaneousValues();
930 } 954 }
931 SaveCoreValues(); 955 SaveCoreValues();
956 SaveCpuValues();
932 SaveRendererValues(); 957 SaveRendererValues();
933 SaveAudioValues(); 958 SaveAudioValues();
934 SaveSystemValues(); 959 SaveSystemValues();
@@ -1033,7 +1058,6 @@ void Config::SaveDebuggingValues() {
1033 WriteSetting(QStringLiteral("dump_exefs"), Settings::values.dump_exefs, false); 1058 WriteSetting(QStringLiteral("dump_exefs"), Settings::values.dump_exefs, false);
1034 WriteSetting(QStringLiteral("dump_nso"), Settings::values.dump_nso, false); 1059 WriteSetting(QStringLiteral("dump_nso"), Settings::values.dump_nso, false);
1035 WriteSetting(QStringLiteral("quest_flag"), Settings::values.quest_flag, false); 1060 WriteSetting(QStringLiteral("quest_flag"), Settings::values.quest_flag, false);
1036 WriteSetting(QStringLiteral("disable_cpu_opt"), Settings::values.disable_cpu_opt, false);
1037 WriteSetting(QStringLiteral("disable_macro_jit"), Settings::values.disable_macro_jit, false); 1061 WriteSetting(QStringLiteral("disable_macro_jit"), Settings::values.disable_macro_jit, false);
1038 1062
1039 qt_config->endGroup(); 1063 qt_config->endGroup();
@@ -1097,6 +1121,29 @@ void Config::SavePathValues() {
1097 qt_config->endGroup(); 1121 qt_config->endGroup();
1098} 1122}
1099 1123
1124void Config::SaveCpuValues() {
1125 qt_config->beginGroup(QStringLiteral("Cpu"));
1126
1127 if (global) {
1128 WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables,
1129 true);
1130 WriteSetting(QStringLiteral("cpuopt_block_linking"), Settings::values.cpuopt_block_linking,
1131 true);
1132 WriteSetting(QStringLiteral("cpuopt_return_stack_buffer"),
1133 Settings::values.cpuopt_return_stack_buffer, true);
1134 WriteSetting(QStringLiteral("cpuopt_fast_dispatcher"),
1135 Settings::values.cpuopt_fast_dispatcher, true);
1136 WriteSetting(QStringLiteral("cpuopt_context_elimination"),
1137 Settings::values.cpuopt_context_elimination, true);
1138 WriteSetting(QStringLiteral("cpuopt_const_prop"), Settings::values.cpuopt_const_prop, true);
1139 WriteSetting(QStringLiteral("cpuopt_misc_ir"), Settings::values.cpuopt_misc_ir, true);
1140 WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"),
1141 Settings::values.cpuopt_reduce_misalign_checks, true);
1142 }
1143
1144 qt_config->endGroup();
1145}
1146
1100void Config::SaveRendererValues() { 1147void Config::SaveRendererValues() {
1101 qt_config->beginGroup(QStringLiteral("Renderer")); 1148 qt_config->beginGroup(QStringLiteral("Renderer"));
1102 1149
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index 681f0bca5..8e815f829 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -49,6 +49,7 @@ private:
49 void ReadDisabledAddOnValues(); 49 void ReadDisabledAddOnValues();
50 void ReadMiscellaneousValues(); 50 void ReadMiscellaneousValues();
51 void ReadPathValues(); 51 void ReadPathValues();
52 void ReadCpuValues();
52 void ReadRendererValues(); 53 void ReadRendererValues();
53 void ReadShortcutValues(); 54 void ReadShortcutValues();
54 void ReadSystemValues(); 55 void ReadSystemValues();
@@ -73,6 +74,7 @@ private:
73 void SaveDisabledAddOnValues(); 74 void SaveDisabledAddOnValues();
74 void SaveMiscellaneousValues(); 75 void SaveMiscellaneousValues();
75 void SavePathValues(); 76 void SavePathValues();
77 void SaveCpuValues();
76 void SaveRendererValues(); 78 void SaveRendererValues();
77 void SaveShortcutValues(); 79 void SaveShortcutValues();
78 void SaveSystemValues(); 80 void SaveSystemValues();
diff --git a/src/yuzu/configuration/configure.ui b/src/yuzu/configuration/configure.ui
index 9aec1bd09..a23fd9435 100644
--- a/src/yuzu/configuration/configure.ui
+++ b/src/yuzu/configuration/configure.ui
@@ -78,6 +78,11 @@
78 <string>Hotkeys</string> 78 <string>Hotkeys</string>
79 </attribute> 79 </attribute>
80 </widget> 80 </widget>
81 <widget class="ConfigureCpu" name="cpuTab">
82 <attribute name="title">
83 <string>CPU</string>
84 </attribute>
85 </widget>
81 <widget class="ConfigureGraphics" name="graphicsTab"> 86 <widget class="ConfigureGraphics" name="graphicsTab">
82 <attribute name="title"> 87 <attribute name="title">
83 <string>Graphics</string> 88 <string>Graphics</string>
@@ -159,6 +164,12 @@
159 <container>1</container> 164 <container>1</container>
160 </customwidget> 165 </customwidget>
161 <customwidget> 166 <customwidget>
167 <class>ConfigureCpu</class>
168 <extends>QWidget</extends>
169 <header>configuration/configure_cpu.h</header>
170 <container>1</container>
171 </customwidget>
172 <customwidget>
162 <class>ConfigureGraphics</class> 173 <class>ConfigureGraphics</class>
163 <extends>QWidget</extends> 174 <extends>QWidget</extends>
164 <header>configuration/configure_graphics.h</header> 175 <header>configuration/configure_graphics.h</header>
diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp
new file mode 100644
index 000000000..28e010b6b
--- /dev/null
+++ b/src/yuzu/configuration/configure_cpu.cpp
@@ -0,0 +1,64 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <QComboBox>
6
7#include "common/common_types.h"
8#include "common/logging/log.h"
9#include "core/core.h"
10#include "core/settings.h"
11#include "ui_configure_cpu.h"
12#include "yuzu/configuration/configure_cpu.h"
13
14ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureCpu) {
15 ui->setupUi(this);
16
17 SetConfiguration();
18}
19
20ConfigureCpu::~ConfigureCpu() = default;
21
22void ConfigureCpu::SetConfiguration() {
23 const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();
24
25 ui->cpuopt_page_tables->setEnabled(runtime_lock);
26 ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables);
27 ui->cpuopt_block_linking->setEnabled(runtime_lock);
28 ui->cpuopt_block_linking->setChecked(Settings::values.cpuopt_block_linking);
29 ui->cpuopt_return_stack_buffer->setEnabled(runtime_lock);
30 ui->cpuopt_return_stack_buffer->setChecked(Settings::values.cpuopt_return_stack_buffer);
31 ui->cpuopt_fast_dispatcher->setEnabled(runtime_lock);
32 ui->cpuopt_fast_dispatcher->setChecked(Settings::values.cpuopt_fast_dispatcher);
33 ui->cpuopt_context_elimination->setEnabled(runtime_lock);
34 ui->cpuopt_context_elimination->setChecked(Settings::values.cpuopt_context_elimination);
35 ui->cpuopt_const_prop->setEnabled(runtime_lock);
36 ui->cpuopt_const_prop->setChecked(Settings::values.cpuopt_const_prop);
37 ui->cpuopt_misc_ir->setEnabled(runtime_lock);
38 ui->cpuopt_misc_ir->setChecked(Settings::values.cpuopt_misc_ir);
39 ui->cpuopt_reduce_misalign_checks->setEnabled(runtime_lock);
40 ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks);
41}
42
43void ConfigureCpu::ApplyConfiguration() {
44 Settings::values.cpuopt_page_tables = ui->cpuopt_page_tables->isChecked();
45 Settings::values.cpuopt_block_linking = ui->cpuopt_block_linking->isChecked();
46 Settings::values.cpuopt_return_stack_buffer = ui->cpuopt_return_stack_buffer->isChecked();
47 Settings::values.cpuopt_fast_dispatcher = ui->cpuopt_fast_dispatcher->isChecked();
48 Settings::values.cpuopt_context_elimination = ui->cpuopt_context_elimination->isChecked();
49 Settings::values.cpuopt_const_prop = ui->cpuopt_const_prop->isChecked();
50 Settings::values.cpuopt_misc_ir = ui->cpuopt_misc_ir->isChecked();
51 Settings::values.cpuopt_reduce_misalign_checks = ui->cpuopt_reduce_misalign_checks->isChecked();
52}
53
54void ConfigureCpu::changeEvent(QEvent* event) {
55 if (event->type() == QEvent::LanguageChange) {
56 RetranslateUI();
57 }
58
59 QWidget::changeEvent(event);
60}
61
62void ConfigureCpu::RetranslateUI() {
63 ui->retranslateUi(this);
64}
diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h
new file mode 100644
index 000000000..a4c6e5f20
--- /dev/null
+++ b/src/yuzu/configuration/configure_cpu.h
@@ -0,0 +1,31 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <memory>
8#include <QWidget>
9#include "core/settings.h"
10
11namespace Ui {
12class ConfigureCpu;
13}
14
15class ConfigureCpu : public QWidget {
16 Q_OBJECT
17
18public:
19 explicit ConfigureCpu(QWidget* parent = nullptr);
20 ~ConfigureCpu() override;
21
22 void ApplyConfiguration();
23
24private:
25 void changeEvent(QEvent* event) override;
26 void RetranslateUI();
27
28 void SetConfiguration();
29
30 std::unique_ptr<Ui::ConfigureCpu> ui;
31};
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui
new file mode 100644
index 000000000..d04cfb2d5
--- /dev/null
+++ b/src/yuzu/configuration/configure_cpu.ui
@@ -0,0 +1,113 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>ConfigureCpu</class>
4 <widget class="QWidget" name="ConfigureCpu">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>400</width>
10 <height>321</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Form</string>
15 </property>
16 <layout class="QVBoxLayout">
17 <item>
18 <layout class="QVBoxLayout">
19 <item>
20 <widget class="QGroupBox">
21 <property name="title">
22 <string>Safe CPU Optimizations</string>
23 </property>
24 <layout class="QVBoxLayout">
25 <item>
26 <widget class="QLabel">
27 <property name="wordWrap">
28 <bool>1</bool>
29 </property>
30 <property name="text">
31 <string>Keep these enabled. For debugging only.</string>
32 </property>
33 </widget>
34 </item>
35 <item>
36 <widget class="QCheckBox" name="cpuopt_page_tables">
37 <property name="text">
38 <string>Enable inline page tables</string>
39 </property>
40 </widget>
41 </item>
42 <item>
43 <widget class="QCheckBox" name="cpuopt_block_linking">
44 <property name="text">
45 <string>Enable block linking</string>
46 </property>
47 </widget>
48 </item>
49 <item>
50 <widget class="QCheckBox" name="cpuopt_return_stack_buffer">
51 <property name="text">
52 <string>Enable return stack buffer</string>
53 </property>
54 </widget>
55 </item>
56 <item>
57 <widget class="QCheckBox" name="cpuopt_fast_dispatcher">
58 <property name="text">
59 <string>Enable fast dispatcher</string>
60 </property>
61 </widget>
62 </item>
63 <item>
64 <widget class="QCheckBox" name="cpuopt_context_elimination">
65 <property name="text">
66 <string>Enable context elimination</string>
67 </property>
68 </widget>
69 </item>
70 <item>
71 <widget class="QCheckBox" name="cpuopt_const_prop">
72 <property name="text">
73 <string>Enable constant propagation</string>
74 </property>
75 </widget>
76 </item>
77 <item>
78 <widget class="QCheckBox" name="cpuopt_misc_ir">
79 <property name="text">
80 <string>Enable miscellaneous optimizations</string>
81 </property>
82 </widget>
83 </item>
84 <item>
85 <widget class="QCheckBox" name="cpuopt_reduce_misalign_checks">
86 <property name="text">
87 <string>Enable misalignment check reduction</string>
88 </property>
89 </widget>
90 </item>
91 </layout>
92 </widget>
93 </item>
94 </layout>
95 </item>
96 <item>
97 <spacer name="verticalSpacer">
98 <property name="orientation">
99 <enum>Qt::Vertical</enum>
100 </property>
101 <property name="sizeHint" stdset="0">
102 <size>
103 <width>20</width>
104 <height>40</height>
105 </size>
106 </property>
107 </spacer>
108 </item>
109 </layout>
110 </widget>
111 <resources/>
112 <connections/>
113</ui>
diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp
index 2c77441fd..d0e71dd60 100644
--- a/src/yuzu/configuration/configure_debug.cpp
+++ b/src/yuzu/configuration/configure_debug.cpp
@@ -36,7 +36,6 @@ void ConfigureDebug::SetConfiguration() {
36 ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args)); 36 ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args));
37 ui->reporting_services->setChecked(Settings::values.reporting_services); 37 ui->reporting_services->setChecked(Settings::values.reporting_services);
38 ui->quest_flag->setChecked(Settings::values.quest_flag); 38 ui->quest_flag->setChecked(Settings::values.quest_flag);
39 ui->disable_cpu_opt->setChecked(Settings::values.disable_cpu_opt);
40 ui->enable_graphics_debugging->setEnabled(!Core::System::GetInstance().IsPoweredOn()); 39 ui->enable_graphics_debugging->setEnabled(!Core::System::GetInstance().IsPoweredOn());
41 ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug); 40 ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug);
42 ui->disable_macro_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn()); 41 ui->disable_macro_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn());
@@ -51,7 +50,6 @@ void ConfigureDebug::ApplyConfiguration() {
51 Settings::values.program_args = ui->homebrew_args_edit->text().toStdString(); 50 Settings::values.program_args = ui->homebrew_args_edit->text().toStdString();
52 Settings::values.reporting_services = ui->reporting_services->isChecked(); 51 Settings::values.reporting_services = ui->reporting_services->isChecked();
53 Settings::values.quest_flag = ui->quest_flag->isChecked(); 52 Settings::values.quest_flag = ui->quest_flag->isChecked();
54 Settings::values.disable_cpu_opt = ui->disable_cpu_opt->isChecked();
55 Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked(); 53 Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();
56 Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked(); 54 Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked();
57 Debugger::ToggleConsole(); 55 Debugger::ToggleConsole();
diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui
index 46f0208c6..272bdd6b8 100644
--- a/src/yuzu/configuration/configure_debug.ui
+++ b/src/yuzu/configuration/configure_debug.ui
@@ -228,13 +228,6 @@
228 </property> 228 </property>
229 </widget> 229 </widget>
230 </item> 230 </item>
231 <item>
232 <widget class="QCheckBox" name="disable_cpu_opt">
233 <property name="text">
234 <string>Disable CPU JIT optimizations</string>
235 </property>
236 </widget>
237 </item>
238 </layout> 231 </layout>
239 </widget> 232 </widget>
240 </item> 233 </item>
diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp
index 5918e9972..a0f49c282 100644
--- a/src/yuzu/configuration/configure_dialog.cpp
+++ b/src/yuzu/configuration/configure_dialog.cpp
@@ -42,6 +42,7 @@ void ConfigureDialog::ApplyConfiguration() {
42 ui->filesystemTab->applyConfiguration(); 42 ui->filesystemTab->applyConfiguration();
43 ui->inputTab->ApplyConfiguration(); 43 ui->inputTab->ApplyConfiguration();
44 ui->hotkeysTab->ApplyConfiguration(registry); 44 ui->hotkeysTab->ApplyConfiguration(registry);
45 ui->cpuTab->ApplyConfiguration();
45 ui->graphicsTab->ApplyConfiguration(); 46 ui->graphicsTab->ApplyConfiguration();
46 ui->graphicsAdvancedTab->ApplyConfiguration(); 47 ui->graphicsAdvancedTab->ApplyConfiguration();
47 ui->audioTab->ApplyConfiguration(); 48 ui->audioTab->ApplyConfiguration();
@@ -76,9 +77,10 @@ void ConfigureDialog::RetranslateUI() {
76Q_DECLARE_METATYPE(QList<QWidget*>); 77Q_DECLARE_METATYPE(QList<QWidget*>);
77 78
78void ConfigureDialog::PopulateSelectionList() { 79void ConfigureDialog::PopulateSelectionList() {
79 const std::array<std::pair<QString, QList<QWidget*>>, 5> items{ 80 const std::array<std::pair<QString, QList<QWidget*>>, 6> items{
80 {{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}}, 81 {{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}},
81 {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->serviceTab, ui->filesystemTab}}, 82 {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->serviceTab, ui->filesystemTab}},
83 {tr("CPU"), {ui->cpuTab}},
82 {tr("Graphics"), {ui->graphicsTab, ui->graphicsAdvancedTab}}, 84 {tr("Graphics"), {ui->graphicsTab, ui->graphicsAdvancedTab}},
83 {tr("Audio"), {ui->audioTab}}, 85 {tr("Audio"), {ui->audioTab}},
84 {tr("Controls"), {ui->inputTab, ui->hotkeysTab}}}, 86 {tr("Controls"), {ui->inputTab, ui->hotkeysTab}}},
@@ -107,6 +109,7 @@ void ConfigureDialog::UpdateVisibleTabs() {
107 {ui->profileManagerTab, tr("Profiles")}, 109 {ui->profileManagerTab, tr("Profiles")},
108 {ui->inputTab, tr("Input")}, 110 {ui->inputTab, tr("Input")},
109 {ui->hotkeysTab, tr("Hotkeys")}, 111 {ui->hotkeysTab, tr("Hotkeys")},
112 {ui->cpuTab, tr("CPU")},
110 {ui->graphicsTab, tr("Graphics")}, 113 {ui->graphicsTab, tr("Graphics")},
111 {ui->graphicsAdvancedTab, tr("Advanced")}, 114 {ui->graphicsAdvancedTab, tr("Advanced")},
112 {ui->audioTab, tr("Audio")}, 115 {ui->audioTab, tr("Audio")},
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index 23763144f..441d8e8f7 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -437,8 +437,6 @@ void Config::ReadValues() {
437 Settings::values.reporting_services = 437 Settings::values.reporting_services =
438 sdl2_config->GetBoolean("Debugging", "reporting_services", false); 438 sdl2_config->GetBoolean("Debugging", "reporting_services", false);
439 Settings::values.quest_flag = sdl2_config->GetBoolean("Debugging", "quest_flag", false); 439 Settings::values.quest_flag = sdl2_config->GetBoolean("Debugging", "quest_flag", false);
440 Settings::values.disable_cpu_opt =
441 sdl2_config->GetBoolean("Debugging", "disable_cpu_opt", false);
442 Settings::values.disable_macro_jit = 440 Settings::values.disable_macro_jit =
443 sdl2_config->GetBoolean("Debugging", "disable_macro_jit", false); 441 sdl2_config->GetBoolean("Debugging", "disable_macro_jit", false);
444 442
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h
index 45c07ed5d..5bed47fd7 100644
--- a/src/yuzu_cmd/default_ini.h
+++ b/src/yuzu_cmd/default_ini.h
@@ -97,6 +97,39 @@ udp_pad_index=
97# 0 (default): Disabled, 1: Enabled 97# 0 (default): Disabled, 1: Enabled
98use_multi_core= 98use_multi_core=
99 99
100[Cpu]
101# Enable inline page tables optimization (faster guest memory access)
102# 0: Disabled, 1 (default): Enabled
103cpuopt_page_tables =
104
105# Enable block linking CPU optimization (reduce block dispatcher use during predictable jumps)
106# 0: Disabled, 1 (default): Enabled
107cpuopt_block_linking =
108
109# Enable return stack buffer CPU optimization (reduce block dispatcher use during predictable returns)
110# 0: Disabled, 1 (default): Enabled
111cpuopt_return_stack_buffer =
112
113# Enable fast dispatcher CPU optimization (use a two-tiered dispatcher architecture)
114# 0: Disabled, 1 (default): Enabled
115cpuopt_fast_dispatcher =
116
117# Enable context elimination CPU Optimization (reduce host memory use for guest context)
118# 0: Disabled, 1 (default): Enabled
119cpuopt_context_elimination =
120
121# Enable constant propagation CPU optimization (basic IR optimization)
122# 0: Disabled, 1 (default): Enabled
123cpuopt_const_prop =
124
125# Enable miscellaneous CPU optimizations (basic IR optimization)
126# 0: Disabled, 1 (default): Enabled
127cpuopt_misc_ir =
128
129# Enable reduction of memory misalignment checks (reduce memory fallbacks for misaligned access)
130# 0: Disabled, 1 (default): Enabled
131cpuopt_reduce_misalign_checks =
132
100[Renderer] 133[Renderer]
101# Which backend API to use. 134# Which backend API to use.
102# 0 (default): OpenGL, 1: Vulkan 135# 0 (default): OpenGL, 1: Vulkan
@@ -283,9 +316,6 @@ dump_nso=false
283# Determines whether or not yuzu will report to the game that the emulated console is in Kiosk Mode 316# Determines whether or not yuzu will report to the game that the emulated console is in Kiosk Mode
284# false: Retail/Normal Mode (default), true: Kiosk Mode 317# false: Retail/Normal Mode (default), true: Kiosk Mode
285quest_flag = 318quest_flag =
286# Determines whether or not JIT CPU optimizations are enabled
287# false: Optimizations Enabled, true: Optimizations Disabled
288disable_cpu_opt =
289# Enables/Disables the macro JIT compiler 319# Enables/Disables the macro JIT compiler
290disable_macro_jit=false 320disable_macro_jit=false
291 321
diff --git a/src/yuzu_tester/default_ini.h b/src/yuzu_tester/default_ini.h
index 41bbbbf60..3eb64e9d7 100644
--- a/src/yuzu_tester/default_ini.h
+++ b/src/yuzu_tester/default_ini.h
@@ -12,6 +12,39 @@ const char* sdl2_config_file = R"(
12# 0 (default): Disabled, 1: Enabled 12# 0 (default): Disabled, 1: Enabled
13use_multi_core= 13use_multi_core=
14 14
15[Cpu]
16# Enable inline page tables optimization (faster guest memory access)
17# 0: Disabled, 1 (default): Enabled
18cpuopt_page_tables =
19
20# Enable block linking CPU optimization (reduce block dispatcher use during predictable jumps)
21# 0: Disabled, 1 (default): Enabled
22cpuopt_block_linking =
23
24# Enable return stack buffer CPU optimization (reduce block dispatcher use during predictable returns)
25# 0: Disabled, 1 (default): Enabled
26cpuopt_return_stack_buffer =
27
28# Enable fast dispatcher CPU optimization (use a two-tiered dispatcher architecture)
29# 0: Disabled, 1 (default): Enabled
30cpuopt_fast_dispatcher =
31
32# Enable context elimination CPU Optimization (reduce host memory use for guest context)
33# 0: Disabled, 1 (default): Enabled
34cpuopt_context_elimination =
35
36# Enable constant propagation CPU optimization (basic IR optimization)
37# 0: Disabled, 1 (default): Enabled
38cpuopt_const_prop =
39
40# Enable miscellaneous CPU optimizations (basic IR optimization)
41# 0: Disabled, 1 (default): Enabled
42cpuopt_misc_ir =
43
44# Enable reduction of memory misalignment checks (reduce memory fallbacks for misaligned access)
45# 0: Disabled, 1 (default): Enabled
46cpuopt_reduce_misalign_checks =
47
15[Renderer] 48[Renderer]
16# Whether to use software or hardware rendering. 49# Whether to use software or hardware rendering.
17# 0: Software, 1 (default): Hardware 50# 0: Software, 1 (default): Hardware