Browse Source

Don’t call unnecessary OpenGL APIs in love.graphics.setColor

--HG--
branch : minor
Alex Szpakowski 8 years ago
parent
commit
548293e100

+ 0 - 1
src/modules/graphics/Graphics.h

@@ -720,7 +720,6 @@ protected:
 	struct DisplayState
 	struct DisplayState
 	{
 	{
 		Colorf color = Colorf(1.0, 1.0, 1.0, 1.0);
 		Colorf color = Colorf(1.0, 1.0, 1.0, 1.0);
-		Colorf gammaCorrectedColor = Colorf(1.0f, 1.0f, 1.0f, 1.0f);
 		Colorf backgroundColor = Colorf(0.0, 0.0, 0.0, 1.0);
 		Colorf backgroundColor = Colorf(0.0, 0.0, 0.0, 1.0);
 
 
 		BlendMode blendMode = BLEND_ALPHA;
 		BlendMode blendMode = BLEND_ALPHA;

+ 4 - 7
src/modules/graphics/opengl/Graphics.cpp

@@ -417,8 +417,9 @@ void Graphics::flushStreamDraws()
 		break;
 		break;
 	}
 	}
 
 
+	Colorf nc = gl.getConstantColor();
 	if (attribs & ATTRIBFLAG_COLOR)
 	if (attribs & ATTRIBFLAG_COLOR)
-		glVertexAttrib4f(ATTRIB_CONSTANTCOLOR, 1.0f, 1.0f, 1.0f, 1.0f);
+		gl.setConstantColor(Colorf(1.0f, 1.0f, 1.0f, 1.0f));
 
 
 	pushIdentityTransform();
 	pushIdentityTransform();
 
 
@@ -445,10 +446,7 @@ void Graphics::flushStreamDraws()
 	popTransform();
 	popTransform();
 
 
 	if (attribs & ATTRIB_CONSTANTCOLOR)
 	if (attribs & ATTRIB_CONSTANTCOLOR)
-	{
-		Colorf nc = states.back().gammaCorrectedColor;
-		glVertexAttrib4f(ATTRIB_CONSTANTCOLOR, nc.r, nc.g, nc.b, nc.a);
-	}
+		gl.setConstantColor(nc);
 
 
 	streamBufferState.vertexCount = 0;
 	streamBufferState.vertexCount = 0;
 	streamBufferState.indexCount = 0;
 	streamBufferState.indexCount = 0;
@@ -1236,10 +1234,9 @@ void Graphics::setColor(Colorf c)
 
 
 	Colorf nc = c;
 	Colorf nc = c;
 	gammaCorrectColor(nc);
 	gammaCorrectColor(nc);
-	glVertexAttrib4f(ATTRIB_CONSTANTCOLOR, nc.r, nc.g, nc.b, nc.a);
+	gl.setConstantColor(nc);
 
 
 	states.back().color = c;
 	states.back().color = c;
-	states.back().gammaCorrectedColor = nc;
 }
 }
 
 
 void Graphics::setColorMask(ColorMask mask)
 void Graphics::setColorMask(ColorMask mask)

+ 21 - 0
src/modules/graphics/opengl/OpenGL.cpp

@@ -76,6 +76,10 @@ OpenGL::OpenGL()
 	, vendor(VENDOR_UNKNOWN)
 	, vendor(VENDOR_UNKNOWN)
 	, state()
 	, state()
 {
 {
+	state.constantColor = Colorf(1.0f, 1.0f, 1.0f, 1.0f);
+
+	float nan = std::numeric_limits<float>::quiet_NaN();
+	state.lastConstantColor = Colorf(nan, nan, nan, nan);
 }
 }
 
 
 bool OpenGL::initContext()
 bool OpenGL::initContext()
@@ -337,6 +341,13 @@ void OpenGL::prepareDraw()
 	// Make sure the active shader's love-provided uniforms are up to date.
 	// Make sure the active shader's love-provided uniforms are up to date.
 	if (Shader::current != nullptr)
 	if (Shader::current != nullptr)
 		((Shader *)Shader::current)->checkSetBuiltinUniforms();
 		((Shader *)Shader::current)->checkSetBuiltinUniforms();
+
+	if (state.constantColor != state.lastConstantColor)
+	{
+		const Colorf &c = state.constantColor;
+		glVertexAttrib4f(ATTRIB_CONSTANTCOLOR, c.r, c.g, c.b, c.a);
+		state.lastConstantColor = c;
+	}
 }
 }
 
 
 GLenum OpenGL::getGLBufferType(BufferType type)
 GLenum OpenGL::getGLBufferType(BufferType type)
@@ -456,6 +467,16 @@ void OpenGL::setScissor(const Rect &v, bool canvasActive)
 	state.scissor = v;
 	state.scissor = v;
 }
 }
 
 
+void OpenGL::setConstantColor(const Colorf &color)
+{
+	state.constantColor = color;
+}
+
+const Colorf &OpenGL::getConstantColor() const
+{
+	return state.constantColor;
+}
+
 void OpenGL::setPointSize(float size)
 void OpenGL::setPointSize(float size)
 {
 {
 	if (GLAD_VERSION_1_0)
 	if (GLAD_VERSION_1_0)

+ 9 - 11
src/modules/graphics/opengl/OpenGL.h

@@ -226,10 +226,6 @@ public:
 	 * The y-coordinate starts at the top.
 	 * The y-coordinate starts at the top.
 	 **/
 	 **/
 	void setViewport(const Rect &v);
 	void setViewport(const Rect &v);
-
-	/**
-	 * Gets the current OpenGL rendering viewport rectangle.
-	 **/
 	Rect getViewport() const;
 	Rect getViewport() const;
 
 
 	/**
 	/**
@@ -239,23 +235,22 @@ public:
 	void setScissor(const Rect &v, bool canvasActive);
 	void setScissor(const Rect &v, bool canvasActive);
 
 
 	/**
 	/**
-	 * Sets the global point size.
+	 * Sets the constant color (vertex attribute). This may be applied
+	 * internally at draw-time.
 	 **/
 	 **/
-	void setPointSize(float size);
+	void setConstantColor(const Colorf &color);
+	const Colorf &getConstantColor() const;
 
 
 	/**
 	/**
-	 * Gets the global point size.
+	 * Sets the global point size.
 	 **/
 	 **/
+	void setPointSize(float size);
 	float getPointSize() const;
 	float getPointSize() const;
 
 
 	/**
 	/**
 	 * Calls glEnable/glDisable(GL_FRAMEBUFFER_SRGB).
 	 * Calls glEnable/glDisable(GL_FRAMEBUFFER_SRGB).
 	 **/
 	 **/
 	void setFramebufferSRGB(bool enable);
 	void setFramebufferSRGB(bool enable);
-
-	/**
-	 * Equivalent to glIsEnabled(GL_FRAMEBUFFER_SRGB).
-	 **/
 	bool hasFramebufferSRGB() const;
 	bool hasFramebufferSRGB() const;
 
 
 	/**
 	/**
@@ -405,6 +400,9 @@ private:
 
 
 		uint32 enabledAttribArrays;
 		uint32 enabledAttribArrays;
 
 
+		Colorf constantColor;
+		Colorf lastConstantColor;
+
 		Rect viewport;
 		Rect viewport;
 		Rect scissor;
 		Rect scissor;