summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/settings.h3
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp50
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp50
-rw-r--r--src/yuzu/configuration/configure_cpu.ui5
4 files changed, 63 insertions, 45 deletions
diff --git a/src/common/settings.h b/src/common/settings.h
index a37d83fb3..86e0fa140 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -38,6 +38,7 @@ enum class CPUAccuracy : u32 {
38 Auto = 0, 38 Auto = 0,
39 Accurate = 1, 39 Accurate = 1,
40 Unsafe = 2, 40 Unsafe = 2,
41 Paranoid = 3,
41}; 42};
42 43
43enum class FullscreenMode : u32 { 44enum class FullscreenMode : u32 {
@@ -470,7 +471,7 @@ struct Values {
470 471
471 // Cpu 472 // Cpu
472 RangedSetting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, CPUAccuracy::Auto, 473 RangedSetting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, CPUAccuracy::Auto,
473 CPUAccuracy::Unsafe, "cpu_accuracy"}; 474 CPUAccuracy::Paranoid, "cpu_accuracy"};
474 // TODO: remove cpu_accuracy_first_time, migration setting added 8 July 2021 475 // TODO: remove cpu_accuracy_first_time, migration setting added 8 July 2021
475 BasicSetting<bool> cpu_accuracy_first_time{true, "cpu_accuracy_first_time"}; 476 BasicSetting<bool> cpu_accuracy_first_time{true, "cpu_accuracy_first_time"};
476 BasicSetting<bool> cpu_debug_mode{false, "cpu_debug_mode"}; 477 BasicSetting<bool> cpu_debug_mode{false, "cpu_debug_mode"};
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 286976623..d4cbd0c20 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -186,35 +186,41 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
186 if (!Settings::values.cpuopt_recompile_exclusives) { 186 if (!Settings::values.cpuopt_recompile_exclusives) {
187 config.recompile_on_exclusive_fastmem_failure = false; 187 config.recompile_on_exclusive_fastmem_failure = false;
188 } 188 }
189 } 189 } else {
190 // Unsafe optimizations
191 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
192 config.unsafe_optimizations = true;
193 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
194 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
195 }
196 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
197 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
198 }
199 if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) {
200 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
201 }
202 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
203 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
204 }
205 if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
206 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
207 }
208 }
190 209
191 // Unsafe optimizations 210 // Curated optimizations
192 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { 211 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
193 config.unsafe_optimizations = true; 212 config.unsafe_optimizations = true;
194 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
195 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 213 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
196 }
197 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
198 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
199 }
200 if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) {
201 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; 214 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
202 }
203 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
204 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 215 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
205 }
206 if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
207 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; 216 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
208 } 217 }
209 }
210 218
211 // Curated optimizations 219 // Paranoia mode for debugging optimizations
212 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { 220 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) {
213 config.unsafe_optimizations = true; 221 config.unsafe_optimizations = false;
214 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 222 config.optimizations = Dynarmic::no_optimizations;
215 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; 223 }
216 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
217 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
218 } 224 }
219 225
220 return std::make_unique<Dynarmic::A32::Jit>(config); 226 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 24107f9f6..6d5a1ecfd 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -248,35 +248,41 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
248 if (!Settings::values.cpuopt_recompile_exclusives) { 248 if (!Settings::values.cpuopt_recompile_exclusives) {
249 config.recompile_on_exclusive_fastmem_failure = false; 249 config.recompile_on_exclusive_fastmem_failure = false;
250 } 250 }
251 } 251 } else {
252 // Unsafe optimizations
253 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
254 config.unsafe_optimizations = true;
255 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
256 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
257 }
258 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
259 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
260 }
261 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
262 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
263 }
264 if (Settings::values.cpuopt_unsafe_fastmem_check) {
265 config.fastmem_address_space_bits = 64;
266 }
267 if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
268 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
269 }
270 }
252 271
253 // Unsafe optimizations 272 // Curated optimizations
254 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { 273 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
255 config.unsafe_optimizations = true; 274 config.unsafe_optimizations = true;
256 if (Settings::values.cpuopt_unsafe_unfuse_fma) {
257 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 275 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
258 }
259 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
260 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
261 }
262 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
263 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 276 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
264 }
265 if (Settings::values.cpuopt_unsafe_fastmem_check) {
266 config.fastmem_address_space_bits = 64; 277 config.fastmem_address_space_bits = 64;
267 }
268 if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
269 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; 278 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
270 } 279 }
271 }
272 280
273 // Curated optimizations 281 // Paranoia mode for debugging optimizations
274 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { 282 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) {
275 config.unsafe_optimizations = true; 283 config.unsafe_optimizations = false;
276 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 284 config.optimizations = Dynarmic::no_optimizations;
277 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 285 }
278 config.fastmem_address_space_bits = 64;
279 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
280 } 286 }
281 287
282 return std::make_shared<Dynarmic::A64::Jit>(config); 288 return std::make_shared<Dynarmic::A64::Jit>(config);
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui
index 5d80a8c91..8ae569ee6 100644
--- a/src/yuzu/configuration/configure_cpu.ui
+++ b/src/yuzu/configuration/configure_cpu.ui
@@ -52,6 +52,11 @@
52 <string>Unsafe</string> 52 <string>Unsafe</string>
53 </property> 53 </property>
54 </item> 54 </item>
55 <item>
56 <property name="text">
57 <string>Paranoid (disables most optimizations)</string>
58 </property>
59 </item>
55 </widget> 60 </widget>
56 </item> 61 </item>
57 </layout> 62 </layout>