Browse Source

Fix bug when the same Cg shader is compiled for two different GSGs

rdb 10 years ago
parent
commit
11437c5afd

+ 13 - 11
panda/src/glstuff/glCgShaderContext_src.cxx

@@ -132,12 +132,14 @@ CLP(CgShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderConte
   //
   // We use positive indices to indicate generic vertex attributes, and negative
   // indices to indicate conventional vertex attributes (ie. glVertexPointer).
-  int nvarying = _shader->_var_spec.size();
-  for (int i = 0; i < nvarying; ++i) {
-    Shader::ShaderVarSpec &bind = _shader->_var_spec[i];
+  size_t nvarying = _shader->_var_spec.size();
+  _attributes.resize(nvarying);
+
+  for (size_t i = 0; i < nvarying; ++i) {
+    const Shader::ShaderVarSpec &bind = _shader->_var_spec[i];
     CGparameter p = _cg_parameter_map[i];
     if (p == 0) {
-      bind._id._seqno = CA_unknown;
+      _attributes[i] = CA_unknown;
       continue;
     }
 
@@ -312,8 +314,7 @@ CLP(CgShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderConte
     }
 #endif
 
-    // Abuse the seqno field to store the GLSL attribute location.
-    bind._id._seqno = loc;
+    _attributes[i] = loc;
   }
 
   _glgsg->report_my_gl_errors();
@@ -707,6 +708,7 @@ issue_parameters(int altered) {
     }
   }
 
+  cg_report_errors();
   _glgsg->report_my_gl_errors();
 }
 
@@ -773,8 +775,8 @@ disable_shader_vertex_arrays() {
     return;
   }
 
-  for (int i = 0; i < (int)_shader->_var_spec.size(); ++i) {
-    GLint p = _shader->_var_spec[i]._id._seqno;
+  for (size_t i = 0; i < _shader->_var_spec.size(); ++i) {
+    GLint p = _attributes[i];
 
     if (p >= 0) {
       _glgsg->_glDisableVertexAttribArray(p);
@@ -843,8 +845,8 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
     const GeomVertexArrayDataHandle *array_reader;
     Geom::NumericType numeric_type;
     int start, stride, num_values;
-    int nvarying = _shader->_var_spec.size();
-    for (int i = 0; i < nvarying; ++i) {
+    size_t nvarying = _shader->_var_spec.size();
+    for (size_t i = 0; i < nvarying; ++i) {
       const Shader::ShaderVarSpec &bind = _shader->_var_spec[i];
       InternalName *name = bind._name;
       int texslot = bind._append_uv;
@@ -858,7 +860,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
           name = name->append(texname->get_basename());
         }
       }
-      GLint p = bind._id._seqno;
+      GLint p = _attributes[i];
 
       // Don't apply vertex colors if they are disabled with a ColorAttrib.
       int num_elements, element_stride, divisor;

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

@@ -68,6 +68,7 @@ private:
   CGprogram _cg_program;
   GLuint _glsl_program;
 
+  pvector<GLint> _attributes;
   GLint _color_attrib_index;
   CGparameter _transform_table_param;
   CGparameter _slider_table_param;

+ 24 - 8
panda/src/gobj/shader.cxx

@@ -2041,10 +2041,10 @@ cg_compile_for(const ShaderCaps &caps, CGcontext context,
   combined_program = cgCombinePrograms(programs.size(), &programs[0]);
 
   // Build a parameter map.
-  int n_mat = (int)_mat_spec.size();
-  int n_tex = (int)_tex_spec.size();
-  int n_var = (int)_var_spec.size();
-  int n_ptr = (int)_ptr_spec.size();
+  size_t n_mat = _mat_spec.size();
+  size_t n_tex = _tex_spec.size();
+  size_t n_var = _var_spec.size();
+  size_t n_ptr = _ptr_spec.size();
 
   map.resize(n_mat + n_tex + n_var + n_ptr);
 
@@ -2057,12 +2057,20 @@ cg_compile_for(const ShaderCaps &caps, CGcontext context,
     programs_by_type[cgGetProgramDomain(program)] = program;
   }
 
-  for (int i = 0; i < n_mat; ++i) {
+  for (size_t i = 0; i < n_mat; ++i) {
     const ShaderArgId &id = _mat_spec[i]._id;
     map[id._seqno] = cgGetNamedParameter(programs_by_type[id._type], id._name.c_str());
+
+    if (shader_cat.is_debug()) {
+      const char *resource = cgGetParameterResourceName(map[id._seqno]);
+      if (resource != NULL) {
+        shader_cat.debug() << "Uniform parameter " << id._name
+                           << " is bound to resource " << resource << "\n";
+      }
+    }
   }
 
-  for (int i = 0; i < n_tex; ++i) {
+  for (size_t i = 0; i < n_tex; ++i) {
     const ShaderArgId &id = _tex_spec[i]._id;
     CGparameter p = cgGetNamedParameter(programs_by_type[id._type], id._name.c_str());
 
@@ -2076,7 +2084,7 @@ cg_compile_for(const ShaderCaps &caps, CGcontext context,
     map[id._seqno] = p;
   }
 
-  for (int i = 0; i < n_var; ++i) {
+  for (size_t i = 0; i < n_var; ++i) {
     const ShaderArgId &id = _var_spec[i]._id;
     CGparameter p = cgGetNamedParameter(programs_by_type[id._type], id._name.c_str());
 
@@ -2097,9 +2105,17 @@ cg_compile_for(const ShaderCaps &caps, CGcontext context,
     map[id._seqno] = p;
   }
 
-  for (int i = 0; i < n_ptr; ++i) {
+  for (size_t i = 0; i < n_ptr; ++i) {
     const ShaderArgId &id = _ptr_spec[i]._id;
     map[id._seqno] = cgGetNamedParameter(programs_by_type[id._type], id._name.c_str());
+
+    if (shader_cat.is_debug()) {
+      const char *resource = cgGetParameterResourceName(map[id._seqno]);
+      if (resource != NULL) {
+        shader_cat.debug() << "Uniform ptr parameter " << id._name
+                           << " is bound to resource " << resource << "\n";
+      }
+    }
   }
 
   // Transfer ownership of the compiled shader.