Browse Source

Fix circular reference in shader context preventing shader states from being cleared

rdb 10 years ago
parent
commit
1628238222

+ 38 - 37
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;
   }

+ 1 - 1
panda/src/glstuff/glCgShaderContext_src.h

@@ -77,7 +77,7 @@ private:
 
   pvector<CGparameter> _cg_parameter_map;
 
-  CPT(RenderState) _state_rs;
+  WCPT(RenderState) _state_rs;
   CPT(TransformState) _modelview_transform;
   CPT(TransformState) _projection_transform;
   GLint _frame_number;

+ 38 - 37
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;
   }

+ 1 - 1
panda/src/glstuff/glShaderContext_src.h

@@ -69,7 +69,7 @@ private:
   typedef pvector<GLuint> GLSLShaders;
   GLSLShaders _glsl_shaders;
 
-  CPT(RenderState) _state_rs;
+  WCPT(RenderState) _state_rs;
   CPT(TransformState) _modelview_transform;
   CPT(TransformState) _projection_transform;