From 7ad11627d6a31d6f6ffa4d6764e39c2a6e4bc1a7 Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Thu, 23 Jun 2016 16:14:04 +0600 Subject: [PATCH] Use OGLRender::copyTexturedRect in FrameBuffer::renderBuffer Remove GLES2-specific code. --- src/FrameBuffer.cpp | 84 +++++++-------------------------------------- 1 file changed, 13 insertions(+), 71 deletions(-) diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index 3cd80b15..0c60066f 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -764,7 +764,6 @@ void FrameBuffer_Destroy() frameBufferList().destroy(); } -#ifndef GLES2 void FrameBufferList::renderBuffer(u32 _address) { static s32 vStartPrev = 0; @@ -866,7 +865,6 @@ void FrameBufferList::renderBuffer(u32 _address) (srcCoord[3] - srcCoord[1]) != (dstCoord[3] - dstCoord[1])) { pFilteredBuffer->resolveMultisampledTexture(true); glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } else { glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO); filter = GL_NEAREST; @@ -874,14 +872,12 @@ void FrameBufferList::renderBuffer(u32 _address) } else glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO); - // glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD - glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset()); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - glBlitFramebuffer( - srcCoord[0], srcCoord[1], srcCoord[2], srcCoord[3], - dstCoord[0], dstCoord[1], dstCoord[2], dstCoord[3], - GL_COLOR_BUFFER_BIT, filter - ); + ogl.getRender().copyTexturedRect(srcCoord[0], srcCoord[1], srcCoord[2], srcCoord[3], + pBufferTexture->realWidth, pBufferTexture->realHeight, pBufferTexture->glName, + dstCoord[0], dstCoord[1], dstCoord[2], dstCoord[3], + ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset(), filter); if (dstPartHeight > 0) { const u32 size = *REG.VI_STATUS & 3; @@ -895,14 +891,16 @@ void FrameBufferList::renderBuffer(u32 _address) if (pFilteredBuffer->m_pTexture->frameBufferTexture == CachedTexture::fbMultiSample) { pFilteredBuffer->resolveMultisampledTexture(); glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } else glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO); - glBlitFramebuffer( - 0, (GLint)(srcY0*srcScaleY), Xwidth, min((GLint)(srcY1*srcScaleY), (GLint)pFilteredBuffer->m_pTexture->realHeight), - hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + X1, vOffset + (GLint)(dstY1*dstScaleY), - GL_COLOR_BUFFER_BIT, filter - ); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + + pBufferTexture = pFilteredBuffer->m_pTexture; + ogl.getRender().copyTexturedRect(0, (GLint)(srcY0*srcScaleY), Xwidth, min((GLint)(srcY1*srcScaleY), (GLint)pFilteredBuffer->m_pTexture->realHeight), + pBufferTexture->realWidth, pBufferTexture->realHeight, pBufferTexture->glName, + hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + X1, vOffset + (GLint)(dstY1*dstScaleY), + ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset(), filter); } } @@ -912,62 +910,6 @@ void FrameBufferList::renderBuffer(u32 _address) ogl.swapBuffers(); gDP.changed |= CHANGED_SCISSOR; } -#else - -void FrameBufferList::renderBuffer(u32 _address) -{ - if (VI.width == 0 || *REG.VI_WIDTH == 0 || *REG.VI_H_START == 0) // H width is zero. Don't draw - return; - - FrameBuffer *pBuffer = findBuffer(_address); - if (pBuffer == nullptr) - return; - - OGLVideo & ogl = video(); - ogl.getRender().updateScissor(pBuffer); - FrameBuffer * pFilteredBuffer = PostProcessor::get().doBlur(PostProcessor::get().doGammaCorrection(pBuffer)); - ogl.getRender().dropRenderState(); - - const u32 width = pFilteredBuffer->m_width; - const u32 height = pFilteredBuffer->m_height; - - pFilteredBuffer->m_pTexture->scaleS = ogl.getScaleX() / (float)pFilteredBuffer->m_pTexture->realWidth; - pFilteredBuffer->m_pTexture->scaleT = ogl.getScaleY() / (float)pFilteredBuffer->m_pTexture->realHeight; - pFilteredBuffer->m_pTexture->shiftScaleS = 1.0f; - pFilteredBuffer->m_pTexture->shiftScaleT = 1.0f; - pFilteredBuffer->m_pTexture->offsetS = 0; - pFilteredBuffer->m_pTexture->offsetT = (float)height; - textureCache().activateTexture(0, pFilteredBuffer->m_pTexture); - gSP.textureTile[0]->fuls = gSP.textureTile[0]->fult = 0.0f; - gSP.textureTile[0]->shifts = gSP.textureTile[0]->shiftt = 0; - - gDP.otherMode.cycleType = G_CYC_COPY; - CombinerInfo::get().setCombine(EncodeCombineMode(0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0)); - CombinerInfo::get().updateParameters(OGLRender::rsTexRect); - currentCombiner()->disableBlending(); - glDisable( GL_BLEND ); - glDisable(GL_DEPTH_TEST); - glDisable( GL_CULL_FACE ); - glDisable( GL_POLYGON_OFFSET_FILL ); - - glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset()); - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - OGLRender::TexturedRectParams params(0.0f, 0.0f, width, height, 0.0f, 0.0f, width - 1.0f, height - 1.0f, 1.0f, 1.0f, false, false, false, pFilteredBuffer); - ogl.getRender().drawTexturedRect(params); - - glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); - if (m_pCurrent != nullptr) - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_pCurrent->m_FBO); - ogl.swapBuffers(); - - gSP.changed |= CHANGED_VIEWPORT; - gDP.changed |= CHANGED_COMBINE | CHANGED_SCISSOR; -} -#endif - - void FrameBuffer_ActivateBufferTexture(u32 t, FrameBuffer *pBuffer) {