From 40242689b19c7058fe3ceb3112d53b9f4dcd3a31 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Thu, 30 Jan 2014 21:09:13 -0400 Subject: [PATCH] Fixed rendering to multiple canvases, removed some redundant OpenGL calls when switching between canvases --- src/modules/graphics/opengl/Canvas.cpp | 37 +++++++++++---------- src/modules/graphics/opengl/Canvas.h | 2 +- src/modules/graphics/opengl/SpriteBatch.cpp | 4 +++ src/modules/graphics/opengl/SpriteBatch.h | 2 -- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index afadd448a..090aeb028 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -397,9 +397,6 @@ static void getStrategy() } } -static int maxFBOColorAttachments = 0; -static int maxDrawBuffers = 0; - Canvas::Canvas(int width, int height, TextureType texture_type, int fsaa) : fbo(0) , resolve_fbo(0) @@ -657,12 +654,19 @@ void Canvas::setupGrab() if (current == this) return; - // cleanup after previous fbo - if (current != NULL) - current->stopGrab(); + // cleanup after previous Canvas + if (current != nullptr) + { + systemViewport = current->systemViewport; + current->stopGrab(true); + } + else + systemViewport = gl.getViewport(); + + // indicate we are using this Canvas. + current = this; // bind the framebuffer object. - systemViewport = gl.getViewport(); strategy->bindFBO(fbo); gl.setViewport(OpenGL::Viewport(0, 0, width, height)); @@ -677,9 +681,6 @@ void Canvas::setupGrab() // Switch back to modelview matrix glMatrixMode(GL_MODELVIEW); - // indicate we are using this fbo - current = this; - if (fsaa_buffer != 0) fsaa_dirty = true; } @@ -695,7 +696,7 @@ void Canvas::startGrab(const std::vector &canvases) if (!isMultiCanvasSupported()) throw love::Exception("Multi-canvas rendering is not supported on this system."); - if (canvases.size()+1 > size_t(maxDrawBuffers) || canvases.size()+1 > size_t(maxFBOColorAttachments)) + if ((int) canvases.size() + 1 > gl.getMaxRenderTargets()) throw love::Exception("This system can't simultaniously render to %d canvases.", canvases.size()+1); if (fsaa_samples != 0) @@ -752,21 +753,23 @@ void Canvas::startGrab() attachedCanvases.clear(); } -void Canvas::stopGrab() +void Canvas::stopGrab(bool switchingToOtherCanvas) { // i am not grabbing. leave me alone if (current != this) return; - // bind default - strategy->bindFBO(0); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); - current = nullptr; - - gl.setViewport(systemViewport); + // bind default + if (!switchingToOtherCanvas) + { + strategy->bindFBO(0); + current = nullptr; + gl.setViewport(systemViewport); + } } void Canvas::clear(Color c) diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index f643294fc..86db8f0f9 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -69,7 +69,7 @@ public: **/ void startGrab(const std::vector &canvases); void startGrab(); - void stopGrab(); + void stopGrab(bool switchingToOtherCanvas = false); void clear(Color c); diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index 032e8769e..bd2e52f99 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -105,6 +105,8 @@ int SpriteBatch::add(float x, float y, float a, float sx, float sy, float ox, fl if ((index == -1 && next >= size) || index < -1 || index >= size) return -1; + Vertex sprite[4]; + // Needed for colors. memcpy(sprite, texture->getVertices(), sizeof(Vertex) * 4); @@ -131,6 +133,8 @@ int SpriteBatch::addq(Quad *quad, float x, float y, float a, float sx, float sy, if ((index == -1 && next >= size) || index < -1 || index >= next) return -1; + Vertex sprite[4]; + // Needed for colors. memcpy(sprite, quad->getVertices(), sizeof(Vertex) * 4); diff --git a/src/modules/graphics/opengl/SpriteBatch.h b/src/modules/graphics/opengl/SpriteBatch.h index ae79db8d6..7339c7c77 100644 --- a/src/modules/graphics/opengl/SpriteBatch.h +++ b/src/modules/graphics/opengl/SpriteBatch.h @@ -135,8 +135,6 @@ private: // The next free element. int next; - Vertex sprite[4]; - // Current color. This color, if present, will be applied to the next // added sprite. Color *color;