From b628192bf27c871af3ecbf8982b4a13a78fd70c4 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Fri, 12 Jan 2018 16:06:30 +0000 Subject: [PATCH] configuration: Add cpu_core configuration option --- src/citra/config.cpp | 3 ++- src/citra/default_ini.h | 6 +++--- src/citra_qt/configuration/config.cpp | 5 +++-- src/citra_qt/configuration/configure_general.cpp | 7 ++++--- src/citra_qt/configuration/configure_general.ui | 13 ++++++++++--- src/core/core.cpp | 12 ++++++++++-- src/core/settings.h | 7 ++++++- src/core/telemetry_session.cpp | 3 ++- 8 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/citra/config.cpp b/src/citra/config.cpp index 432bf2ced..e44931abd 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp @@ -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(sdl2_config->GetInteger("Core", "cpu_core", 1)); // Renderer Settings::values.use_hw_renderer = sdl2_config->GetBoolean("Renderer", "use_hw_renderer", true); diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h index 783c4a835..b4914d29f 100644 --- a/src/citra/default_ini.h +++ b/src/citra/default_ini.h @@ -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. diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index c268e0068..68d565c39 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -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(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(Settings::values.cpu_core)); qt_config->endGroup(); qt_config->beginGroup("Renderer"); diff --git a/src/citra_qt/configuration/configure_general.cpp b/src/citra_qt/configuration/configure_general.cpp index 939379717..0de27aa8b 100644 --- a/src/citra_qt/configuration/configure_general.cpp +++ b/src/citra_qt/configuration/configure_general.cpp @@ -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(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(ui->cpu_core_combobox->currentIndex()); Settings::Apply(); } diff --git a/src/citra_qt/configuration/configure_general.ui b/src/citra_qt/configuration/configure_general.ui index eedf2cbb0..e88c37936 100644 --- a/src/citra_qt/configuration/configure_general.ui +++ b/src/citra_qt/configuration/configure_general.ui @@ -46,16 +46,23 @@ - Performance + CPU Core - + + - Enable CPU JIT + Unicorn + + + + Dynarmic + + diff --git a/src/core/core.cpp b/src/core/core.cpp index 0240f946b..e5f299f26 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -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(); + switch (Settings::values.cpu_core) { + case Settings::CpuCore::Unicorn: + cpu_core = std::make_unique(); + break; + case Settings::CpuCore::Dynarmic: + default: + cpu_core = std::make_unique(); + break; + } + telemetry_session = std::make_unique(); CoreTiming::Init(); diff --git a/src/core/settings.h b/src/core/settings.h index 912b2c885..ebf072cff 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -72,6 +72,11 @@ static const std::array 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; diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp index ca517ff44..f9725b590 100644 --- a/src/core/telemetry_session.cpp +++ b/src/core/telemetry_session.cpp @@ -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(Settings::values.cpu_core)); AddField(Telemetry::FieldType::UserConfig, "Renderer_ResolutionFactor", Settings::values.resolution_factor); AddField(Telemetry::FieldType::UserConfig, "Renderer_ToggleFramelimit",