summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar MerryMage2021-01-02 17:36:02 +0000
committerGravatar MerryMage2021-01-02 20:13:21 +0000
commit57c9da1b397b7d19b604f318502a881db87f0ba4 (patch)
tree0e00979bbab0dd7939d0184e4e95c4ba1e8e5fa7
parentMerge pull request #5209 from Morph1984/refactor-controller-connect (diff)
downloadyuzu-57c9da1b397b7d19b604f318502a881db87f0ba4.tar.gz
yuzu-57c9da1b397b7d19b604f318502a881db87f0ba4.tar.xz
yuzu-57c9da1b397b7d19b604f318502a881db87f0ba4.zip
dynarmic: Add Unsafe_InaccurateNaN optimization
m---------externals/dynarmic0
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp3
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp3
-rw-r--r--src/core/settings.h1
-rw-r--r--src/yuzu/configuration/config.cpp4
-rw-r--r--src/yuzu/configuration/configure_cpu.cpp3
-rw-r--r--src/yuzu/configuration/configure_cpu.ui12
7 files changed, 26 insertions, 0 deletions
diff --git a/externals/dynarmic b/externals/dynarmic
Subproject 4a9a0d07f7376b439430e686721e8176c7b56ce Subproject 6023bcd8ad8c95bb08edf48cb889bfe99ff86be
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 8aaf11eee..0831dd5d2 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -181,6 +181,9 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
181 if (Settings::values.cpuopt_unsafe_reduce_fp_error) { 181 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
182 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; 182 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
183 } 183 }
184 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
185 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
186 }
184 } 187 }
185 188
186 return std::make_unique<Dynarmic::A32::Jit>(config); 189 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 d2e1dc724..4c5ebca22 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -212,6 +212,9 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
212 if (Settings::values.cpuopt_unsafe_reduce_fp_error) { 212 if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
213 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; 213 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
214 } 214 }
215 if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
216 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
217 }
215 } 218 }
216 219
217 return std::make_shared<Dynarmic::A64::Jit>(config); 220 return std::make_shared<Dynarmic::A64::Jit>(config);
diff --git a/src/core/settings.h b/src/core/settings.h
index 0cd3c0c84..66edc4e48 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -131,6 +131,7 @@ struct Values {
131 131
132 bool cpuopt_unsafe_unfuse_fma; 132 bool cpuopt_unsafe_unfuse_fma;
133 bool cpuopt_unsafe_reduce_fp_error; 133 bool cpuopt_unsafe_reduce_fp_error;
134 bool cpuopt_unsafe_inaccurate_nan;
134 135
135 // Renderer 136 // Renderer
136 Setting<RendererBackend> renderer_backend; 137 Setting<RendererBackend> renderer_backend;
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 34c2a5f8b..43cd11ba0 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -764,6 +764,8 @@ void Config::ReadCpuValues() {
764 ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool(); 764 ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool();
765 Settings::values.cpuopt_unsafe_reduce_fp_error = 765 Settings::values.cpuopt_unsafe_reduce_fp_error =
766 ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool(); 766 ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool();
767 Settings::values.cpuopt_unsafe_inaccurate_nan =
768 ReadSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), true).toBool();
767 } 769 }
768 770
769 qt_config->endGroup(); 771 qt_config->endGroup();
@@ -1327,6 +1329,8 @@ void Config::SaveCpuValues() {
1327 Settings::values.cpuopt_unsafe_unfuse_fma, true); 1329 Settings::values.cpuopt_unsafe_unfuse_fma, true);
1328 WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), 1330 WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"),
1329 Settings::values.cpuopt_unsafe_reduce_fp_error, true); 1331 Settings::values.cpuopt_unsafe_reduce_fp_error, true);
1332 WriteSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"),
1333 Settings::values.cpuopt_unsafe_inaccurate_nan, true);
1330 } 1334 }
1331 1335
1332 qt_config->endGroup(); 1336 qt_config->endGroup();
diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp
index 37fcd6adc..d055cbd60 100644
--- a/src/yuzu/configuration/configure_cpu.cpp
+++ b/src/yuzu/configuration/configure_cpu.cpp
@@ -36,6 +36,8 @@ void ConfigureCpu::SetConfiguration() {
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);
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(Settings::values.cpuopt_unsafe_reduce_fp_error);
39 ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock);
40 ui->cpuopt_unsafe_inaccurate_nan->setChecked(Settings::values.cpuopt_unsafe_inaccurate_nan);
39} 41}
40 42
41void ConfigureCpu::AccuracyUpdated(int index) { 43void ConfigureCpu::AccuracyUpdated(int index) {
@@ -61,6 +63,7 @@ void ConfigureCpu::ApplyConfiguration() {
61 static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()); 63 static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex());
62 Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked(); 64 Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked();
63 Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked(); 65 Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked();
66 Settings::values.cpuopt_unsafe_inaccurate_nan = ui->cpuopt_unsafe_inaccurate_nan->isChecked();
64} 67}
65 68
66void ConfigureCpu::changeEvent(QEvent* event) { 69void ConfigureCpu::changeEvent(QEvent* event) {
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui
index ebdd2e6e9..bcd0962e9 100644
--- a/src/yuzu/configuration/configure_cpu.ui
+++ b/src/yuzu/configuration/configure_cpu.ui
@@ -109,6 +109,18 @@
109 </property> 109 </property>
110 </widget> 110 </widget>
111 </item> 111 </item>
112 <item>
113 <widget class="QCheckBox" name="cpuopt_unsafe_inaccurate_nan">
114 <property name="text">
115 <string>Inaccurate NaN handling</string>
116 </property>
117 <property name="toolTip">
118 <string>
119 &lt;div&gt;This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.&lt;/div&gt;
120 </string>
121 </property>
122 </widget>
123 </item>
112 </layout> 124 </layout>
113 </widget> 125 </widget>
114 </item> 126 </item>