Browse Source

Canvas:clear() when multiple canvases are active is now more efficient when GL3+ is supported

Alex Szpakowski 12 years ago
parent
commit
9da1af1e99
1 changed files with 30 additions and 13 deletions
  1. 30 13
      src/modules/graphics/opengl/Canvas.cpp

+ 30 - 13
src/modules/graphics/opengl/Canvas.cpp

@@ -560,23 +560,40 @@ void Canvas::clear(const Color &c)
 		strategy->bindFBO(fbo);
 		strategy->bindFBO(fbo);
 	}
 	}
 
 
-	// Make sure only this canvas is cleared when multi-canvas rendering is set.
-	if (attachedCanvases.size() > 0)
-		strategy->setAttachments();
+	// We don't need to worry about multiple FBO attachments or global clear
+	// color state when OpenGL 3.0+ is supported.
+	if (GLEE_VERSION_3_0)
+	{
+		GLuint glcolor[] = {c.r, c.g, c.b, c.a};
+		glClearBufferuiv(GL_COLOR, 0, glcolor);
+
+		if (depth_stencil != 0)
+		{
+			GLint stencilvalue = 0;
+			glClearBufferiv(GL_STENCIL, 0, &stencilvalue);
+		}
+	}
+	else
+	{
+		// glClear will clear all active draw buffers, so we need to temporarily
+		// detach any other canvases (when MRT is being used.)
+		if (attachedCanvases.size() > 0)
+			strategy->setAttachments();
 
 
-	// Don't use the state-shadowed gl.setClearColor because we want to save the
-	// previous clear color.
-	glClearColor((float)c.r/255.0f, (float)c.g/255.0f, (float)c.b/255.0f, (float)c.a/255.0f);
-	glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+		// Don't use the state-shadowed gl.setClearColor because we want to save
+		// the previous clear color.
+		glClearColor((float)c.r/255.0f, (float)c.g/255.0f, (float)c.b/255.0f, (float)c.a/255.0f);
+		glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
 
-	if (attachedCanvases.size() > 0)
-		strategy->setAttachments(attachedCanvases);
+		if (attachedCanvases.size() > 0)
+			strategy->setAttachments(attachedCanvases);
+
+		// Restore the global clear color.
+		gl.setClearColor(gl.getClearColor());
+	}
 
 
 	if (current != this)
 	if (current != this)
 		strategy->bindFBO(previous);
 		strategy->bindFBO(previous);
-
-	// Restore the previous clear color.
-	gl.setClearColor(gl.getClearColor());
 }
 }
 
 
 void Canvas::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const
 void Canvas::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const
@@ -623,7 +640,7 @@ void Canvas::drawg(love::graphics::Geometry *geom, float x, float y, float angle
 bool Canvas::checkCreateStencil()
 bool Canvas::checkCreateStencil()
 {
 {
 	// Do nothing if we've already created the stencil buffer.
 	// Do nothing if we've already created the stencil buffer.
-	if (depth_stencil)
+	if (depth_stencil != 0)
 		return true;
 		return true;
 
 
 	if (current != this)
 	if (current != this)