summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2021-12-25 22:14:53 +0100
committerAdmiral H. Curtiss <pikachu025@gmail.com>2021-12-25 23:40:26 +0100
commit7625cb7aca314b36008a4eb11b23151ccb93f2c1 (patch)
tree258cd5161280a84df77c459499694a509507ef45 /Source/Core
parent319b00f1fd6cc0385ffc4ac9d48411ed3fd1f42b (diff)
CoreTiming: Cache the overclock factor instead of re-querying it every Advance().
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/CoreTiming.cpp26
-rw-r--r--Source/Core/Core/CoreTiming.h2
2 files changed, 22 insertions, 6 deletions
diff --git a/Source/Core/Core/CoreTiming.cpp b/Source/Core/Core/CoreTiming.cpp
index 6a978a3c0f..f850c726d6 100644
--- a/Source/Core/Core/CoreTiming.cpp
+++ b/Source/Core/Core/CoreTiming.cpp
@@ -78,6 +78,10 @@ Globals g;
static EventType* s_ev_lost = nullptr;
+static size_t s_registered_config_callback_id;
+static float s_config_OC_factor;
+static float s_config_OC_inv_factor;
+
static void EmptyTimedCallback(u64 userdata, s64 cyclesLate)
{
}
@@ -122,9 +126,12 @@ void UnregisterAllEvents()
void Init()
{
- s_last_OC_factor =
- Config::Get(Config::MAIN_OVERCLOCK_ENABLE) ? Config::Get(Config::MAIN_OVERCLOCK) : 1.0f;
- g.last_OC_factor_inverted = 1.0f / s_last_OC_factor;
+ s_registered_config_callback_id =
+ Config::AddConfigChangedCallback([]() { Core::RunAsCPUThread([]() { RefreshConfig(); }); });
+ RefreshConfig();
+
+ s_last_OC_factor = s_config_OC_factor;
+ g.last_OC_factor_inverted = s_config_OC_inv_factor;
PowerPC::ppcState.downcount = CyclesToDowncount(MAX_SLICE_LENGTH);
g.slice_length = MAX_SLICE_LENGTH;
g.global_timer = 0;
@@ -146,6 +153,14 @@ void Shutdown()
MoveEvents();
ClearPendingEvents();
UnregisterAllEvents();
+ Config::RemoveConfigChangedCallback(s_registered_config_callback_id);
+}
+
+void RefreshConfig()
+{
+ s_config_OC_factor =
+ Config::Get(Config::MAIN_OVERCLOCK_ENABLE) ? Config::Get(Config::MAIN_OVERCLOCK) : 1.0f;
+ s_config_OC_inv_factor = 1.0f / s_config_OC_factor;
}
void DoState(PointerWrap& p)
@@ -318,9 +333,8 @@ void Advance()
int cyclesExecuted = g.slice_length - DowncountToCycles(PowerPC::ppcState.downcount);
g.global_timer += cyclesExecuted;
- s_last_OC_factor =
- Config::Get(Config::MAIN_OVERCLOCK_ENABLE) ? Config::Get(Config::MAIN_OVERCLOCK) : 1.0f;
- g.last_OC_factor_inverted = 1.0f / s_last_OC_factor;
+ s_last_OC_factor = s_config_OC_factor;
+ g.last_OC_factor_inverted = s_config_OC_inv_factor;
g.slice_length = MAX_SLICE_LENGTH;
s_is_global_timer_sane = true;
diff --git a/Source/Core/Core/CoreTiming.h b/Source/Core/Core/CoreTiming.h
index f66fba5614..255aa612ca 100644
--- a/Source/Core/Core/CoreTiming.h
+++ b/Source/Core/Core/CoreTiming.h
@@ -46,6 +46,8 @@ typedef void (*TimedCallback)(u64 userdata, s64 cyclesLate);
u64 GetTicks();
u64 GetIdleTicks();
+void RefreshConfig();
+
void DoState(PointerWrap& p);
struct EventType;