System: Implement CPU overclocking [SAVEVERSION+]
Partial credit to @CookiePLMonster as well.
This commit is contained in:
@ -68,6 +68,8 @@ static void UpdateRunningGame(const char* path, CDImage* image);
|
||||
static State s_state = State::Shutdown;
|
||||
|
||||
static ConsoleRegion s_region = ConsoleRegion::NTSC_U;
|
||||
TickCount g_ticks_per_second = MASTER_CLOCK;
|
||||
static TickCount s_max_slice_ticks = MASTER_CLOCK / 10;
|
||||
static u32 s_frame_number = 1;
|
||||
static u32 s_internal_frame_number = 1;
|
||||
|
||||
@ -143,6 +145,22 @@ bool IsPALRegion()
|
||||
return s_region == ConsoleRegion::PAL;
|
||||
}
|
||||
|
||||
TickCount GetMaxSliceTicks()
|
||||
{
|
||||
return s_max_slice_ticks;
|
||||
}
|
||||
|
||||
void UpdateOverclock()
|
||||
{
|
||||
g_ticks_per_second = ScaleTicksToOverclock(MASTER_CLOCK);
|
||||
s_max_slice_ticks = ScaleTicksToOverclock(MASTER_CLOCK / 10);
|
||||
g_spu.CPUClockChanged();
|
||||
g_cdrom.CPUClockChanged();
|
||||
g_gpu->CPUClockChanged();
|
||||
g_timers.CPUClocksChanged();
|
||||
UpdateThrottlePeriod();
|
||||
}
|
||||
|
||||
u32 GetFrameNumber()
|
||||
{
|
||||
return s_frame_number;
|
||||
@ -682,6 +700,8 @@ bool Boot(const SystemBootParameters& params)
|
||||
|
||||
bool Initialize(bool force_software_renderer)
|
||||
{
|
||||
g_ticks_per_second = ScaleTicksToOverclock(MASTER_CLOCK);
|
||||
s_max_slice_ticks = ScaleTicksToOverclock(MASTER_CLOCK / 10);
|
||||
s_frame_number = 1;
|
||||
s_internal_frame_number = 1;
|
||||
|
||||
@ -725,6 +745,15 @@ bool Initialize(bool force_software_renderer)
|
||||
g_mdec.Initialize();
|
||||
g_sio.Initialize();
|
||||
|
||||
if (g_settings.cpu_overclock_active)
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
10.0f,
|
||||
g_host_interface->TranslateString("OSDMessage",
|
||||
"CPU clock speed is set to %u%% (%u / %u). This may result in instability."),
|
||||
g_settings.GetCPUOverclockPercent(), g_settings.cpu_overclock_numerator, g_settings.cpu_overclock_denominator);
|
||||
}
|
||||
|
||||
UpdateThrottlePeriod();
|
||||
return true;
|
||||
}
|
||||
@ -845,6 +874,31 @@ bool DoState(StateWrapper& sw)
|
||||
if (!sw.DoMarker("Events") || !TimingEvents::DoState(sw))
|
||||
return false;
|
||||
|
||||
if (!sw.DoMarker("Overclock"))
|
||||
return false;
|
||||
|
||||
bool cpu_overclock_active = g_settings.cpu_overclock_active;
|
||||
u32 cpu_overclock_numerator = g_settings.cpu_overclock_numerator;
|
||||
u32 cpu_overclock_denominator = g_settings.cpu_overclock_denominator;
|
||||
sw.Do(&cpu_overclock_active);
|
||||
sw.Do(&cpu_overclock_numerator);
|
||||
sw.Do(&cpu_overclock_denominator);
|
||||
|
||||
if (sw.IsReading() && (cpu_overclock_active != g_settings.cpu_overclock_active ||
|
||||
(cpu_overclock_active && (g_settings.cpu_overclock_numerator != cpu_overclock_numerator ||
|
||||
g_settings.cpu_overclock_denominator != cpu_overclock_denominator))))
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
10.0f,
|
||||
g_host_interface->TranslateString("OSDMessage",
|
||||
"WARNING: CPU overclock (%u%%) was different in save state (%u%%)."),
|
||||
g_settings.cpu_overclock_enable ? g_settings.GetCPUOverclockPercent() : 100u,
|
||||
cpu_overclock_active ?
|
||||
Settings::CPUOverclockFractionToPercent(cpu_overclock_numerator, cpu_overclock_denominator) :
|
||||
100u);
|
||||
UpdateOverclock();
|
||||
}
|
||||
|
||||
return !sw.HasError();
|
||||
}
|
||||
|
||||
@ -1186,7 +1240,7 @@ void UpdatePerformanceCounters()
|
||||
s_fps = static_cast<float>(s_internal_frame_number - s_last_internal_frame_number) / time;
|
||||
s_last_internal_frame_number = s_internal_frame_number;
|
||||
s_speed = static_cast<float>(static_cast<double>(global_tick_counter - s_last_global_tick_counter) /
|
||||
(static_cast<double>(MASTER_CLOCK) * time)) *
|
||||
(static_cast<double>(g_ticks_per_second) * time)) *
|
||||
100.0f;
|
||||
s_last_global_tick_counter = global_tick_counter;
|
||||
s_fps_timer.Reset();
|
||||
|
||||
Reference in New Issue
Block a user