diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp index 2ba98f068..8af017de6 100644 --- a/src/modules/graphics/opengl/OpenGL.cpp +++ b/src/modules/graphics/opengl/OpenGL.cpp @@ -331,7 +331,7 @@ void OpenGL::prepareDraw() Matrix tp_matrix(curproj * curxform); shader->sendBuiltinMatrix(Shader::BUILTIN_TRANSFORM_PROJECTION_MATRIX, 4, tp_matrix.getElements(), 1); - shader->sendBuiltinFloat(Shader::BUILTIN_POINT_SIZE, 1, &state.pointSize, 1); + shader->checkSetPointSize(state.pointSize); } else if (GLAD_VERSION_1_0) { diff --git a/src/modules/graphics/opengl/Shader.cpp b/src/modules/graphics/opengl/Shader.cpp index 95a37376c..f89701f37 100644 --- a/src/modules/graphics/opengl/Shader.cpp +++ b/src/modules/graphics/opengl/Shader.cpp @@ -75,6 +75,7 @@ Shader::Shader(const ShaderSource &source) , builtinAttributes() , lastCanvas((Canvas *) -1) , lastViewport() + , lastPointSize(0.0f) { if (source.vertex.empty() && source.pixel.empty()) throw love::Exception("Cannot create shader: no source code!"); @@ -216,6 +217,8 @@ bool Shader::loadVolatile() lastCanvas = (Canvas *) -1; lastViewport = OpenGL::Viewport(); + lastPointSize = 0.0f; + // zero out active texture list activeTexUnits.clear(); activeTexUnits.insert(activeTexUnits.begin(), gl.getMaxTextureUnits() - 1, 0); @@ -709,6 +712,16 @@ void Shader::checkSetScreenParams() lastViewport = view; } +void Shader::checkSetPointSize(float size) +{ + if (size == lastPointSize) + return; + + sendBuiltinFloat(BUILTIN_POINT_SIZE, 1, &size, 1); + + lastPointSize = size; +} + const std::map &Shader::getBoundRetainables() const { return boundRetainables; diff --git a/src/modules/graphics/opengl/Shader.h b/src/modules/graphics/opengl/Shader.h index 8b6dc1102..729973042 100644 --- a/src/modules/graphics/opengl/Shader.h +++ b/src/modules/graphics/opengl/Shader.h @@ -182,6 +182,7 @@ public: bool sendBuiltinMatrix(BuiltinUniform builtin, int size, const GLfloat *m, int count); bool sendBuiltinFloat(BuiltinUniform builtin, int size, const GLfloat *m, int count); void checkSetScreenParams(); + void checkSetPointSize(float size); const std::map &getBoundRetainables() const; @@ -250,6 +251,8 @@ private: Canvas *lastCanvas; OpenGL::Viewport lastViewport; + float lastPointSize; + // Counts total number of textures bound to each texture unit in all shaders static std::vector textureCounters;