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

This commit is contained in:
rdb 2015-11-28 17:52:03 +01:00
parent bdf91e206d
commit 1628238222
4 changed files with 78 additions and 76 deletions

View File

@ -424,43 +424,44 @@ set_state_and_transform(const RenderState *target_rs,
altered |= Shader::SSD_projection; altered |= Shader::SSD_projection;
} }
if (_state_rs != target_rs) { if (_state_rs.was_deleted() || _state_rs == (const RenderState *)NULL) {
if (_state_rs == NULL) { // Reset all of the state.
// We haven't set any state yet. altered |= Shader::SSD_general;
altered |= Shader::SSD_general; _state_rs = target_rs;
} else {
if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) != } else if (_state_rs != target_rs) {
target_rs->get_attrib(ColorAttrib::get_class_slot())) { // The state has changed since last time.
altered |= Shader::SSD_color; if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) !=
} target_rs->get_attrib(ColorAttrib::get_class_slot())) {
if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) != altered |= Shader::SSD_color;
target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) { }
altered |= Shader::SSD_colorscale; if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) !=
} target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) {
if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) != altered |= Shader::SSD_colorscale;
target_rs->get_attrib(MaterialAttrib::get_class_slot())) { }
altered |= Shader::SSD_material; if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) !=
} target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) != altered |= Shader::SSD_material;
target_rs->get_attrib(ShaderAttrib::get_class_slot())) { }
altered |= Shader::SSD_shaderinputs; if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) !=
} target_rs->get_attrib(ShaderAttrib::get_class_slot())) {
if (_state_rs->get_attrib(FogAttrib::get_class_slot()) != altered |= Shader::SSD_shaderinputs;
target_rs->get_attrib(FogAttrib::get_class_slot())) { }
altered |= Shader::SSD_fog; if (_state_rs->get_attrib(FogAttrib::get_class_slot()) !=
} target_rs->get_attrib(FogAttrib::get_class_slot())) {
if (_state_rs->get_attrib(LightAttrib::get_class_slot()) != altered |= Shader::SSD_fog;
target_rs->get_attrib(LightAttrib::get_class_slot())) { }
altered |= Shader::SSD_light; if (_state_rs->get_attrib(LightAttrib::get_class_slot()) !=
} target_rs->get_attrib(LightAttrib::get_class_slot())) {
if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) != altered |= Shader::SSD_light;
target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) { }
altered |= Shader::SSD_clip_planes; if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) !=
} target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) {
if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) != altered |= Shader::SSD_clip_planes;
target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) { }
altered |= Shader::SSD_tex_matrix; 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; _state_rs = target_rs;
} }

View File

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

View File

@ -1613,43 +1613,44 @@ set_state_and_transform(const RenderState *target_rs,
altered |= Shader::SSD_projection; altered |= Shader::SSD_projection;
} }
if (_state_rs != target_rs) { if (_state_rs.was_deleted() || _state_rs == (const RenderState *)NULL) {
if (_state_rs == NULL) { // Reset all of the state.
// We haven't set any state yet. altered |= Shader::SSD_general;
altered |= Shader::SSD_general; _state_rs = target_rs;
} else {
if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) != } else if (_state_rs != target_rs) {
target_rs->get_attrib(ColorAttrib::get_class_slot())) { // The state has changed since last time.
altered |= Shader::SSD_color; if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) !=
} target_rs->get_attrib(ColorAttrib::get_class_slot())) {
if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) != altered |= Shader::SSD_color;
target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) { }
altered |= Shader::SSD_colorscale; if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) !=
} target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) {
if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) != altered |= Shader::SSD_colorscale;
target_rs->get_attrib(MaterialAttrib::get_class_slot())) { }
altered |= Shader::SSD_material; if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) !=
} target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) != altered |= Shader::SSD_material;
target_rs->get_attrib(ShaderAttrib::get_class_slot())) { }
altered |= Shader::SSD_shaderinputs; if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) !=
} target_rs->get_attrib(ShaderAttrib::get_class_slot())) {
if (_state_rs->get_attrib(FogAttrib::get_class_slot()) != altered |= Shader::SSD_shaderinputs;
target_rs->get_attrib(FogAttrib::get_class_slot())) { }
altered |= Shader::SSD_fog; if (_state_rs->get_attrib(FogAttrib::get_class_slot()) !=
} target_rs->get_attrib(FogAttrib::get_class_slot())) {
if (_state_rs->get_attrib(LightAttrib::get_class_slot()) != altered |= Shader::SSD_fog;
target_rs->get_attrib(LightAttrib::get_class_slot())) { }
altered |= Shader::SSD_light; if (_state_rs->get_attrib(LightAttrib::get_class_slot()) !=
} target_rs->get_attrib(LightAttrib::get_class_slot())) {
if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) != altered |= Shader::SSD_light;
target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) { }
altered |= Shader::SSD_clip_planes; if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) !=
} target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) {
if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) != altered |= Shader::SSD_clip_planes;
target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) { }
altered |= Shader::SSD_tex_matrix; 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; _state_rs = target_rs;
} }

View File

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