diff --git a/panda/src/glstuff/glCgShaderContext_src.cxx b/panda/src/glstuff/glCgShaderContext_src.cxx index 50e72f86a4..299ee1cab7 100644 --- a/panda/src/glstuff/glCgShaderContext_src.cxx +++ b/panda/src/glstuff/glCgShaderContext_src.cxx @@ -388,14 +388,17 @@ valid() { * all of the shader's input parameters. */ void CLP(CgShaderContext):: -bind() { +bind(GraphicsStateGuardian *gsg) { + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)gsg; + _glgsg = glgsg; + if (_cg_program != 0) { // Bind the shaders. cgGLEnableProgramProfiles(_cg_program); cgGLBindProgram(_cg_program); cg_report_errors(); - _glgsg->report_my_gl_errors(); + glgsg->report_my_gl_errors(); } } diff --git a/panda/src/glstuff/glCgShaderContext_src.h b/panda/src/glstuff/glCgShaderContext_src.h index a9b4157c6e..97c11fe253 100644 --- a/panda/src/glstuff/glCgShaderContext_src.h +++ b/panda/src/glstuff/glCgShaderContext_src.h @@ -34,7 +34,7 @@ public: ALLOC_DELETED_CHAIN(CLP(CgShaderContext)); bool valid(void) override; - void bind() override; + void bind(GraphicsStateGuardian *gsg) override; void unbind() override; void set_state_and_transform(const RenderState *state, diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 6ba7a5e01d..ba9372e45e 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -8717,7 +8717,7 @@ do_issue_shader() { // If it's a different type of shader, make sure to unbind the old. _current_shader_context->unbind(); } - context->bind(); + context->bind(this); _current_shader = shader; } diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 169ae1b670..9826fad4bb 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -416,7 +416,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext if (_glgsg->_current_shader_context == nullptr) { _glgsg->_glUseProgram(0); } else { - _glgsg->_current_shader_context->bind(); + _glgsg->_current_shader_context->bind(_glgsg); } _mat_part_cache = new LVecBase4f[_shader->cp_get_mat_cache_size()]; @@ -2192,15 +2192,18 @@ valid() { * all of the shader's input parameters. */ void CLP(ShaderContext):: -bind() { +bind(GraphicsStateGuardian *gsg) { + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)gsg; + _glgsg = glgsg; + if (!_validated) { - _glgsg->_glValidateProgram(_glsl_program); + glgsg->_glValidateProgram(_glsl_program); glsl_report_program_errors(_glsl_program, false); _validated = true; } if (!_shader->get_error_flag()) { - _glgsg->_glUseProgram(_glsl_program); + glgsg->_glUseProgram(_glsl_program); } if (GLCAT.is_spam()) { @@ -2208,7 +2211,7 @@ bind() { << _shader->get_filename() << "\n"; } - _glgsg->report_my_gl_errors(); + glgsg->report_my_gl_errors(); } /** diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index 3088170ec3..e65355e3a0 100644 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -42,7 +42,7 @@ public: bool get_sampler_texture_type(int &out, GLenum param_type); bool valid(void) override; - void bind() override; + void bind(GraphicsStateGuardian *gsg) override; void unbind() override; void set_state_and_transform(const RenderState *state, diff --git a/panda/src/gobj/shaderContext.h b/panda/src/gobj/shaderContext.h index a8d8add8ed..53fb69bce6 100644 --- a/panda/src/gobj/shaderContext.h +++ b/panda/src/gobj/shaderContext.h @@ -19,6 +19,8 @@ #include "savedContext.h" #include "shader.h" +class GraphicsStateGuardian; + /** * The ShaderContext is meant to contain the compiled version of a shader * string. ShaderContext is an abstract base class, there will be a subclass @@ -38,7 +40,7 @@ public: const TransformState *) {}; INLINE virtual bool valid() { return false; } - INLINE virtual void bind() {}; + INLINE virtual void bind(GraphicsStateGuardian *gsg) {}; INLINE virtual void unbind() {}; INLINE virtual void issue_parameters(int altered) {}; INLINE virtual void disable_shader_vertex_arrays() {};