diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index cda0978d..bfcf801a 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -331,15 +331,15 @@ void FrameBufferList::renderBuffer(u32 _address) if (_SHIFTR( *REG.VI_H_START, 0, 10 ) == 0) // H width is zero. Don't draw return; + FrameBuffer *pBuffer = findBuffer(_address); if (pBuffer == NULL) return; + OGLVideo & ogl = video(); GLint srcY0, srcY1, dstY0, dstY1; GLint partHeight = 0; - dstY0 = 1; const u32 vStart = _SHIFTR( *REG.VI_V_START, 17, 9 ); - const u32 vEnd = _SHIFTR( *REG.VI_V_START, 1, 9 ); bool isLowerField = false; if ((*REG.VI_STATUS & 0x40) != 0) { const bool isPAL = (*REG.VI_V_SYNC & 0x3ff) > 550; @@ -347,11 +347,6 @@ void FrameBufferList::renderBuffer(u32 _address) } vStartPrev = vStart; - const float viScaleY = ogl.getHeight() / (float)VI.vHeight; - - if (vStart > VI.vStart) - dstY0 += vStart - VI.vStart; - dstY1 = dstY0 + vEnd - vStart; srcY0 = ((_address - pBuffer->m_startAddress) << 1 >> pBuffer->m_size) / (*REG.VI_WIDTH); if (isLowerField) --srcY0; @@ -360,7 +355,11 @@ void FrameBufferList::renderBuffer(u32 _address) if (srcY1 > VI.height) { partHeight = srcY1 - VI.height; srcY1 = VI.height; - dstY1 -= partHeight; + dstY0 = 1; + dstY1 = dstY0 + VI.real_height - partHeight; + } else { + dstY0 = srcY0; + dstY1 = srcY1; } // glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD @@ -371,9 +370,10 @@ void FrameBufferList::renderBuffer(u32 _address) //glDrawBuffer( GL_BACK ); float clearColor[4] = {0.0f, 0.0f, 0.0f, 0.0f}; ogl.getRender().clearColorBuffer(clearColor); + const float scaleY = ogl.getScaleY(); glBlitFramebuffer( - 0, (GLint)(srcY0*ogl.getScaleY()), ogl.getWidth(), (GLint)(srcY1*ogl.getScaleY()), - 0, ogl.getHeightOffset() + (GLint)(dstY0*viScaleY), ogl.getWidth(), ogl.getHeightOffset() + (GLint)(dstY1*viScaleY), + 0, (GLint)(srcY0*scaleY), ogl.getWidth(), (GLint)(srcY1*scaleY), + 0, ogl.getHeightOffset() + (GLint)(dstY0*scaleY), ogl.getWidth(), ogl.getHeightOffset() + (GLint)(dstY1*scaleY), GL_COLOR_BUFFER_BIT, GL_LINEAR ); @@ -387,8 +387,8 @@ void FrameBufferList::renderBuffer(u32 _address) dstY1 = dstY0 + partHeight; glBindFramebuffer(GL_READ_FRAMEBUFFER, pBuffer->m_FBO); glBlitFramebuffer( - 0, (GLint)(srcY0*ogl.getScaleY()), ogl.getWidth(), (GLint)(srcY1*ogl.getScaleY()), - 0, ogl.getHeightOffset() + (GLint)(dstY0*viScaleY), ogl.getWidth(), ogl.getHeightOffset() + (GLint)(dstY1*viScaleY), + 0, (GLint)(srcY0*scaleY), ogl.getWidth(), (GLint)(srcY1*scaleY), + 0, ogl.getHeightOffset() + (GLint)(dstY0*scaleY), ogl.getWidth(), ogl.getHeightOffset() + (GLint)(dstY1*scaleY), GL_COLOR_BUFFER_BIT, GL_LINEAR ); } diff --git a/VI.cpp b/VI.cpp index 1d3b079e..e0a10eee 100644 --- a/VI.cpp +++ b/VI.cpp @@ -17,7 +17,8 @@ void VI_UpdateSize() const f32 xScale = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 0, 12 ), 10 ); // f32 xOffset = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 16, 12 ), 10 ); - const f32 yScale = _FIXED2FLOAT( _SHIFTR( *REG.VI_Y_SCALE, 0, 12 ), 10 ); + const u32 vScale = _SHIFTR(*REG.VI_Y_SCALE, 0, 12); + const f32 yScale = _FIXED2FLOAT(vScale, 10); // f32 yOffset = _FIXED2FLOAT( _SHIFTR( *REG.VI_Y_SCALE, 16, 12 ), 10 ); const u32 hEnd = _SHIFTR( *REG.VI_H_START, 0, 10 ); @@ -35,12 +36,6 @@ void VI_UpdateSize() VI.real_height = (vEnd - vStart) * yScale; VI.height = VI.real_height*1.0126582f; - if (VI.vStart == 0) { - VI.vStart = vStart; - VI.vEnd = vEnd; - VI.vHeight = VI.height; - } - if (VI.width == 0.0f) VI.width = *REG.VI_WIDTH; if (VI.height == 0.0f) @@ -58,8 +53,6 @@ void VI_UpdateScreen() if (ogl.changeWindow()) return; ogl.saveScreenshot(); - if (((*REG.VI_STATUS)&3) == 0) - VI.vStart = VI.vEnd = 0; if (config.frameBufferEmulation.enable) { const bool bCFB = !config.frameBufferEmulation.ignoreCFB && (gSP.changed&CHANGED_CPU_FB_WRITE) == CHANGED_CPU_FB_WRITE; diff --git a/VI.h b/VI.h index 658c2626..b8b023a2 100644 --- a/VI.h +++ b/VI.h @@ -7,14 +7,12 @@ struct VIInfo u32 width; u32 height, real_height; f32 rwidth, rheight; - u32 vStart, vEnd, vHeight; u32 lastOrigin; bool interlaced; VIInfo() : width(0), height(0), real_height(0), - vStart(0), vEnd(0), vHeight(0), lastOrigin(0), - interlaced(false) + lastOrigin(0), interlaced(false) {} };