diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index f089354a..a8479d2c 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -773,15 +773,17 @@ void FrameBufferList::attachDepthBuffer() if (m_pCurrent->m_FBO.isNotNull() && pDepthBuffer != nullptr) { pDepthBuffer->initDepthImageTexture(m_pCurrent); pDepthBuffer->initDepthBufferTexture(m_pCurrent); -#ifdef USE_DEPTH_RENDERBUFFER - // TODO - if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) { -#else - const bool goodDepthBufferTexture = gfxContext.isSupported(SpecialFeatures::WeakBlitFramebuffer) ? - pDepthBuffer->m_pDepthBufferTexture->realWidth == m_pCurrent->m_pTexture->realWidth : - pDepthBuffer->m_pDepthBufferTexture->realWidth >= m_pCurrent->m_pTexture->realWidth; + + bool goodDepthBufferTexture = false; + if (gfxContext.isSupported(SpecialFeatures::DepthFramebufferTextures)) { + goodDepthBufferTexture = gfxContext.isSupported(SpecialFeatures::WeakBlitFramebuffer) ? + pDepthBuffer->m_pDepthBufferTexture->realWidth == m_pCurrent->m_pTexture->realWidth : + pDepthBuffer->m_pDepthBufferTexture->realWidth >= m_pCurrent->m_pTexture->realWidth; + } else { + goodDepthBufferTexture = pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth; + } + if (goodDepthBufferTexture) { -#endif // USE_DEPTH_RENDERBUFFER m_pCurrent->m_pDepthBuffer = pDepthBuffer; pDepthBuffer->setDepthAttachment(m_pCurrent->m_FBO, bufferTarget::DRAW_FRAMEBUFFER); if (Context::imageTextures && config.frameBufferEmulation.N64DepthCompare != 0) @@ -930,16 +932,9 @@ void FrameBufferList::renderBuffer(u32 _address) vOffset + (s32)(dstY0*dstScaleY), hOffset + X1, vOffset + (s32)(dstY1*dstScaleY) }; -#if 0 //def GLESX - // TODO fix me - if (render.getRenderer() == OGLRender::glrAdreno) - dstCoord[0] += 1; // workaround for Adreno's issue with glBindFramebuffer; -#endif // GLESX -// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); gfxContext.bindFramebuffer(bufferTarget::DRAW_FRAMEBUFFER, ObjectHandle()); - //glDrawBuffer( GL_BACK ); float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; drawer.clearColorBuffer(clearColor); @@ -952,20 +947,15 @@ void FrameBufferList::renderBuffer(u32 _address) (srcCoord[2] - srcCoord[0]) != (dstCoord[2] - dstCoord[0]) || (srcCoord[3] - srcCoord[1]) != (dstCoord[3] - dstCoord[1])) { pFilteredBuffer->resolveMultisampledTexture(true); - //glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO); readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO); } else { -// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO); readBuffer = ObjectHandle(pFilteredBuffer->m_FBO); filter = textureParameters::FILTER_NEAREST; } } else { readBuffer = ObjectHandle(pFilteredBuffer->m_FBO); -// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO); } -// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - GraphicsDrawer::BlitOrCopyRectParams blitParams; blitParams.srcX0 = srcCoord[0]; blitParams.srcY0 = srcCoord[1]; @@ -1000,14 +990,10 @@ void FrameBufferList::renderBuffer(u32 _address) if (pFilteredBuffer->m_pTexture->frameBufferTexture == CachedTexture::fbMultiSample) { pFilteredBuffer->resolveMultisampledTexture(); readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO); -// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO); } else { -// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO); readBuffer = ObjectHandle(pFilteredBuffer->m_FBO); } -// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - pBufferTexture = pFilteredBuffer->m_pTexture; blitParams.srcX0 = 0; @@ -1129,8 +1115,6 @@ bool FrameBuffer_CopyDepthBufferChunk(u32 address) void FrameBuffer_CopyFromRDRAM(u32 _address, bool _bCFB) { - // TODO fix me - return; RDRAMtoColorBuffer::get().copyFromRDRAM(_address, _bCFB); } diff --git a/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp b/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp index 4e8bcb69..9843250a 100644 --- a/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp +++ b/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp @@ -301,16 +301,21 @@ public: return !_glinfo.isGLES2; } - BlitFramebuffersImpl(CachedBindFramebuffer * _bind) - : m_bind(_bind) {} + BlitFramebuffersImpl(CachedBindFramebuffer * _bind, Renderer _renderer) + : m_bind(_bind) + , m_renderer(_renderer) { + } bool blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params) override { m_bind->bind(graphics::bufferTarget::READ_FRAMEBUFFER, _params.readBuffer); m_bind->bind(graphics::bufferTarget::DRAW_FRAMEBUFFER, _params.drawBuffer); + + const s32 adrenoCoordFix = (m_renderer == Renderer::Adreno) ? 1 : 0; + glBlitFramebuffer( _params.srcX0, _params.srcY0, _params.srcX1, _params.srcY1, - _params.dstX0, _params.dstY0, _params.dstX1, _params.dstY1, + adrenoCoordFix +_params.dstX0, _params.dstY0, _params.dstX1, _params.dstY1, GLbitfield(_params.mask), GLenum(_params.filter) ); return !Utils::isGLError(); @@ -318,6 +323,7 @@ public: private: CachedBindFramebuffer * m_bind; + Renderer m_renderer; }; class DummyBlitFramebuffers: public BlitFramebuffers @@ -501,7 +507,7 @@ AddFramebufferRenderTarget * BufferManipulationObjectFactory::getAddFramebufferR BlitFramebuffers * BufferManipulationObjectFactory::getBlitFramebuffers() const { if (BlitFramebuffersImpl::Check(m_glInfo)) - return new BlitFramebuffersImpl(m_cachedFunctions.getCachedBindFramebuffer()); + return new BlitFramebuffersImpl(m_cachedFunctions.getCachedBindFramebuffer(), m_glInfo.renderer); return new DummyBlitFramebuffers; } diff --git a/src/Graphics/OpenGLContext/opengl_GLInfo.cpp b/src/Graphics/OpenGLContext/opengl_GLInfo.cpp index bb0d0049..ed26f5c9 100644 --- a/src/Graphics/OpenGLContext/opengl_GLInfo.cpp +++ b/src/Graphics/OpenGLContext/opengl_GLInfo.cpp @@ -20,6 +20,13 @@ void GLInfo::init() { LOG(LOG_VERBOSE, "%s major version: %d\n", isGLESX ? "OpenGL ES" : "OpenGL", majorVersion); LOG(LOG_VERBOSE, "%s minor version: %d\n", isGLESX ? "OpenGL ES" : "OpenGL", minorVersion); + + LOG(LOG_VERBOSE, "OpenGL vendor: %s\n", glGetString(GL_VENDOR)); + const GLubyte * strRenderer = glGetString(GL_RENDERER); + if (strstr((const char*)strRenderer, "Adreno") != nullptr) + renderer = Renderer::Adreno; + LOG(LOG_VERBOSE, "OpenGL renderer: %s\n", strRenderer); + if (isGLES2) { imageTextures = false; msaa = false; diff --git a/src/Graphics/OpenGLContext/opengl_GLInfo.h b/src/Graphics/OpenGLContext/opengl_GLInfo.h index ba707812..5cbcb1b5 100644 --- a/src/Graphics/OpenGLContext/opengl_GLInfo.h +++ b/src/Graphics/OpenGLContext/opengl_GLInfo.h @@ -3,15 +3,21 @@ namespace opengl { - struct GLInfo { - GLint majorVersion = 0; - GLint minorVersion = 0; - bool isGLES2 = false; - bool isGLESX = false; - bool imageTextures = false; - bool shaderStorage = false; - bool msaa = false; +enum class Renderer { + Adreno, + Other +}; - void init(); - }; +struct GLInfo { + GLint majorVersion = 0; + GLint minorVersion = 0; + bool isGLES2 = false; + bool isGLESX = false; + bool imageTextures = false; + bool shaderStorage = false; + bool msaa = false; + Renderer renderer = Renderer::Other; + + void init(); +}; }