System: Fix lockup with runahead enabled
This commit is contained in:
@ -204,7 +204,7 @@ static u32 CompressAndWriteStateData(std::FILE* fp, std::span<const u8> src, Sav
|
||||
static bool DoState(StateWrapper& sw, GPUTexture** host_texture, bool update_display, bool is_memory_state);
|
||||
|
||||
static bool IsExecutionInterrupted();
|
||||
static void ExitExecution();
|
||||
static void CheckForAndExitExecution();
|
||||
|
||||
static void SetRewinding(bool enabled);
|
||||
static bool SaveRewindState();
|
||||
@ -557,15 +557,20 @@ bool System::IsRunning()
|
||||
return s_state == State::Running;
|
||||
}
|
||||
|
||||
bool System::IsExecutionInterrupted()
|
||||
ALWAYS_INLINE bool System::IsExecutionInterrupted()
|
||||
{
|
||||
return s_state != State::Running || s_system_interrupted;
|
||||
}
|
||||
|
||||
void System::ExitExecution()
|
||||
ALWAYS_INLINE_RELEASE void System::CheckForAndExitExecution()
|
||||
{
|
||||
TimingEvents::CancelRunningEvent();
|
||||
CPU::ExitExecution();
|
||||
if (IsExecutionInterrupted()) [[unlikely]]
|
||||
{
|
||||
s_system_interrupted = false;
|
||||
|
||||
TimingEvents::CancelRunningEvent();
|
||||
CPU::ExitExecution();
|
||||
}
|
||||
}
|
||||
|
||||
bool System::IsPaused()
|
||||
@ -2048,13 +2053,7 @@ void System::FrameDone()
|
||||
Host::PumpMessagesOnCPUThread();
|
||||
InputManager::PollSources();
|
||||
g_gpu->RestoreDeviceContext();
|
||||
|
||||
if (IsExecutionInterrupted())
|
||||
{
|
||||
s_system_interrupted = false;
|
||||
ExitExecution();
|
||||
return;
|
||||
}
|
||||
CheckForAndExitExecution();
|
||||
}
|
||||
|
||||
if (DoRunahead())
|
||||
@ -2159,13 +2158,7 @@ void System::FrameDone()
|
||||
{
|
||||
Host::PumpMessagesOnCPUThread();
|
||||
InputManager::PollSources();
|
||||
|
||||
if (IsExecutionInterrupted())
|
||||
{
|
||||
s_system_interrupted = false;
|
||||
ExitExecution();
|
||||
return;
|
||||
}
|
||||
CheckForAndExitExecution();
|
||||
}
|
||||
|
||||
g_gpu->RestoreDeviceContext();
|
||||
@ -4831,6 +4824,8 @@ bool System::DoRunahead()
|
||||
|
||||
// we don't want to save the frame we just loaded. but we are "one frame ahead", because the frame we just tossed
|
||||
// was never saved, so return but don't decrement the counter
|
||||
InterruptExecution();
|
||||
CheckForAndExitExecution();
|
||||
return true;
|
||||
}
|
||||
else if (s_runahead_replay_frames == 0)
|
||||
|
||||
Reference in New Issue
Block a user