diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 0b2d17d21c..d32737dda6 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -675,24 +675,34 @@ void FramebufferManager::UpdateFromMemory(u32 addr, int size) { fbo_unbind(); currentRenderVfb_ = 0; + bool needUnbind = false; for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ) { VirtualFramebuffer *vfb = *iter; if (MaskedEqual(vfb->fb_address, addr)) { // TODO: This without the fbo_unbind() above would be better than destroying the FBO. // However, it doesn't seem to work for Star Ocean, at least - //DrawPixels(Memory::GetPointer(addr), vfb->format, vfb->fb_stride); - textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); - INFO_LOG(HLE, "Invalidating FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format) - if (vfb->fbo) { - fbo_destroy(vfb->fbo); - vfb->fbo = 0; + if (g_Config.bBufferedRendering) { + fbo_bind_as_render_target(vfb->fbo); + needUnbind = true; + DrawPixels(Memory::GetPointer(addr), vfb->format, vfb->fb_stride); + ++iter; + } else { + textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); + INFO_LOG(HLE, "Invalidating FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format) + if (vfb->fbo) { + fbo_destroy(vfb->fbo); + vfb->fbo = 0; + } + delete vfb; + vfbs_.erase(iter++); } - delete vfb; - vfbs_.erase(iter++); } else ++iter; } + + if (needUnbind) + fbo_unbind(); } }