mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Merge pull request #4541 from MerryMage/yolo
dynarmic: Add unsafe optimizations
This commit is contained in:
		
						commit
						66ac7cf730
					
				
							
								
								
									
										2
									
								
								externals/dynarmic
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
								
							
						
						
									
										2
									
								
								externals/dynarmic
									
									
									
									
										vendored
									
									
								
							@ -1 +1 @@
 | 
			
		||||
Subproject commit 82417da7803e2cf18efc28a1cd3f3d0a4b6045ae
 | 
			
		||||
Subproject commit 0e1112b7df77ae55a62a51622940d5c8f9e8c84c
 | 
			
		||||
@ -143,7 +143,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
 | 
			
		||||
    config.wall_clock_cntpct = uses_wall_clock;
 | 
			
		||||
 | 
			
		||||
    // Safe optimizations
 | 
			
		||||
    if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) {
 | 
			
		||||
    if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::DebugMode) {
 | 
			
		||||
        if (!Settings::values.cpuopt_page_tables) {
 | 
			
		||||
            config.page_table = nullptr;
 | 
			
		||||
        }
 | 
			
		||||
@ -170,6 +170,17 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unsafe optimizations
 | 
			
		||||
    if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::Unsafe) {
 | 
			
		||||
        config.unsafe_optimizations = true;
 | 
			
		||||
        if (Settings::values.cpuopt_unsafe_unfuse_fma) {
 | 
			
		||||
            config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
 | 
			
		||||
        }
 | 
			
		||||
        if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
 | 
			
		||||
            config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return std::make_unique<Dynarmic::A32::Jit>(config);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -195,7 +195,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
 | 
			
		||||
    config.wall_clock_cntpct = uses_wall_clock;
 | 
			
		||||
 | 
			
		||||
    // Safe optimizations
 | 
			
		||||
    if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) {
 | 
			
		||||
    if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::DebugMode) {
 | 
			
		||||
        if (!Settings::values.cpuopt_page_tables) {
 | 
			
		||||
            config.page_table = nullptr;
 | 
			
		||||
        }
 | 
			
		||||
@ -222,6 +222,17 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unsafe optimizations
 | 
			
		||||
    if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::Unsafe) {
 | 
			
		||||
        config.unsafe_optimizations = true;
 | 
			
		||||
        if (Settings::values.cpuopt_unsafe_unfuse_fma) {
 | 
			
		||||
            config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
 | 
			
		||||
        }
 | 
			
		||||
        if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
 | 
			
		||||
            config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return std::make_shared<Dynarmic::A64::Jit>(config);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -359,7 +359,8 @@ enum class GPUAccuracy : u32 {
 | 
			
		||||
 | 
			
		||||
enum class CPUAccuracy {
 | 
			
		||||
    Accurate = 0,
 | 
			
		||||
    DebugMode = 1,
 | 
			
		||||
    Unsafe = 1,
 | 
			
		||||
    DebugMode = 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern bool configuring_global;
 | 
			
		||||
@ -419,6 +420,9 @@ struct Values {
 | 
			
		||||
    bool cpuopt_misc_ir;
 | 
			
		||||
    bool cpuopt_reduce_misalign_checks;
 | 
			
		||||
 | 
			
		||||
    bool cpuopt_unsafe_unfuse_fma;
 | 
			
		||||
    bool cpuopt_unsafe_reduce_fp_error;
 | 
			
		||||
 | 
			
		||||
    // Renderer
 | 
			
		||||
    Setting<RendererBackend> renderer_backend;
 | 
			
		||||
    bool renderer_debug;
 | 
			
		||||
 | 
			
		||||
@ -635,6 +635,11 @@ void Config::ReadCpuValues() {
 | 
			
		||||
            ReadSetting(QStringLiteral("cpuopt_misc_ir"), true).toBool();
 | 
			
		||||
        Settings::values.cpuopt_reduce_misalign_checks =
 | 
			
		||||
            ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool();
 | 
			
		||||
 | 
			
		||||
        Settings::values.cpuopt_unsafe_unfuse_fma =
 | 
			
		||||
            ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool();
 | 
			
		||||
        Settings::values.cpuopt_unsafe_reduce_fp_error =
 | 
			
		||||
            ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    qt_config->endGroup();
 | 
			
		||||
@ -1132,6 +1137,11 @@ void Config::SaveCpuValues() {
 | 
			
		||||
        WriteSetting(QStringLiteral("cpuopt_misc_ir"), Settings::values.cpuopt_misc_ir, true);
 | 
			
		||||
        WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"),
 | 
			
		||||
                     Settings::values.cpuopt_reduce_misalign_checks, true);
 | 
			
		||||
 | 
			
		||||
        WriteSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"),
 | 
			
		||||
                     Settings::values.cpuopt_unsafe_unfuse_fma, true);
 | 
			
		||||
        WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"),
 | 
			
		||||
                     Settings::values.cpuopt_unsafe_reduce_fp_error, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    qt_config->endGroup();
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,8 @@ ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::Config
 | 
			
		||||
 | 
			
		||||
    connect(ui->accuracy, qOverload<int>(&QComboBox::activated), this,
 | 
			
		||||
            &ConfigureCpu::AccuracyUpdated);
 | 
			
		||||
    connect(ui->accuracy, qOverload<int>(&QComboBox::currentIndexChanged), this,
 | 
			
		||||
            &ConfigureCpu::UpdateGroup);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ConfigureCpu::~ConfigureCpu() = default;
 | 
			
		||||
@ -28,6 +30,12 @@ void ConfigureCpu::SetConfiguration() {
 | 
			
		||||
 | 
			
		||||
    ui->accuracy->setEnabled(runtime_lock);
 | 
			
		||||
    ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy));
 | 
			
		||||
    UpdateGroup(static_cast<int>(Settings::values.cpu_accuracy));
 | 
			
		||||
 | 
			
		||||
    ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock);
 | 
			
		||||
    ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma);
 | 
			
		||||
    ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock);
 | 
			
		||||
    ui->cpuopt_unsafe_reduce_fp_error->setChecked(Settings::values.cpuopt_unsafe_reduce_fp_error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureCpu::AccuracyUpdated(int index) {
 | 
			
		||||
@ -38,14 +46,21 @@ void ConfigureCpu::AccuracyUpdated(int index) {
 | 
			
		||||
                                                 QMessageBox::Yes | QMessageBox::No);
 | 
			
		||||
        if (result == QMessageBox::No) {
 | 
			
		||||
            ui->accuracy->setCurrentIndex(static_cast<int>(Settings::CPUAccuracy::Accurate));
 | 
			
		||||
            return;
 | 
			
		||||
            UpdateGroup(static_cast<int>(Settings::CPUAccuracy::Accurate));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureCpu::UpdateGroup(int index) {
 | 
			
		||||
    ui->unsafe_group->setVisible(static_cast<Settings::CPUAccuracy>(index) ==
 | 
			
		||||
                                 Settings::CPUAccuracy::Unsafe);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureCpu::ApplyConfiguration() {
 | 
			
		||||
    Settings::values.cpu_accuracy =
 | 
			
		||||
        static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex());
 | 
			
		||||
    Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked();
 | 
			
		||||
    Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureCpu::changeEvent(QEvent* event) {
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@ private:
 | 
			
		||||
    void RetranslateUI();
 | 
			
		||||
 | 
			
		||||
    void AccuracyUpdated(int index);
 | 
			
		||||
    void UpdateGroup(int index);
 | 
			
		||||
 | 
			
		||||
    void SetConfiguration();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,11 @@
 | 
			
		||||
              <string>Accurate</string>
 | 
			
		||||
             </property>
 | 
			
		||||
            </item>
 | 
			
		||||
            <item>
 | 
			
		||||
             <property name="text">
 | 
			
		||||
              <string>Unsafe</string>
 | 
			
		||||
             </property>
 | 
			
		||||
            </item>
 | 
			
		||||
            <item>
 | 
			
		||||
             <property name="text">
 | 
			
		||||
              <string>Enable Debug Mode</string>
 | 
			
		||||
@ -62,6 +67,53 @@
 | 
			
		||||
     </item>
 | 
			
		||||
    </layout>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <layout class="QVBoxLayout">
 | 
			
		||||
     <item>
 | 
			
		||||
      <widget class="QGroupBox" name="unsafe_group">
 | 
			
		||||
       <property name="title">
 | 
			
		||||
        <string>Unsafe CPU Optimization Settings</string>
 | 
			
		||||
       </property>
 | 
			
		||||
       <layout class="QVBoxLayout">
 | 
			
		||||
        <item>
 | 
			
		||||
         <widget class="QLabel">
 | 
			
		||||
          <property name="wordWrap">
 | 
			
		||||
            <bool>1</bool>
 | 
			
		||||
          </property>
 | 
			
		||||
          <property name="text">
 | 
			
		||||
           <string>These settings reduce accuracy for speed.</string>
 | 
			
		||||
          </property>
 | 
			
		||||
         </widget>
 | 
			
		||||
        </item>
 | 
			
		||||
        <item>
 | 
			
		||||
         <widget class="QCheckBox" name="cpuopt_unsafe_unfuse_fma">
 | 
			
		||||
          <property name="text">
 | 
			
		||||
           <string>Unfuse FMA (improve performance on CPUs without FMA)</string>
 | 
			
		||||
          </property>
 | 
			
		||||
          <property name="toolTip">
 | 
			
		||||
           <string>
 | 
			
		||||
            <div>This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support.</div>
 | 
			
		||||
           </string>
 | 
			
		||||
          </property>
 | 
			
		||||
         </widget>
 | 
			
		||||
        </item>
 | 
			
		||||
        <item>
 | 
			
		||||
         <widget class="QCheckBox" name="cpuopt_unsafe_reduce_fp_error">
 | 
			
		||||
          <property name="text">
 | 
			
		||||
           <string>Faster FRSQRTE and FRECPE</string>
 | 
			
		||||
          </property>
 | 
			
		||||
          <property name="toolTip">
 | 
			
		||||
           <string>
 | 
			
		||||
            <div>This option improves the speed of some approximate floating-point functions by using less accurate native approximations.</div>
 | 
			
		||||
           </string>
 | 
			
		||||
          </property>
 | 
			
		||||
         </widget>
 | 
			
		||||
        </item>
 | 
			
		||||
       </layout>
 | 
			
		||||
      </widget>
 | 
			
		||||
     </item>
 | 
			
		||||
    </layout>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <spacer name="verticalSpacer">
 | 
			
		||||
     <property name="orientation">
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user