From 8fac08809afb7013323fa80735b1c616cd43e554 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 15 Mar 2020 19:24:49 -0300 Subject: [PATCH] Eliminate redundant glActiveTexture calls when shaders are used. The redundant calls were introduced with the previous commit. --- src/modules/graphics/opengl/OpenGL.cpp | 8 ++++---- src/modules/graphics/opengl/OpenGL.h | 5 +++-- src/modules/graphics/opengl/Shader.cpp | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp index 83d2fe911..fa0525ecc 100644 --- a/src/modules/graphics/opengl/OpenGL.cpp +++ b/src/modules/graphics/opengl/OpenGL.cpp @@ -977,7 +977,7 @@ void OpenGL::setTextureUnit(int textureunit) state.curTextureUnit = textureunit; } -void OpenGL::bindTextureToUnit(TextureType target, GLuint texture, int textureunit, bool restoreprev) +void OpenGL::bindTextureToUnit(TextureType target, GLuint texture, int textureunit, bool restoreprev, bool bindforedit) { if (texture != state.boundTextures[target][textureunit]) { @@ -993,14 +993,14 @@ void OpenGL::bindTextureToUnit(TextureType target, GLuint texture, int textureun else state.curTextureUnit = textureunit; } - else if (!restoreprev && textureunit != state.curTextureUnit) + else if (bindforedit && !restoreprev && textureunit != state.curTextureUnit) { glActiveTexture(GL_TEXTURE0 + textureunit); state.curTextureUnit = textureunit; } } -void OpenGL::bindTextureToUnit(Texture *texture, int textureunit, bool restoreprev) +void OpenGL::bindTextureToUnit(Texture *texture, int textureunit, bool restoreprev, bool bindforedit) { TextureType textype = TEXTURE_2D; GLuint handle = 0; @@ -1022,7 +1022,7 @@ void OpenGL::bindTextureToUnit(Texture *texture, int textureunit, bool restorepr handle = getDefaultTexture(textype); } - bindTextureToUnit(textype, handle, textureunit, restoreprev); + bindTextureToUnit(textype, handle, textureunit, restoreprev, bindforedit); } void OpenGL::deleteTexture(GLuint texture) diff --git a/src/modules/graphics/opengl/OpenGL.h b/src/modules/graphics/opengl/OpenGL.h index b51cf35fe..e926459de 100644 --- a/src/modules/graphics/opengl/OpenGL.h +++ b/src/modules/graphics/opengl/OpenGL.h @@ -324,9 +324,10 @@ public: * * @param textureunit Index in the range of [0, maxtextureunits-1] * @param restoreprev Restore previously bound texture unit when done. + * @param bindforedit If false, the active texture unit may be left alone. **/ - void bindTextureToUnit(TextureType target, GLuint texture, int textureunit, bool restoreprev); - void bindTextureToUnit(Texture *texture, int textureunit, bool restoreprev); + void bindTextureToUnit(TextureType target, GLuint texture, int textureunit, bool restoreprev, bool bindforedit = true); + void bindTextureToUnit(Texture *texture, int textureunit, bool restoreprev, bool bindforedit = true); /** * Helper for deleting an OpenGL texture. diff --git a/src/modules/graphics/opengl/Shader.cpp b/src/modules/graphics/opengl/Shader.cpp index c528a8bb7..92c5358b6 100644 --- a/src/modules/graphics/opengl/Shader.cpp +++ b/src/modules/graphics/opengl/Shader.cpp @@ -451,7 +451,7 @@ void Shader::attach() { const TextureUnit &unit = textureUnits[i]; if (unit.active) - gl.bindTextureToUnit(unit.type, unit.texture, i, false); + gl.bindTextureToUnit(unit.type, unit.texture, i, false, false); } // send any pending uniforms to the shader program. @@ -647,7 +647,7 @@ void Shader::sendTextures(const UniformInfo *info, Texture **textures, int count int texunit = info->ints[i]; if (shaderactive) - gl.bindTextureToUnit(info->textureType, gltex, texunit, false); + gl.bindTextureToUnit(info->textureType, gltex, texunit, false, false); // Store texture id so it can be re-bound to the texture unit later. textureUnits[texunit].texture = gltex;