From aecd5bf25096517e9305622d67f7eb27db7a4a05 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 30 May 2014 08:53:22 -0700 Subject: [PATCH] Support render-to-self on GLES2. --- GPU/GLES/Framebuffer.cpp | 60 +++++++++++++--------------------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 3200ba3d40..c83d63d179 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -1028,49 +1028,27 @@ void FramebufferManager::BindFramebufferColor(VirtualFramebuffer *framebuffer, b // currentRenderVfb_ will always be set when this is called, except from the GE debugger. // Let's just not bother with the copy in that case. if (!skipCopy && currentRenderVfb_ && MaskedEqual(framebuffer->fb_address, gstate.getFrameBufRawAddress())) { -#ifndef USING_GLES2 - if (gl_extensions.FBO_ARB) { - bool useNV = false; -#else - if (gl_extensions.GLES3 || gl_extensions.NV_framebuffer_blit) { - bool useNV = !gl_extensions.GLES3; -#endif -#ifdef MAY_HAVE_GLES3 - - // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - FBO *renderCopy = NULL; - std::pair copySize = std::make_pair((int)framebuffer->renderWidth, (int)framebuffer->renderHeight); - for (auto it = renderCopies_.begin(), end = renderCopies_.end(); it != end; ++it) { - if (it->first == copySize) { - renderCopy = it->second; - break; - } + // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. + FBO *renderCopy = NULL; + std::pair copySize = std::make_pair((int)framebuffer->renderWidth, (int)framebuffer->renderHeight); + for (auto it = renderCopies_.begin(), end = renderCopies_.end(); it != end; ++it) { + if (it->first == copySize) { + renderCopy = it->second; + break; } - if (!renderCopy) { - renderCopy = fbo_create(framebuffer->renderWidth, framebuffer->renderHeight, 1, true, framebuffer->colorDepth); - renderCopies_[copySize] = renderCopy; - } - - fbo_bind_as_render_target(renderCopy); - glViewport(0, 0, framebuffer->renderWidth, framebuffer->renderHeight); - glDisable(GL_SCISSOR_TEST); - fbo_bind_for_read(framebuffer->fbo); - -#if defined(USING_GLES2) && (defined(ANDROID) || defined(BLACKBERRY)) // We only support this extension on Android, it's not even available on PC. - if (useNV) { - glBlitFramebufferNV(0, 0, framebuffer->renderWidth, framebuffer->renderHeight, 0, 0, framebuffer->renderWidth, framebuffer->renderHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); - } else -#endif // defined(USING_GLES2) && (defined(ANDROID) || defined(BLACKBERRY)) - glBlitFramebuffer(0, 0, framebuffer->renderWidth, framebuffer->renderHeight, 0, 0, framebuffer->renderWidth, framebuffer->renderHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); - - fbo_bind_as_render_target(currentRenderVfb_->fbo); - fbo_bind_color_as_texture(renderCopy, 0); - glstate.viewport.restore(); - glstate.scissorTest.restore(); -#endif - } else { - fbo_bind_color_as_texture(framebuffer->fbo, 0); } + if (!renderCopy) { + renderCopy = fbo_create(framebuffer->renderWidth, framebuffer->renderHeight, 1, true, framebuffer->colorDepth); + renderCopies_[copySize] = renderCopy; + } + + VirtualFramebuffer copyInfo = *framebuffer; + copyInfo.fbo = renderCopy; + BlitFramebuffer_(©Info, 0, 0, framebuffer, 0, 0, framebuffer->width, framebuffer->height, 0, false); + + fbo_bind_as_render_target(currentRenderVfb_->fbo); + fbo_bind_color_as_texture(renderCopy, 0); + glstate.viewport.restore(); } else { fbo_bind_color_as_texture(framebuffer->fbo, 0); }