diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 89259a0785..880853546d 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -856,9 +856,12 @@ void Callback_VideoCopiedToXFB(bool video_update) { if (video_update) s_drawn_frame++; +} +// Called at field boundaries in `VideoInterface::Update()` +void FrameUpdate() +{ Movie::FrameUpdate(); - if (s_frame_step) { s_frame_step = false; diff --git a/Source/Core/Core/Core.h b/Source/Core/Core/Core.h index 467b9746f7..11da11d174 100644 --- a/Source/Core/Core/Core.h +++ b/Source/Core/Core/Core.h @@ -26,6 +26,7 @@ bool GetIsThrottlerTempDisabled(); void SetIsThrottlerTempDisabled(bool disable); void Callback_VideoCopiedToXFB(bool video_update); +void FrameUpdate(); enum class State { diff --git a/Source/Core/Core/HW/VideoInterface.cpp b/Source/Core/Core/HW/VideoInterface.cpp index 47c15906fc..3f70701069 100644 --- a/Source/Core/Core/HW/VideoInterface.cpp +++ b/Source/Core/Core/HW/VideoInterface.cpp @@ -816,6 +816,12 @@ static void EndField() // Run when: When a frame is scanned (progressive/interlace) void Update(u64 ticks) { + // If this half-line is at a field boundary, potentially deal with frame-stepping + // and/or update movie state before dealing with anything else + + if (s_half_line_count == 0 || s_half_line_count == GetHalfLinesPerEvenField()) + Core::FrameUpdate(); + // If an SI poll is scheduled to happen on this half-line, do it! if (s_half_line_of_next_si_poll == s_half_line_count)