summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar lat9nq2021-05-15 20:46:48 -0400
committerGravatar lat9nq2021-05-15 20:46:48 -0400
commite169fdad4f89675f5b56a3ca5004d593792426a0 (patch)
treee52425c637fd16bacb4ee72fa18922c10b0fc5b9 /src
parentMerge pull request #6300 from Morph1984/mbedtls (diff)
downloadyuzu-e169fdad4f89675f5b56a3ca5004d593792426a0.tar.gz
yuzu-e169fdad4f89675f5b56a3ca5004d593792426a0.tar.xz
yuzu-e169fdad4f89675f5b56a3ca5004d593792426a0.zip
general: Make CPU accuracy and related a Settings::Setting
Required to make CPU accuracy and unsafe settings available to use as a per-game setting.
Diffstat (limited to '')
-rw-r--r--src/common/settings.cpp2
-rw-r--r--src/common/settings.h8
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp10
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp10
-rw-r--r--src/yuzu/configuration/config.cpp33
-rw-r--r--src/yuzu/configuration/config.h1
-rw-r--r--src/yuzu/configuration/configure_cpu.cpp24
7 files changed, 47 insertions, 41 deletions
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index 702b6598d..b9a549c81 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -42,7 +42,7 @@ void LogSettings() {
42 log_setting("System_RegionIndex", values.region_index.GetValue()); 42 log_setting("System_RegionIndex", values.region_index.GetValue());
43 log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue()); 43 log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue());
44 log_setting("Core_UseMultiCore", values.use_multi_core.GetValue()); 44 log_setting("Core_UseMultiCore", values.use_multi_core.GetValue());
45 log_setting("CPU_Accuracy", values.cpu_accuracy); 45 log_setting("CPU_Accuracy", values.cpu_accuracy.GetValue());
46 log_setting("Renderer_UseResolutionFactor", values.resolution_factor.GetValue()); 46 log_setting("Renderer_UseResolutionFactor", values.resolution_factor.GetValue());
47 log_setting("Renderer_UseFrameLimit", values.use_frame_limit.GetValue()); 47 log_setting("Renderer_UseFrameLimit", values.use_frame_limit.GetValue());
48 log_setting("Renderer_FrameLimit", values.frame_limit.GetValue()); 48 log_setting("Renderer_FrameLimit", values.frame_limit.GetValue());
diff --git a/src/common/settings.h b/src/common/settings.h
index d39b4aa45..68dc2ea7d 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -115,7 +115,7 @@ struct Values {
115 Setting<bool> use_multi_core; 115 Setting<bool> use_multi_core;
116 116
117 // Cpu 117 // Cpu
118 CPUAccuracy cpu_accuracy; 118 Setting<CPUAccuracy> cpu_accuracy;
119 119
120 bool cpuopt_page_tables; 120 bool cpuopt_page_tables;
121 bool cpuopt_block_linking; 121 bool cpuopt_block_linking;
@@ -126,9 +126,9 @@ struct Values {
126 bool cpuopt_misc_ir; 126 bool cpuopt_misc_ir;
127 bool cpuopt_reduce_misalign_checks; 127 bool cpuopt_reduce_misalign_checks;
128 128
129 bool cpuopt_unsafe_unfuse_fma; 129 Setting<bool> cpuopt_unsafe_unfuse_fma;
130 bool cpuopt_unsafe_reduce_fp_error; 130 Setting<bool> cpuopt_unsafe_reduce_fp_error;
131 bool cpuopt_unsafe_inaccurate_nan; 131 Setting<bool> cpuopt_unsafe_inaccurate_nan;
132 132
133 // Renderer 133 // Renderer
134 Setting<RendererBackend> renderer_backend; 134 Setting<RendererBackend> renderer_backend;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 42a37e84f..3535a3d11 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -142,7 +142,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
142 config.far_code_offset = 256 * 1024 * 1024; 142 config.far_code_offset = 256 * 1024 * 1024;
143 143
144 // Safe optimizations 144 // Safe optimizations
145 if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::DebugMode) { 145 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) {
146 if (!Settings::values.cpuopt_page_tables) { 146 if (!Settings::values.cpuopt_page_tables) {
147 config.page_table = nullptr; 147 config.page_table = nullptr;
148 } 148 }
@@ -170,15 +170,15 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
170 } 170 }
171 171
172 // Unsafe optimizations 172 // Unsafe optimizations
173 if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::Unsafe) { 173 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
174 config.unsafe_optimizations = true; 174 config.unsafe_optimizations = true;
175 if (Settings::values.cpuopt_unsafe_unfuse_fma) { 175 if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) {
176 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 176 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
177 } 177 }
178 if (Settings::values.cpuopt_unsafe_reduce_fp_error) { 178 if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) {
179 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; 179 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
180 } 180 }
181 if (Settings::values.cpuopt_unsafe_inaccurate_nan) { 181 if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) {
182 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 182 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
183 } 183 }
184 } 184 }
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index 653bb7a77..7e1f654db 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -182,7 +182,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
182 config.far_code_offset = 256 * 1024 * 1024; 182 config.far_code_offset = 256 * 1024 * 1024;
183 183
184 // Safe optimizations 184 // Safe optimizations
185 if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::DebugMode) { 185 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) {
186 if (!Settings::values.cpuopt_page_tables) { 186 if (!Settings::values.cpuopt_page_tables) {
187 config.page_table = nullptr; 187 config.page_table = nullptr;
188 } 188 }
@@ -210,15 +210,15 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
210 } 210 }
211 211
212 // Unsafe optimizations 212 // Unsafe optimizations
213 if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::Unsafe) { 213 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
214 config.unsafe_optimizations = true; 214 config.unsafe_optimizations = true;
215 if (Settings::values.cpuopt_unsafe_unfuse_fma) { 215 if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) {
216 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; 216 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
217 } 217 }
218 if (Settings::values.cpuopt_unsafe_reduce_fp_error) { 218 if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) {
219 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; 219 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
220 } 220 }
221 if (Settings::values.cpuopt_unsafe_inaccurate_nan) { 221 if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) {
222 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 222 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
223 } 223 }
224 } 224 }
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index e80a3df77..24d46c7cc 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -737,8 +737,7 @@ void Config::ReadCpuValues() {
737 qt_config->beginGroup(QStringLiteral("Cpu")); 737 qt_config->beginGroup(QStringLiteral("Cpu"));
738 738
739 if (global) { 739 if (global) {
740 Settings::values.cpu_accuracy = static_cast<Settings::CPUAccuracy>( 740 ReadSettingGlobal(Settings::values.cpu_accuracy, QStringLiteral("cpu_accuracy"), 0);
741 ReadSetting(QStringLiteral("cpu_accuracy"), 0).toInt());
742 741
743 Settings::values.cpuopt_page_tables = 742 Settings::values.cpuopt_page_tables =
744 ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool(); 743 ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool();
@@ -757,12 +756,12 @@ void Config::ReadCpuValues() {
757 Settings::values.cpuopt_reduce_misalign_checks = 756 Settings::values.cpuopt_reduce_misalign_checks =
758 ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool(); 757 ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool();
759 758
760 Settings::values.cpuopt_unsafe_unfuse_fma = 759 ReadSettingGlobal(Settings::values.cpuopt_unsafe_unfuse_fma,
761 ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool(); 760 QStringLiteral("cpuopt_unsafe_unfuse_fma"), true);
762 Settings::values.cpuopt_unsafe_reduce_fp_error = 761 ReadSettingGlobal(Settings::values.cpuopt_unsafe_reduce_fp_error,
763 ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool(); 762 QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true);
764 Settings::values.cpuopt_unsafe_inaccurate_nan = 763 ReadSettingGlobal(Settings::values.cpuopt_unsafe_inaccurate_nan,
765 ReadSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), true).toBool(); 764 QStringLiteral("cpuopt_unsafe_inaccurate_nan"), true);
766 } 765 }
767 766
768 qt_config->endGroup(); 767 qt_config->endGroup();
@@ -1314,8 +1313,10 @@ void Config::SaveCpuValues() {
1314 qt_config->beginGroup(QStringLiteral("Cpu")); 1313 qt_config->beginGroup(QStringLiteral("Cpu"));
1315 1314
1316 if (global) { 1315 if (global) {
1317 WriteSetting(QStringLiteral("cpu_accuracy"), 1316 WriteSettingGlobal(QStringLiteral("cpu_accuracy"),
1318 static_cast<int>(Settings::values.cpu_accuracy), 0); 1317 static_cast<u32>(Settings::values.cpu_accuracy.GetValue(global)),
1318 Settings::values.renderer_backend.UsingGlobal(),
1319 static_cast<u32>(Settings::CPUAccuracy::Accurate));
1319 1320
1320 WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables, 1321 WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables,
1321 true); 1322 true);
@@ -1332,12 +1333,12 @@ void Config::SaveCpuValues() {
1332 WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), 1333 WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"),
1333 Settings::values.cpuopt_reduce_misalign_checks, true); 1334 Settings::values.cpuopt_reduce_misalign_checks, true);
1334 1335
1335 WriteSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), 1336 WriteSettingGlobal(QStringLiteral("cpuopt_unsafe_unfuse_fma"),
1336 Settings::values.cpuopt_unsafe_unfuse_fma, true); 1337 Settings::values.cpuopt_unsafe_unfuse_fma, true);
1337 WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), 1338 WriteSettingGlobal(QStringLiteral("cpuopt_unsafe_reduce_fp_error"),
1338 Settings::values.cpuopt_unsafe_reduce_fp_error, true); 1339 Settings::values.cpuopt_unsafe_reduce_fp_error, true);
1339 WriteSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), 1340 WriteSettingGlobal(QStringLiteral("cpuopt_unsafe_inaccurate_nan"),
1340 Settings::values.cpuopt_unsafe_inaccurate_nan, true); 1341 Settings::values.cpuopt_unsafe_inaccurate_nan, true);
1341 } 1342 }
1342 1343
1343 qt_config->endGroup(); 1344 qt_config->endGroup();
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index 5a2c026b3..ce3355588 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -132,5 +132,6 @@ private:
132}; 132};
133 133
134// These metatype declarations cannot be in common/settings.h because core is devoid of QT 134// These metatype declarations cannot be in common/settings.h because core is devoid of QT
135Q_DECLARE_METATYPE(Settings::CPUAccuracy);
135Q_DECLARE_METATYPE(Settings::RendererBackend); 136Q_DECLARE_METATYPE(Settings::RendererBackend);
136Q_DECLARE_METATYPE(Settings::GPUAccuracy); 137Q_DECLARE_METATYPE(Settings::GPUAccuracy);
diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp
index 4f99bc80f..a59ea3087 100644
--- a/src/yuzu/configuration/configure_cpu.cpp
+++ b/src/yuzu/configuration/configure_cpu.cpp
@@ -29,15 +29,17 @@ void ConfigureCpu::SetConfiguration() {
29 const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); 29 const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();
30 30
31 ui->accuracy->setEnabled(runtime_lock); 31 ui->accuracy->setEnabled(runtime_lock);
32 ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy)); 32 ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy.GetValue()));
33 UpdateGroup(static_cast<int>(Settings::values.cpu_accuracy)); 33 UpdateGroup(static_cast<int>(Settings::values.cpu_accuracy.GetValue()));
34 34
35 ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock); 35 ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock);
36 ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma); 36 ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma.GetValue());
37 ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock); 37 ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock);
38 ui->cpuopt_unsafe_reduce_fp_error->setChecked(Settings::values.cpuopt_unsafe_reduce_fp_error); 38 ui->cpuopt_unsafe_reduce_fp_error->setChecked(
39 Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue());
39 ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock); 40 ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock);
40 ui->cpuopt_unsafe_inaccurate_nan->setChecked(Settings::values.cpuopt_unsafe_inaccurate_nan); 41 ui->cpuopt_unsafe_inaccurate_nan->setChecked(
42 Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue());
41} 43}
42 44
43void ConfigureCpu::AccuracyUpdated(int index) { 45void ConfigureCpu::AccuracyUpdated(int index) {
@@ -59,11 +61,13 @@ void ConfigureCpu::UpdateGroup(int index) {
59} 61}
60 62
61void ConfigureCpu::ApplyConfiguration() { 63void ConfigureCpu::ApplyConfiguration() {
62 Settings::values.cpu_accuracy = 64 Settings::values.cpu_accuracy.SetValue(
63 static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()); 65 static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()));
64 Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked(); 66 Settings::values.cpuopt_unsafe_unfuse_fma.SetValue(ui->cpuopt_unsafe_unfuse_fma->isChecked());
65 Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked(); 67 Settings::values.cpuopt_unsafe_reduce_fp_error.SetValue(
66 Settings::values.cpuopt_unsafe_inaccurate_nan = ui->cpuopt_unsafe_inaccurate_nan->isChecked(); 68 ui->cpuopt_unsafe_reduce_fp_error->isChecked());
69 Settings::values.cpuopt_unsafe_inaccurate_nan.SetValue(
70 ui->cpuopt_unsafe_inaccurate_nan->isChecked());
67} 71}
68 72
69void ConfigureCpu::changeEvent(QEvent* event) { 73void ConfigureCpu::changeEvent(QEvent* event) {