Mesa (master): progs/util: added more shader utility functions

Brian Paul brianp at kemper.freedesktop.org
Wed Aug 12 23:31:57 UTC 2009


Module: Mesa
Branch: master
Commit: 378bff0eddf004d131a4c83194fb3e83492c4c37
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=378bff0eddf004d131a4c83194fb3e83492c4c37

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Aug 12 13:50:26 2009 -0600

progs/util: added more shader utility functions

---

 progs/util/shaderutil.c |  197 ++++++++++++++++++++++++++++++++++++++++++----
 progs/util/shaderutil.h |   22 +++++-
 2 files changed, 200 insertions(+), 19 deletions(-)

diff --git a/progs/util/shaderutil.c b/progs/util/shaderutil.c
index 13b68d9..bd04ce5 100644
--- a/progs/util/shaderutil.c
+++ b/progs/util/shaderutil.c
@@ -9,21 +9,12 @@
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <GL/glew.h>
 #include <GL/glut.h>
 #include "shaderutil.h"
 
 
-static void
-Init(void)
-{
-   static GLboolean firstCall = GL_TRUE;
-   if (firstCall) {
-      firstCall = GL_FALSE;
-   }
-}
-
-
 GLboolean
 ShadersSupported(void)
 {
@@ -47,8 +38,6 @@ CompileShaderText(GLenum shaderType, const char *text)
    GLuint shader;
    GLint stat;
 
-   Init();
-
    shader = glCreateShader(shaderType);
    glShaderSource(shader, 1, (const GLchar **) &text, NULL);
    glCompileShader(shader);
@@ -79,9 +68,6 @@ CompileShaderFile(GLenum shaderType, const char *filename)
    GLuint shader;
    FILE *f;
 
-   Init();
-
-
    f = fopen(filename, "r");
    if (!f) {
       fprintf(stderr, "Unable to open shader file %s\n", filename);
@@ -144,9 +130,6 @@ InitUniforms(GLuint program, struct uniform_info uniforms[])
       uniforms[i].location
          = glGetUniformLocation(program, uniforms[i].name);
 
-      printf("Uniform %s location: %d\n", uniforms[i].name,
-             uniforms[i].location);
-
       switch (uniforms[i].size) {
       case 1:
          if (uniforms[i].type == GL_INT)
@@ -169,3 +152,181 @@ InitUniforms(GLuint program, struct uniform_info uniforms[])
       }
    }
 }
