diff --git a/Source/Core/Core/HW/VideoInterface.cpp b/Source/Core/Core/HW/VideoInterface.cpp index 93075d316c..a191bd25f3 100644 --- a/Source/Core/Core/HW/VideoInterface.cpp +++ b/Source/Core/Core/HW/VideoInterface.cpp @@ -634,7 +634,11 @@ u32 GetTicksPerField() static void BeginField(FieldType field) { - bool interlaced_xfb = ((m_PictureConfiguration.STD / m_PictureConfiguration.WPL)==2); + // Could we fit a second line of data in the stride? + bool potentially_interlaced_xfb = ((m_PictureConfiguration.STD / m_PictureConfiguration.WPL) == 2); + // Are there an odd number of half-lines per field (definition of interlaced video) + bool interlaced_video_mode = (GetHalfLinesPerEvenField() & 1) == 1; + u32 fbStride = m_PictureConfiguration.STD * 16; u32 fbWidth = m_PictureConfiguration.WPL * 16; u32 fbHeight = m_VerticalTimingRegister.ACV; @@ -650,7 +654,7 @@ static void BeginField(FieldType field) xfbAddr = GetXFBAddressTop(); } - if (interlaced_xfb && g_ActiveConfig.bForceProgressive) + if (potentially_interlaced_xfb && interlaced_video_mode && g_ActiveConfig.bForceProgressive) { // Strictly speaking, in interlaced mode, we're only supposed to read // half of the lines of the XFB, and use that to display a field; the