diff --git a/src/citra/config.cpp b/src/citra/config.cpp index 110b883fb..1a09f0e55 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp @@ -65,6 +65,7 @@ void Config::ReadValues() { Settings::values.pad_circle_modifier_scale = (float)sdl2_config->GetReal("Controls", "pad_circle_modifier_scale", 0.5); // Core + Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true); Settings::values.frame_skip = sdl2_config->GetInteger("Core", "frame_skip", 0); // Renderer diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h index 2031620a5..788174508 100644 --- a/src/citra/default_ini.h +++ b/src/citra/default_ini.h @@ -38,6 +38,10 @@ pad_circle_modifier = pad_circle_modifier_scale = [Core] +# Whether to use the Just-In-Time (JIT) compiler for CPU emulation +# 0: Interpreter (slow), 1 (default): JIT (fast) +use_cpu_jit = + # The applied frameskip amount. Must be a power of two. # 0 (default): No frameskip, 1: x2 frameskip, 2: x4 frameskip, 3: x8 frameskip, etc. frame_skip = diff --git a/src/citra_qt/config.cpp b/src/citra_qt/config.cpp index fa3fa210c..cf1c09930 100644 --- a/src/citra_qt/config.cpp +++ b/src/citra_qt/config.cpp @@ -41,6 +41,7 @@ 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.frame_skip = qt_config->value("frame_skip", 0).toInt(); qt_config->endGroup(); @@ -134,6 +135,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("frame_skip", Settings::values.frame_skip); qt_config->endGroup(); diff --git a/src/core/core.cpp b/src/core/core.cpp index cabab744a..a3834adae 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -6,16 +6,16 @@ #include "common/logging/log.h" +#include "core/arm/arm_interface.h" +#include "core/arm/dynarmic/arm_dynarmic.h" +#include "core/arm/dyncom/arm_dyncom.h" #include "core/core.h" #include "core/core_timing.h" - -#include "core/arm/arm_interface.h" -#include "core/arm/dyncom/arm_dyncom.h" +#include "core/gdbstub/gdbstub.h" #include "core/hle/hle.h" #include "core/hle/kernel/thread.h" #include "core/hw/hw.h" - -#include "core/gdbstub/gdbstub.h" +#include "core/settings.h" namespace Core { @@ -73,8 +73,13 @@ void Stop() { /// Initialize the core void Init() { - g_sys_core = std::make_unique(USER32MODE); - g_app_core = std::make_unique(USER32MODE); + if (Settings::values.use_cpu_jit) { + g_sys_core = std::make_unique(USER32MODE); + g_app_core = std::make_unique(USER32MODE); + } else { + g_sys_core = std::make_unique(USER32MODE); + g_app_core = std::make_unique(USER32MODE); + } LOG_DEBUG(Core, "Initialized OK"); } diff --git a/src/core/settings.h b/src/core/settings.h index fb3fbe391..fcd14c6f3 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -60,6 +60,7 @@ struct Values { float pad_circle_modifier_scale; // Core + bool use_cpu_jit; int frame_skip; // Data Storage