summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar lat9nq2021-06-30 22:22:21 -0400
committerGravatar lat9nq2021-07-08 14:56:09 -0400
commit7ab57671577f15faea7fa97433844667e06bcb7b (patch)
treed48f1ac303da141fb85004df69f86f5b1dd8b1b4 /src
parentMerge pull request #6539 from lat9nq/default-setting (diff)
downloadyuzu-7ab57671577f15faea7fa97433844667e06bcb7b.tar.gz
yuzu-7ab57671577f15faea7fa97433844667e06bcb7b.tar.xz
yuzu-7ab57671577f15faea7fa97433844667e06bcb7b.zip
core,common,yuzu qt: Add CPU accuracy option 'Auto'
The current CPU accuracy settings in yuzu are fairly polarized and require more than common knowledge to know what the optimal settings for yuzu would be. This adds a curated option called 'Auto' that applies a few at the moment known-good unsafe optimizations to Dynarmic.
Diffstat (limited to '')
-rw-r--r--src/common/settings.h9
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp22
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp22
-rw-r--r--src/yuzu/configuration/configure_cpu.ui13
4 files changed, 50 insertions, 16 deletions
diff --git a/src/common/settings.h b/src/common/settings.h
index bf83186f5..f9988c266 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -31,9 +31,10 @@ enum class GPUAccuracy : u32 {
31}; 31};
32 32
33enum class CPUAccuracy : u32 { 33enum class CPUAccuracy : u32 {
34 Accurate = 0, 34 Auto = 0,
35 Unsafe = 1, 35 Accurate = 1,
36 DebugMode = 2, 36 Unsafe = 2,
37 DebugMode = 3,
37}; 38};
38 39
39/** The BasicSetting class is a simple resource manager. It defines a label and default value 40/** The BasicSetting class is a simple resource manager. It defines a label and default value
@@ -284,7 +285,7 @@ struct Values {
284 Setting<bool> use_multi_core{true, "use_multi_core"}; 285 Setting<bool> use_multi_core{true, "use_multi_core"};
285 286
286 // Cpu 287 // Cpu
287 Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Accurate, "cpu_accuracy"}; 288 Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, "cpu_accuracy"};
288 289
289 BasicSetting<bool> cpuopt_page_tables{true, "cpuopt_page_tables"}; 290 BasicSetting<bool> cpuopt_page_tables{true, "cpuopt_page_tables"};
290 BasicSetting<bool> cpuopt_block_linking{true, "cpuopt_block_linking"}; 291 BasicSetting<bool> cpuopt_block_linking{true, "cpuopt_block_linking"};
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 77a44f862..23be0447a 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -183,16 +183,30 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
183 // Unsafe optimizations 183 // Unsafe optimizations
184 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { 184 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
185 config.unsafe_optimizations = true; 185 config.unsafe_optimizations = true;
186 if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { 186 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
187 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 187 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
188 } 188 }
189 if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { 189 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
190 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; 190 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
191 } 191 }
192 if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr.GetValue()) { 192 if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) {
193 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; 193 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
194 } 194 }
195 if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { 195 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
196 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
197 }
198 }
199
200 // Curated optimizations
201 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
202 config.unsafe_optimizations = true;
203 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
204 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
205 }
206 if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) {
207 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
208 }
209 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
196 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 210 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
197 } 211 }
198 } 212 }
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index 75332e348..6ff69db2f 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -223,16 +223,30 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
223 // Unsafe optimizations 223 // Unsafe optimizations
224 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { 224 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
225 config.unsafe_optimizations = true; 225 config.unsafe_optimizations = true;
226 if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { 226 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
227 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 227 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
228 } 228 }
229 if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { 229 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
230 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; 230 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
231 } 231 }
232 if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { 232 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
233 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 233 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
234 } 234 }
235 if (Settings::values.cpuopt_unsafe_fastmem_check.GetValue()) { 235 if (Settings::values.cpuopt_unsafe_fastmem_check) {
236 config.fastmem_address_space_bits = 64;
237 }
238 }
239
240 // Curated optimizations
241 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
242 config.unsafe_optimizations = true;
243 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
244 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
245 }
246 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
247 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
248 }
249 if (Settings::values.cpuopt_unsafe_fastmem_check) {
236 config.fastmem_address_space_bits = 64; 250 config.fastmem_address_space_bits = 64;
237 } 251 }
238 } 252 }
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui
index 0e296d4e5..49e30bdbb 100644
--- a/src/yuzu/configuration/configure_cpu.ui
+++ b/src/yuzu/configuration/configure_cpu.ui
@@ -6,8 +6,8 @@
6 <rect> 6 <rect>
7 <x>0</x> 7 <x>0</x>
8 <y>0</y> 8 <y>0</y>
9 <width>400</width> 9 <width>448</width>
10 <height>321</height> 10 <height>433</height>
11 </rect> 11 </rect>
12 </property> 12 </property>
13 <property name="windowTitle"> 13 <property name="windowTitle">
@@ -17,7 +17,7 @@
17 <item> 17 <item>
18 <layout class="QVBoxLayout"> 18 <layout class="QVBoxLayout">
19 <item> 19 <item>
20 <widget class="QGroupBox"> 20 <widget class="QGroupBox" name="groupBox">
21 <property name="title"> 21 <property name="title">
22 <string>General</string> 22 <string>General</string>
23 </property> 23 </property>
@@ -36,6 +36,11 @@
36 <widget class="QComboBox" name="accuracy"> 36 <widget class="QComboBox" name="accuracy">
37 <item> 37 <item>
38 <property name="text"> 38 <property name="text">
39 <string>Auto</string>
40 </property>
41 </item>
42 <item>
43 <property name="text">
39 <string>Accurate</string> 44 <string>Accurate</string>
40 </property> 45 </property>
41 </item> 46 </item>
@@ -57,7 +62,7 @@
57 <item> 62 <item>
58 <widget class="QLabel" name="label_recommended_accuracy"> 63 <widget class="QLabel" name="label_recommended_accuracy">
59 <property name="text"> 64 <property name="text">
60 <string>We recommend setting accuracy to &quot;Accurate&quot;.</string> 65 <string>We recommend setting accuracy to &quot;Auto&quot;.</string>
61 </property> 66 </property>
62 <property name="wordWrap"> 67 <property name="wordWrap">
63 <bool>false</bool> 68 <bool>false</bool>