SPU: Fix determinism loss when loading state where IRQs differ

This commit is contained in:
Stenzek 2024-12-23 19:45:04 +10:00
parent 2aa466d1c6
commit 307bd86b72
No known key found for this signature in database
1 changed files with 4 additions and 10 deletions

View File

@ -1616,8 +1616,7 @@ void SPU::InternalGeneratePendingSamples()
} }
else else
{ {
frames_to_execute = frames_to_execute = (ticks_pending + s_state.ticks_carry) / SYSCLK_TICKS_PER_SPU_TICK;
(s_state.tick_event.GetTicksSinceLastExecution() + s_state.ticks_carry) / SYSCLK_TICKS_PER_SPU_TICK;
} }
const bool force_exec = (frames_to_execute > 0); const bool force_exec = (frames_to_execute > 0);
@ -2505,15 +2504,10 @@ void SPU::UpdateEventInterval()
if (s_state.tick_event.IsActive() && s_state.tick_event.GetInterval() == interval_ticks) if (s_state.tick_event.IsActive() && s_state.tick_event.GetInterval() == interval_ticks)
return; return;
// Ensure all pending ticks have been executed, since we won't get them back after rescheduling. // Ticks remaining before execution should be retained, just adjust the interval/downcount.
s_state.tick_event.InvokeEarly(true); const TickCount new_downcount = interval_ticks - s_state.ticks_carry;
s_state.tick_event.SetInterval(interval_ticks); s_state.tick_event.SetInterval(interval_ticks);
s_state.tick_event.Schedule(new_downcount);
TickCount downcount = interval_ticks;
if (!g_settings.cpu_overclock_active)
downcount -= s_state.ticks_carry;
s_state.tick_event.Schedule(downcount);
} }
void SPU::DrawDebugStateWindow(float scale) void SPU::DrawDebugStateWindow(float scale)