configuration: Add cpu_core configuration option
This commit is contained in:
		| @@ -82,7 +82,8 @@ void Config::ReadValues() { | ||||
|         sdl2_config->Get("Controls", "touch_device", "engine:emu_window"); | ||||
|  | ||||
|     // Core | ||||
|     Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true); | ||||
|     Settings::values.cpu_core = | ||||
|         static_cast<Settings::CpuCore>(sdl2_config->GetInteger("Core", "cpu_core", 1)); | ||||
|  | ||||
|     // Renderer | ||||
|     Settings::values.use_hw_renderer = sdl2_config->GetBoolean("Renderer", "use_hw_renderer", true); | ||||
|   | ||||
| @@ -67,9 +67,9 @@ motion_device= | ||||
| touch_device= | ||||
|  | ||||
| [Core] | ||||
| # Whether to use the Just-In-Time (JIT) compiler for CPU emulation | ||||
| # 0: Interpreter (slow), 1 (default): JIT (fast) | ||||
| use_cpu_jit = | ||||
| # Which CPU core to use for CPU emulation | ||||
| # 0: Unicorn (slow), 1 (default): Dynarmic (faster) | ||||
| cpu_core = | ||||
|  | ||||
| [Renderer] | ||||
| # Whether to use software or hardware rendering. | ||||
|   | ||||
| @@ -67,7 +67,8 @@ void Config::ReadValues() { | ||||
|     qt_config->endGroup(); | ||||
|  | ||||
|     qt_config->beginGroup("Core"); | ||||
|     Settings::values.use_cpu_jit = qt_config->value("use_cpu_jit", true).toBool(); | ||||
|     Settings::values.cpu_core = | ||||
|         static_cast<Settings::CpuCore>(qt_config->value("cpu_core", 1).toInt()); | ||||
|     qt_config->endGroup(); | ||||
|  | ||||
|     qt_config->beginGroup("Renderer"); | ||||
| @@ -207,7 +208,7 @@ void Config::SaveValues() { | ||||
|     qt_config->endGroup(); | ||||
|  | ||||
|     qt_config->beginGroup("Core"); | ||||
|     qt_config->setValue("use_cpu_jit", Settings::values.use_cpu_jit); | ||||
|     qt_config->setValue("cpu_core", static_cast<int>(Settings::values.cpu_core)); | ||||
|     qt_config->endGroup(); | ||||
|  | ||||
|     qt_config->beginGroup("Renderer"); | ||||
|   | ||||
| @@ -19,7 +19,7 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent) | ||||
|  | ||||
|     this->setConfiguration(); | ||||
|  | ||||
|     ui->toggle_cpu_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||||
|     ui->cpu_core_combobox->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||||
| } | ||||
|  | ||||
| ConfigureGeneral::~ConfigureGeneral() {} | ||||
| @@ -27,12 +27,12 @@ ConfigureGeneral::~ConfigureGeneral() {} | ||||
| void ConfigureGeneral::setConfiguration() { | ||||
|     ui->toggle_deepscan->setChecked(UISettings::values.gamedir_deepscan); | ||||
|     ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing); | ||||
|     ui->toggle_cpu_jit->setChecked(Settings::values.use_cpu_jit); | ||||
|  | ||||
|     // The first item is "auto-select" with actual value -1, so plus one here will do the trick | ||||
|     ui->region_combobox->setCurrentIndex(Settings::values.region_value + 1); | ||||
|  | ||||
|     ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme)); | ||||
|     ui->cpu_core_combobox->setCurrentIndex(static_cast<int>(Settings::values.cpu_core)); | ||||
| } | ||||
|  | ||||
| void ConfigureGeneral::applyConfiguration() { | ||||
| @@ -41,6 +41,7 @@ void ConfigureGeneral::applyConfiguration() { | ||||
|     UISettings::values.theme = | ||||
|         ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString(); | ||||
|     Settings::values.region_value = ui->region_combobox->currentIndex() - 1; | ||||
|     Settings::values.use_cpu_jit = ui->toggle_cpu_jit->isChecked(); | ||||
|     Settings::values.cpu_core = | ||||
|         static_cast<Settings::CpuCore>(ui->cpu_core_combobox->currentIndex()); | ||||
|     Settings::Apply(); | ||||
| } | ||||
|   | ||||
| @@ -46,16 +46,23 @@ | ||||
|      <item> | ||||
|        <widget class="QGroupBox" name="groupBox_2"> | ||||
|          <property name="title"> | ||||
|            <string>Performance</string> | ||||
|            <string>CPU Core</string> | ||||
|          </property> | ||||
|          <layout class="QHBoxLayout" name="horizontalLayout_7"> | ||||
|            <item> | ||||
|              <layout class="QVBoxLayout" name="verticalLayout_5"> | ||||
|                <item> | ||||
|                  <widget class="QCheckBox" name="toggle_cpu_jit"> | ||||
|                  <widget class="QComboBox" name="cpu_core_combobox"> | ||||
|                   <item> | ||||
|                    <property name="text"> | ||||
|                      <string>Enable CPU JIT</string> | ||||
|                     <string>Unicorn</string> | ||||
|                    </property> | ||||
|                   </item> | ||||
|                   <item> | ||||
|                    <property name="text"> | ||||
|                     <string>Dynarmic</string> | ||||
|                    </property> | ||||
|                   </item> | ||||
|                  </widget> | ||||
|                </item> | ||||
|              </layout> | ||||
|   | ||||
| @@ -140,8 +140,16 @@ void System::Reschedule() { | ||||
| System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { | ||||
|     LOG_DEBUG(HW_Memory, "initialized OK"); | ||||
|  | ||||
|     // TODO: Configuration option | ||||
|     cpu_core = std::make_unique<ARM_Dynarmic>(); | ||||
|     switch (Settings::values.cpu_core) { | ||||
|     case Settings::CpuCore::Unicorn: | ||||
|         cpu_core = std::make_unique<ARM_Unicorn>(); | ||||
|         break; | ||||
|     case Settings::CpuCore::Dynarmic: | ||||
|     default: | ||||
|         cpu_core = std::make_unique<ARM_Dynarmic>(); | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     telemetry_session = std::make_unique<Core::TelemetrySession>(); | ||||
|  | ||||
|     CoreTiming::Init(); | ||||
|   | ||||
| @@ -72,6 +72,11 @@ static const std::array<const char*, NumAnalogs> mapping = {{ | ||||
| }}; | ||||
| } // namespace NativeAnalog | ||||
|  | ||||
| enum class CpuCore { | ||||
|     Unicorn, | ||||
|     Dynarmic, | ||||
| }; | ||||
|  | ||||
| struct Values { | ||||
|     // CheckNew3DS | ||||
|     bool is_new_3ds; | ||||
| @@ -83,7 +88,7 @@ struct Values { | ||||
|     std::string touch_device; | ||||
|  | ||||
|     // Core | ||||
|     bool use_cpu_jit; | ||||
|     CpuCore cpu_core; | ||||
|  | ||||
|     // Data Storage | ||||
|     bool use_virtual_sd; | ||||
|   | ||||
| @@ -156,7 +156,8 @@ TelemetrySession::TelemetrySession() { | ||||
|     // Log user configuration information | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching", | ||||
|              Settings::values.enable_audio_stretching); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Core_UseCpuJit", Settings::values.use_cpu_jit); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Core_CpuCore", | ||||
|              static_cast<int>(Settings::values.cpu_core)); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_ResolutionFactor", | ||||
|              Settings::values.resolution_factor); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_ToggleFramelimit", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user