1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-04 10:03:36 +00:00

Add workaround for Adreno issue with glBlitFramebuffer.

Thanks fzurita for problem investigation and found solution.
This commit is contained in:
Sergey Lipskiy 2015-08-27 19:20:26 +06:00
parent de32176303
commit 5eddea5baf
3 changed files with 20 additions and 5 deletions

View File

@ -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) {

View File

@ -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();

View File

@ -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;