From 1628238222057a4671efda4948f91b6e31a40245 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 28 Nov 2015 17:52:03 +0100 Subject: [PATCH] Fix circular reference in shader context preventing shader states from being cleared --- panda/src/glstuff/glCgShaderContext_src.cxx | 75 +++++++++++---------- panda/src/glstuff/glCgShaderContext_src.h | 2 +- panda/src/glstuff/glShaderContext_src.cxx | 75 +++++++++++---------- panda/src/glstuff/glShaderContext_src.h | 2 +- 4 files changed, 78 insertions(+), 76 deletions(-) diff --git a/panda/src/glstuff/glCgShaderContext_src.cxx b/panda/src/glstuff/glCgShaderContext_src.cxx index 167d7ed0d8..e861703f5b 100644 --- a/panda/src/glstuff/glCgShaderContext_src.cxx +++ b/panda/src/glstuff/glCgShaderContext_src.cxx @@ -424,43 +424,44 @@ set_state_and_transform(const RenderState *target_rs, altered |= Shader::SSD_projection; } - if (_state_rs != target_rs) { - if (_state_rs == NULL) { - // We haven't set any state yet. - altered |= Shader::SSD_general; - } else { - if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) != - target_rs->get_attrib(ColorAttrib::get_class_slot())) { - altered |= Shader::SSD_color; - } - if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) != - target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) { - altered |= Shader::SSD_colorscale; - } - if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) != - target_rs->get_attrib(MaterialAttrib::get_class_slot())) { - altered |= Shader::SSD_material; - } - if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) != - target_rs->get_attrib(ShaderAttrib::get_class_slot())) { - altered |= Shader::SSD_shaderinputs; - } - if (_state_rs->get_attrib(FogAttrib::get_class_slot()) != - target_rs->get_attrib(FogAttrib::get_class_slot())) { - altered |= Shader::SSD_fog; - } - if (_state_rs->get_attrib(LightAttrib::get_class_slot()) != - target_rs->get_attrib(LightAttrib::get_class_slot())) { - altered |= Shader::SSD_light; - } - if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) != - target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) { - altered |= Shader::SSD_clip_planes; - } - if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) != - target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) { - altered |= Shader::SSD_tex_matrix; - } + if (_state_rs.was_deleted() || _state_rs == (const RenderState *)NULL) { + // Reset all of the state. + altered |= Shader::SSD_general; + _state_rs = target_rs; + + } else if (_state_rs != target_rs) { + // The state has changed since last time. + if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) != + target_rs->get_attrib(ColorAttrib::get_class_slot())) { + altered |= Shader::SSD_color; + } + if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) != + target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) { + altered |= Shader::SSD_colorscale; + } + if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) != + target_rs->get_attrib(MaterialAttrib::get_class_slot())) { + altered |= Shader::SSD_material; + } + if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) != + target_rs->get_attrib(ShaderAttrib::get_class_slot())) { + altered |= Shader::SSD_shaderinputs; + } + if (_state_rs->get_attrib(FogAttrib::get_class_slot()) != + target_rs->get_attrib(FogAttrib::get_class_slot())) { + altered |= Shader::SSD_fog; + } + if (_state_rs->get_attrib(LightAttrib::get_class_slot()) != + target_rs->get_attrib(LightAttrib::get_class_slot())) { + altered |= Shader::SSD_light; + } + if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) != + target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) { + altered |= Shader::SSD_clip_planes; + } + if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) != + target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) { + altered |= Shader::SSD_tex_matrix; } _state_rs = target_rs; } diff --git a/panda/src/glstuff/glCgShaderContext_src.h b/panda/src/glstuff/glCgShaderContext_src.h index ddf7a351a1..5331a7808c 100644 --- a/panda/src/glstuff/glCgShaderContext_src.h +++ b/panda/src/glstuff/glCgShaderContext_src.h @@ -77,7 +77,7 @@ private: pvector _cg_parameter_map; - CPT(RenderState) _state_rs; + WCPT(RenderState) _state_rs; CPT(TransformState) _modelview_transform; CPT(TransformState) _projection_transform; GLint _frame_number; diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 08ef11b2a5..9bd2fd73ef 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -1613,43 +1613,44 @@ set_state_and_transform(const RenderState *target_rs, altered |= Shader::SSD_projection; } - if (_state_rs != target_rs) { - if (_state_rs == NULL) { - // We haven't set any state yet. - altered |= Shader::SSD_general; - } else { - if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) != - target_rs->get_attrib(ColorAttrib::get_class_slot())) { - altered |= Shader::SSD_color; - } - if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) != - target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) { - altered |= Shader::SSD_colorscale; - } - if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) != - target_rs->get_attrib(MaterialAttrib::get_class_slot())) { - altered |= Shader::SSD_material; - } - if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) != - target_rs->get_attrib(ShaderAttrib::get_class_slot())) { - altered |= Shader::SSD_shaderinputs; - } - if (_state_rs->get_attrib(FogAttrib::get_class_slot()) != - target_rs->get_attrib(FogAttrib::get_class_slot())) { - altered |= Shader::SSD_fog; - } - if (_state_rs->get_attrib(LightAttrib::get_class_slot()) != - target_rs->get_attrib(LightAttrib::get_class_slot())) { - altered |= Shader::SSD_light; - } - if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) != - target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) { - altered |= Shader::SSD_clip_planes; - } - if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) != - target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) { - altered |= Shader::SSD_tex_matrix; - } + if (_state_rs.was_deleted() || _state_rs == (const RenderState *)NULL) { + // Reset all of the state. + altered |= Shader::SSD_general; + _state_rs = target_rs; + + } else if (_state_rs != target_rs) { + // The state has changed since last time. + if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) != + target_rs->get_attrib(ColorAttrib::get_class_slot())) { + altered |= Shader::SSD_color; + } + if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) != + target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) { + altered |= Shader::SSD_colorscale; + } + if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) != + target_rs->get_attrib(MaterialAttrib::get_class_slot())) { + altered |= Shader::SSD_material; + } + if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) != + target_rs->get_attrib(ShaderAttrib::get_class_slot())) { + altered |= Shader::SSD_shaderinputs; + } + if (_state_rs->get_attrib(FogAttrib::get_class_slot()) != + target_rs->get_attrib(FogAttrib::get_class_slot())) { + altered |= Shader::SSD_fog; + } + if (_state_rs->get_attrib(LightAttrib::get_class_slot()) != + target_rs->get_attrib(LightAttrib::get_class_slot())) { + altered |= Shader::SSD_light; + } + if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) != + target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) { + altered |= Shader::SSD_clip_planes; + } + if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) != + target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) { + altered |= Shader::SSD_tex_matrix; } _state_rs = target_rs; } diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index eb4e2df24f..fe94821217 100644 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -69,7 +69,7 @@ private: typedef pvector GLSLShaders; GLSLShaders _glsl_shaders; - CPT(RenderState) _state_rs; + WCPT(RenderState) _state_rs; CPT(TransformState) _modelview_transform; CPT(TransformState) _projection_transform;