Align frame advance and movies to full field boundaries

This commit is contained in:
meta 2019-11-18 15:05:06 -06:00
parent a9745400ec
commit 9c5c3c055e
3 changed files with 11 additions and 1 deletions

View File

@ -839,9 +839,12 @@ void Callback_VideoCopiedToXFB(bool video_update)
{ {
if (video_update) if (video_update)
s_drawn_frame++; s_drawn_frame++;
}
// Called at field boundaries in `VideoInterface::Update()`
void FrameUpdate()
{
Movie::FrameUpdate(); Movie::FrameUpdate();
if (s_frame_step) if (s_frame_step)
{ {
s_frame_step = false; s_frame_step = false;

View File

@ -26,6 +26,7 @@ bool GetIsThrottlerTempDisabled();
void SetIsThrottlerTempDisabled(bool disable); void SetIsThrottlerTempDisabled(bool disable);
void Callback_VideoCopiedToXFB(bool video_update); void Callback_VideoCopiedToXFB(bool video_update);
void FrameUpdate();
enum class State enum class State
{ {

View File

@ -733,6 +733,12 @@ static void EndField()
// Run when: When a frame is scanned (progressive/interlace) // Run when: When a frame is scanned (progressive/interlace)
void Update(u64 ticks) 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 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) if (s_half_line_of_next_si_poll == s_half_line_count)