Browse Source

Proper unbinding of GLSL matrix attribute arrays

rdb 11 years ago
parent
commit
3bf2a0f814
2 changed files with 26 additions and 2 deletions
  1. 25 2
      panda/src/glstuff/glShaderContext_src.cxx
  2. 1 0
      panda/src/gobj/shader.h

+ 25 - 2
panda/src/glstuff/glShaderContext_src.cxx

@@ -734,6 +734,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
       bind._id = arg_id;
       bind._id = arg_id;
       bind._name = NULL;
       bind._name = NULL;
       bind._append_uv = -1;
       bind._append_uv = -1;
+      bind._elements = 1;
 
 
       if (param_name.substr(0, 3) == "gl_") {
       if (param_name.substr(0, 3) == "gl_") {
         // Not all drivers return -1 in glGetAttribLocation
         // Not all drivers return -1 in glGetAttribLocation
@@ -792,6 +793,24 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
         GLCAT.error() << "Unrecognized vertex attrib '" << param_name << "'!\n";
         GLCAT.error() << "Unrecognized vertex attrib '" << param_name << "'!\n";
         continue;
         continue;
       }
       }
+
+      // Get the number of bind points.
+      switch (param_type) {
+      case GL_FLOAT_MAT3:
+      case GL_DOUBLE_MAT3:
+        bind._elements = 3 * param_size;
+        break;
+
+      case GL_FLOAT_MAT4:
+      case GL_DOUBLE_MAT4:
+        bind._elements = 4 * param_size;
+        break;
+
+      default:
+        bind._elements = param_size;
+        break;
+      }
+
       s->_var_spec.push_back(bind);
       s->_var_spec.push_back(bind);
     }
     }
   }
   }
@@ -1001,7 +1020,9 @@ disable_shader_vertex_arrays() {
     if (_glgsg->_supports_vertex_attrib_divisor) {
     if (_glgsg->_supports_vertex_attrib_divisor) {
       _glgsg->_glVertexAttribDivisor(p, 0);
       _glgsg->_glVertexAttribDivisor(p, 0);
     }
     }
-    _glgsg->_glDisableVertexAttribArray(p);
+    for (int i = 0; i < bind._elements; ++i) {
+      _glgsg->_glDisableVertexAttribArray(p + i);
+    }
   }
   }
 
 
   _glgsg->report_my_gl_errors();
   _glgsg->report_my_gl_errors();
@@ -1091,7 +1112,9 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
           client_pointer += element_stride;
           client_pointer += element_stride;
         }
         }
       } else {
       } else {
-        _glgsg->_glDisableVertexAttribArray(p);
+        for (int i = 0; i < bind._elements; ++i) {
+          _glgsg->_glDisableVertexAttribArray(p + i);
+        }
       }
       }
     }
     }
   }
   }

+ 1 - 0
panda/src/gobj/shader.h

@@ -359,6 +359,7 @@ public:
     ShaderArgId       _id;
     ShaderArgId       _id;
     PT(InternalName)  _name;
     PT(InternalName)  _name;
     int               _append_uv;
     int               _append_uv;
+    int               _elements;
     bool              _integer;
     bool              _integer;
   };
   };