+
+
+/** Get list of uniforms used in the program */
+GLuint
+GetUniforms(GLuint program, struct uniform_info uniforms[])
+{
+   GLint n, max, i;
+
+   glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &n);
+   glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max);
+
+   for (i = 0; i < n; i++) {
+      GLint size, len;
+      GLenum type;
+      char name[100];
+
+      glGetActiveUniform(program, i, 100, &len, &size, &type, name);
+
+      uniforms[i].name = strdup(name);
+      switch (type) {
+      case GL_FLOAT:
+         size = 1;
+         type = GL_FLOAT;
+         break;
+      case GL_FLOAT_VEC2:
+         size = 2;
+         type = GL_FLOAT;
+         break;
+      case GL_FLOAT_VEC3:
+         size = 3;
+         type = GL_FLOAT;
+         break;
+      case GL_FLOAT_VEC4:
+         size = 4;
+         type = GL_FLOAT;
+         break;
+      case GL_INT:
+         size = 1;
+         type = GL_INT;
+         break;
+      case GL_INT_VEC2:
+         size = 2;
+         type = GL_INT;
+         break;
+      case GL_INT_VEC3:
+         size = 3;
+         type = GL_INT;
+         break;
+      case GL_INT_VEC4:
+         size = 4;
+         type = GL_INT;
+         break;
+      case GL_FLOAT_MAT3:
+         /* XXX fix me */
+         size = 3;
+         type = GL_FLOAT;
+         break;
+      case GL_FLOAT_MAT4:
+         /* XXX fix me */
+         size = 4;
+         type = GL_FLOAT;
+         break;
+      default:
+         abort();
+      }
+      uniforms[i].size = size;
+      uniforms[i].type = type;
+      uniforms[i].location = glGetUniformLocation(program, name);
+   }
+
+   uniforms[i].name = NULL; /* end of list */
+
+   return n;
+}
+
+
+void
+PrintUniforms(const struct uniform_info uniforms[])
+{
+   GLint i;
+
+   printf("Uniforms:\n");
+
+   for (i = 0; uniforms[i].name; i++) {
+      printf("  %d: %s size=%d type=0x%x loc=%d value=%g, %g, %g, %g\n",
+             i,
+             uniforms[i].name,
+             uniforms[i].size,
+             uniforms[i].type,
+             uniforms[i].location,
+             uniforms[i].value[0],
+             uniforms[i].value[1],
+             uniforms[i].value[2],
+             uniforms[i].value[3]);
+   }
+}
+
+
+/** Get list of attribs used in the program */
+GLuint
+GetAttribs(GLuint program, struct attrib_info attribs[])
+{
+   GLint n, max, i;
+
+   glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &n);
+   glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max);
+
+   for (i = 0; i < n; i++) {
+      GLint size, len;
+      GLenum type;
+      char name[100];
+
+      glGetActiveAttrib(program, i, 100, &len, &size, &type, name);
+
+      attribs[i].name = strdup(name);
+      switch (type) {
+      case GL_FLOAT:
+         size = 1;
+         type = GL_FLOAT;
+         break;
+      case GL_FLOAT_VEC2:
+         size = 2;
+         type = GL_FLOAT;
+         break;
+      case GL_FLOAT_VEC3:
+         size = 3;
+         type = GL_FLOAT;
+         break;
+      case GL_FLOAT_VEC4:
+         size = 4;
+         type = GL_FLOAT;
+         break;
+      case GL_INT:
+         size = 1;
+         type = GL_INT;
+         break;
+      case GL_INT_VEC2:
+         size = 2;
+         type = GL_INT;
+         break;
+      case GL_INT_VEC3:
+         size = 3;
+         type = GL_INT;
+         break;
+      case GL_INT_VEC4:
+         size = 4;
+         type = GL_INT;
+         break;
+      default:
+         abort();
+      }
+      attribs[i].size = size;
+      attribs[i].type = type;
+      attribs[i].location = glGetAttribLocation(program, name);
+   }
+
+   attribs[i].name = NULL; /* end of list */
+
+   return n;
+}
+
+
+void
+PrintAttribs(const struct attrib_info attribs[])
+{
+   GLint i;
+
+   printf("Attribs:\n");
+
+   for (i = 0; attribs[i].name; i++) {
+      printf("  %d: %s size=%d type=0x%x loc=%d\n",
+             i,
+             attribs[i].name,
+             attribs[i].size,
+             attribs[i].type,
+             attribs[i].location);
+   }
+}
diff --git a/progs/util/shaderutil.h b/progs/util/shaderutil.h
index cfb8c1f..607ed28 100644
--- a/progs/util/shaderutil.h
+++ b/progs/util/shaderutil.h
@@ -6,7 +6,7 @@
 struct uniform_info
 {
    const char *name;
-   GLuint size;
+   GLuint size;  /**< number of value[] elements: 1, 2, 3 or 4 */
    GLenum type;  /**< GL_FLOAT or GL_INT */
    GLfloat value[4];
    GLint location;  /**< filled in by InitUniforms() */
@@ -15,6 +15,15 @@ struct uniform_info
 #define END_OF_UNIFORMS   { NULL, 0, GL_NONE, { 0, 0, 0, 0 }, -1 }
 
 
+struct attrib_info
+{
+   const char *name;
+   GLuint size;  /**< number of value[] elements: 1, 2, 3 or 4 */
+   GLenum type;  /**< GL_FLOAT or GL_INT */
+   GLint location;
+};
+
+
 extern GLboolean
 ShadersSupported(void);
 
@@ -30,5 +39,16 @@ LinkShaders(GLuint vertShader, GLuint fragShader);
 extern void
 InitUniforms(GLuint program, struct uniform_info uniforms[]);
 
+extern GLuint
+GetUniforms(GLuint program, struct uniform_info uniforms[]);
+
+extern void
+PrintUniforms(const struct uniform_info uniforms[]);
+
+extern GLuint
+GetAttribs(GLuint program, struct attrib_info attribs[]);
+
+extern void
+PrintAttribs(const struct attrib_info attribs[]);
 
 #endif /* SHADER_UTIL_H */




More information about the mesa-commit mailing list