diff --git a/Outputs/CRT/Internals/Shaders/Shader.cpp b/Outputs/CRT/Internals/Shaders/Shader.cpp index 8d8a01677..4b76d3627 100644 --- a/Outputs/CRT/Internals/Shaders/Shader.cpp +++ b/Outputs/CRT/Internals/Shaders/Shader.cpp @@ -13,6 +13,10 @@ using namespace OpenGL; +namespace { + Shader *bound_shader = nullptr; +} + GLuint Shader::compile_shader(const char *source, GLenum type) { GLuint shader = glCreateShader(type); @@ -80,12 +84,24 @@ Shader::Shader(const char *vertex_shader, const char *fragment_shader, const Att Shader::~Shader() { + if(bound_shader == this) Shader::unbind(); glDeleteProgram(_shader_program); } void Shader::bind() { - glUseProgram(_shader_program); + if(bound_shader != this) + { + glUseProgram(_shader_program); + bound_shader = this; + } + else printf("-"); +} + +void Shader::unbind() +{ + bound_shader = nullptr; + glUseProgram(0); } GLint Shader::get_attrib_location(const GLchar *name) diff --git a/Outputs/CRT/Internals/Shaders/Shader.hpp b/Outputs/CRT/Internals/Shaders/Shader.hpp index 5a4dc4117..42ca1a099 100644 --- a/Outputs/CRT/Internals/Shaders/Shader.hpp +++ b/Outputs/CRT/Internals/Shaders/Shader.hpp @@ -41,10 +41,17 @@ public: ~Shader(); /*! - Performs an @c glUseProgram to make this the active shader. + Performs an @c glUseProgram to make this the active shader unless: + (i) it was the previous shader bound; and + (ii) no calls have been received to unbind in the interim. */ void bind(); + /*! + Unbinds the current instance of Shader, if one is bound. + */ + static void unbind(); + /*! Performs a @c glGetAttribLocation call. @param name The name of the attribute to locate.