Browse Source

Support for integer vertex attributes in GLSL

rdb 11 years ago
parent
commit
0ef51b8723

+ 7 - 1
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -1236,6 +1236,10 @@ reset() {
        get_extension_func("glValidateProgram");
        get_extension_func("glValidateProgram");
     _glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)
     _glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)
        get_extension_func("glVertexAttribPointer");
        get_extension_func("glVertexAttribPointer");
+    _glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)
+       get_extension_func("glVertexAttribIPointer");
+    _glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)
+       get_extension_func("glVertexAttribLPointer");
 
 
     if (_supports_geometry_shaders) {
     if (_supports_geometry_shaders) {
       _glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)
       _glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)
@@ -1287,6 +1291,8 @@ reset() {
   _glUniformMatrix4fv = glUniformMatrix4fv;
   _glUniformMatrix4fv = glUniformMatrix4fv;
   _glValidateProgram = glValidateProgram;
   _glValidateProgram = glValidateProgram;
   _glVertexAttribPointer = glVertexAttribPointer;
   _glVertexAttribPointer = glVertexAttribPointer;
+  _glVertexAttribIPointer = NULL;
+  _glVertexAttribLPointer = NULL;
 
 
   // We need to have a default shader to apply in case
   // We need to have a default shader to apply in case
   // something didn't happen to have a shader applied, or
   // something didn't happen to have a shader applied, or
@@ -3054,7 +3060,7 @@ update_standard_vertex_arrays(bool force) {
         return false;
         return false;
       }
       }
       glNormalPointer(get_numeric_type(numeric_type), stride,
       glNormalPointer(get_numeric_type(numeric_type), stride,
-                         client_pointer + start);
+                      client_pointer + start);
       glEnableClientState(GL_NORMAL_ARRAY);
       glEnableClientState(GL_NORMAL_ARRAY);
     } else {
     } else {
       glDisableClientState(GL_NORMAL_ARRAY);
       glDisableClientState(GL_NORMAL_ARRAY);

+ 4 - 0
panda/src/glstuff/glGraphicsStateGuardian_src.h

@@ -175,6 +175,8 @@ typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei coun
 typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
 typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
 typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
 typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
 #endif  // OPENGLES_1
 #endif  // OPENGLES_1
 #ifndef OPENGLES
 #ifndef OPENGLES
 typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
 typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
@@ -737,6 +739,8 @@ public:
   PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv;
   PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv;
   PFNGLVALIDATEPROGRAMPROC _glValidateProgram;
   PFNGLVALIDATEPROGRAMPROC _glValidateProgram;
   PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer;
   PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer;
+  PFNGLVERTEXATTRIBIPOINTERPROC _glVertexAttribIPointer;
+  PFNGLVERTEXATTRIBLPOINTERPROC _glVertexAttribLPointer;
 #endif  // OPENGLES_1
 #endif  // OPENGLES_1
 #ifndef OPENGLES
 #ifndef OPENGLES
   PFNGLPROGRAMPARAMETERIPROC _glProgramParameteri;
   PFNGLPROGRAMPARAMETERIPROC _glProgramParameteri;

+ 24 - 3
panda/src/glstuff/glShaderContext_src.cxx

@@ -728,6 +728,19 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
         noprefix = "";
         noprefix = "";
       }
       }
 
 
+      bind._integer = (param_type == GL_BOOL ||
+                       param_type == GL_BOOL_VEC2 ||
+                       param_type == GL_BOOL_VEC3 ||
+                       param_type == GL_BOOL_VEC4 ||
+                       param_type == GL_INT ||
+                       param_type == GL_INT_VEC2 ||
+                       param_type == GL_INT_VEC3 ||
+                       param_type == GL_INT_VEC4 ||
+                       param_type == GL_UNSIGNED_INT ||
+                       param_type == GL_UNSIGNED_INT_VEC2 ||
+                       param_type == GL_UNSIGNED_INT_VEC3 ||
+                       param_type == GL_UNSIGNED_INT_VEC4);
+
       if (noprefix.empty()) {
       if (noprefix.empty()) {
         // Arbitrarily named attribute.
         // Arbitrarily named attribute.
         bind._name = InternalName::make(param_name);
         bind._name = InternalName::make(param_name);
@@ -1002,8 +1015,10 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
     int nvarying = _shader->_var_spec.size();
     int nvarying = _shader->_var_spec.size();
 
 
     for (int i = 0; i < nvarying; ++i) {
     for (int i = 0; i < nvarying; ++i) {
-      InternalName *name = _shader->_var_spec[i]._name;
-      int texslot = _shader->_var_spec[i]._append_uv;
+      const Shader::ShaderVarSpec &bind = _shader->_var_spec[i];
+      InternalName *name = bind._name;
+      int texslot = bind._append_uv;
+
       if (texslot >= 0 && texslot < _glgsg->_state_texture->get_num_on_stages()) {
       if (texslot >= 0 && texslot < _glgsg->_state_texture->get_num_on_stages()) {
         TextureStage *stage = _glgsg->_state_texture->get_on_stage(texslot);
         TextureStage *stage = _glgsg->_state_texture->get_on_stage(texslot);
         InternalName *texname = stage->get_texcoord_name();
         InternalName *texname = stage->get_texcoord_name();
@@ -1014,7 +1029,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
           name = name->append(texname->get_basename());
           name = name->append(texname->get_basename());
         }
         }
       }
       }
-      const GLint p = _glsl_parameter_map[_shader->_var_spec[i]._id._seqno];
+      const GLint p = _glsl_parameter_map[bind._id._seqno];
 
 
       if (_glgsg->_data_reader->get_array_info(name,
       if (_glgsg->_data_reader->get_array_info(name,
                                                array_reader, num_values, numeric_type,
                                                array_reader, num_values, numeric_type,
@@ -1026,6 +1041,12 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
 
 
         _glgsg->_glEnableVertexAttribArray(p);
         _glgsg->_glEnableVertexAttribArray(p);
 
 
+#ifndef OPENGLES
+        if (bind._integer) {
+          _glgsg->_glVertexAttribIPointer(p, num_values, _glgsg->get_numeric_type(numeric_type),
+                                          stride, client_pointer + start);
+        } else
+#endif
         if (numeric_type == GeomEnums::NT_packed_dabc) {
         if (numeric_type == GeomEnums::NT_packed_dabc) {
           _glgsg->_glVertexAttribPointer(p, GL_BGRA, GL_UNSIGNED_BYTE,
           _glgsg->_glVertexAttribPointer(p, GL_BGRA, GL_UNSIGNED_BYTE,
                                          GL_TRUE, stride, client_pointer + start);
                                          GL_TRUE, stride, client_pointer + start);

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

@@ -587,6 +587,7 @@ compile_parameter(const ShaderArgId        &arg_id,
     ShaderVarSpec bind;
     ShaderVarSpec bind;
     bind._id = arg_id;
     bind._id = arg_id;
     bind._append_uv = -1;
     bind._append_uv = -1;
+    bind._integer = false;
 
 
     if (pieces.size() == 2) {
     if (pieces.size() == 2) {
       if (pieces[1] == "position") {
       if (pieces[1] == "position") {

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

@@ -355,6 +355,7 @@ public:
     ShaderArgId       _id;
     ShaderArgId       _id;
     PT(InternalName)  _name;
     PT(InternalName)  _name;
     int               _append_uv;
     int               _append_uv;
+    bool              _integer;
   };
   };
 
 
   struct ShaderPtrSpec {
   struct ShaderPtrSpec {