diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index cba21112..0650dad6 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -618,6 +618,7 @@ void FrameBufferList::renderBuffer(u32 _address) return; OGLVideo & ogl = video(); + OGLRender & render = ogl.getRender(); GLint srcY0, srcY1, dstY0, dstY1; GLint X0, X1, Xwidth; GLint srcPartHeight = 0; @@ -649,7 +650,7 @@ void FrameBufferList::renderBuffer(u32 _address) srcY0 = ((_address - pBuffer->m_startAddress) << 1 >> pBuffer->m_size) / (*REG.VI_WIDTH); if (isLowerField) { if (srcY0 > 0) - --srcY0; + --srcY0; if (dstY0 > 0) --dstY0; } @@ -685,15 +686,19 @@ void FrameBufferList::renderBuffer(u32 _address) return; } GLint dstCoord[4] = { X0 + hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + X1, vOffset + (GLint)(dstY1*dstScaleY) }; +#ifdef GLESX + if (render.getRenderer() == OGLRender::glrAdreno) + dstCoord[0] += 1; // workaround for Adreno's issue with glBindFramebuffer; +#endif // GLESX - ogl.getRender().updateScissor(pBuffer); + render.updateScissor(pBuffer); PostProcessor::get().process(pBuffer); // 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); //glDrawBuffer( GL_BACK ); float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - ogl.getRender().clearColorBuffer(clearColor); + render.clearColorBuffer(clearColor); GLenum filter = GL_LINEAR; if (config.video.multisampling != 0) { diff --git a/src/OpenGL.cpp b/src/OpenGL.cpp index ec0251c4..b3304f4a 100644 --- a/src/OpenGL.cpp +++ b/src/OpenGL.cpp @@ -1250,7 +1250,10 @@ void OGLRender::_initExtensions() { LOG(LOG_VERBOSE, "OpenGL version string: %s\n", glGetString(GL_VERSION)); LOG(LOG_VERBOSE, "OpenGL vendor: %s\n", glGetString(GL_VENDOR)); - LOG(LOG_VERBOSE, "OpenGL renderer: %s\n", glGetString(GL_RENDERER)); + const GLubyte * strRenderer = glGetString(GL_RENDERER); + if (strstr((const char*)strRenderer, "Adreno") != NULL) + m_oglRenderer = glrAdreno; + LOG(LOG_VERBOSE, "OpenGL renderer: %s\n", strRenderer); fboFormats.init(); diff --git a/src/OpenGL.h b/src/OpenGL.h index a41e210b..880ff32e 100644 --- a/src/OpenGL.h +++ b/src/OpenGL.h @@ -109,10 +109,16 @@ public: }; RENDER_STATE getRenderState() const {return m_renderState;} + enum OGL_RENDERER { + glrOther, + glrAdreno + }; + OGL_RENDERER getRenderer() const { return m_oglRenderer; } + void dropRenderState() {m_renderState = rsNone;} private: - OGLRender() : m_bImageTexture(false), m_bFlatColors(false) {} + OGLRender() : m_oglRenderer(glrOther), m_bImageTexture(false), m_bFlatColors(false) {} OGLRender(const OGLRender &); friend class OGLVideo; @@ -150,6 +156,7 @@ private: }; RENDER_STATE m_renderState; + OGL_RENDERER m_oglRenderer; GLVertex m_rect[4]; bool m_bImageTexture; bool m_bFlatColors;