From 548293e100926bf6643324d1ccf700c36bee8df3 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Mon, 2 Jan 2017 01:02:15 -0400 Subject: [PATCH] =?UTF-8?q?Don=E2=80=99t=20call=20unnecessary=20OpenGL=20A?= =?UTF-8?q?PIs=20in=20love.graphics.setColor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --HG-- branch : minor --- src/modules/graphics/Graphics.h | 1 - src/modules/graphics/opengl/Graphics.cpp | 11 ++++------- src/modules/graphics/opengl/OpenGL.cpp | 21 +++++++++++++++++++++ src/modules/graphics/opengl/OpenGL.h | 22 ++++++++++------------ 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index cb8477516..a6b9000bc 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -720,7 +720,6 @@ protected: struct DisplayState { 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); BlendMode blendMode = BLEND_ALPHA; diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index c1029b9c6..9c94fcdb6 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -417,8 +417,9 @@ void Graphics::flushStreamDraws() break; } + Colorf nc = gl.getConstantColor(); 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(); @@ -445,10 +446,7 @@ void Graphics::flushStreamDraws() popTransform(); 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.indexCount = 0; @@ -1236,10 +1234,9 @@ void Graphics::setColor(Colorf c) Colorf nc = c; gammaCorrectColor(nc); - glVertexAttrib4f(ATTRIB_CONSTANTCOLOR, nc.r, nc.g, nc.b, nc.a); + gl.setConstantColor(nc); states.back().color = c; - states.back().gammaCorrectedColor = nc; } void Graphics::setColorMask(ColorMask mask) diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp index ab706708d..6d44afff1 100644 --- a/src/modules/graphics/opengl/OpenGL.cpp +++ b/src/modules/graphics/opengl/OpenGL.cpp @@ -76,6 +76,10 @@ OpenGL::OpenGL() , vendor(VENDOR_UNKNOWN) , state() { + state.constantColor = Colorf(1.0f, 1.0f, 1.0f, 1.0f); + + float nan = std::numeric_limits::quiet_NaN(); + state.lastConstantColor = Colorf(nan, nan, nan, nan); } bool OpenGL::initContext() @@ -337,6 +341,13 @@ void OpenGL::prepareDraw() // Make sure the active shader's love-provided uniforms are up to date. if (Shader::current != nullptr) ((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) @@ -456,6 +467,16 @@ void OpenGL::setScissor(const Rect &v, bool canvasActive) 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) { if (GLAD_VERSION_1_0) diff --git a/src/modules/graphics/opengl/OpenGL.h b/src/modules/graphics/opengl/OpenGL.h index c7bd197b0..1b3ee34fa 100644 --- a/src/modules/graphics/opengl/OpenGL.h +++ b/src/modules/graphics/opengl/OpenGL.h @@ -226,10 +226,6 @@ public: * The y-coordinate starts at the top. **/ void setViewport(const Rect &v); - - /** - * Gets the current OpenGL rendering viewport rectangle. - **/ Rect getViewport() const; /** @@ -238,24 +234,23 @@ public: **/ void setScissor(const Rect &v, bool canvasActive); + /** + * Sets the constant color (vertex attribute). This may be applied + * internally at draw-time. + **/ + void setConstantColor(const Colorf &color); + const Colorf &getConstantColor() const; + /** * Sets the global point size. **/ void setPointSize(float size); - - /** - * Gets the global point size. - **/ float getPointSize() const; /** * Calls glEnable/glDisable(GL_FRAMEBUFFER_SRGB). **/ void setFramebufferSRGB(bool enable); - - /** - * Equivalent to glIsEnabled(GL_FRAMEBUFFER_SRGB). - **/ bool hasFramebufferSRGB() const; /** @@ -405,6 +400,9 @@ private: uint32 enabledAttribArrays; + Colorf constantColor; + Colorf lastConstantColor; + Rect viewport; Rect scissor;