]> git.cworth.org Git - apitrace/commitdiff
Handle moe uniform types and sizes.
authorJosé Fonseca <jfonseca@vmware.com>
Tue, 19 Jul 2011 21:35:40 +0000 (14:35 -0700)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 19 Jul 2011 21:35:40 +0000 (14:35 -0700)
glsize.hpp
glstate.cpp

index 8e1846a96a0ad17f48797ff119906e4e1556330b..a58b41e9a22f8703a585c5c118c844d48fdd660e 100644 (file)
@@ -68,6 +68,212 @@ __gl_type_size(GLenum type)
     }
 }
 
+static inline void
+__gl_uniform_size(GLenum type, GLenum &elemType, GLint &numElems) {
+    switch (type) {
+    case GL_FLOAT:
+        elemType = GL_FLOAT;
+        numElems = 1;
+        break;
+    case GL_FLOAT_VEC2:
+        elemType = GL_FLOAT;
+        numElems = 2;
+        break;
+    case GL_FLOAT_VEC3:
+        elemType = GL_FLOAT;
+        numElems = 3;
+        break;
+    case GL_FLOAT_VEC4:
+        elemType = GL_FLOAT;
+        numElems = 4;
+        break;
+    case GL_DOUBLE:
+        elemType = GL_DOUBLE;
+        numElems = 1;
+        break;
+    case GL_DOUBLE_VEC2:
+        elemType = GL_DOUBLE;
+        numElems = 2;
+        break;
+    case GL_DOUBLE_VEC3:
+        elemType = GL_DOUBLE;
+        numElems = 3;
+        break;
+    case GL_DOUBLE_VEC4:
+        elemType = GL_DOUBLE;
+        numElems = 4;
+        break;
+    case GL_INT:
+        elemType = GL_INT;
+        numElems = 1;
+        break;
+    case GL_INT_VEC2:
+        elemType = GL_INT;
+        numElems = 2;
+        break;
+    case GL_INT_VEC3:
+        elemType = GL_INT;
+        numElems = 3;
+        break;
+    case GL_INT_VEC4:
+        elemType = GL_INT;
+        numElems = 4;
+        break;
+    case GL_UNSIGNED_INT:
+        elemType = GL_UNSIGNED_INT;
+        numElems = 1;
+        break;
+    case GL_UNSIGNED_INT_VEC2:
+        elemType = GL_UNSIGNED_INT;
+        numElems = 2;
+        break;
+    case GL_UNSIGNED_INT_VEC3:
+        elemType = GL_UNSIGNED_INT;
+        numElems = 3;
+        break;
+    case GL_UNSIGNED_INT_VEC4:
+        elemType = GL_UNSIGNED_INT;
+        numElems = 4;
+        break;
+    case GL_BOOL:
+        elemType = GL_BOOL;
+        numElems = 1;
+        break;
+    case GL_BOOL_VEC2:
+        elemType = GL_BOOL;
+        numElems = 2;
+        break;
+    case GL_BOOL_VEC3:
+        elemType = GL_BOOL;
+        numElems = 3;
+        break;
+    case GL_BOOL_VEC4:
+        elemType = GL_BOOL;
+        numElems = 4;
+        break;
+    case GL_FLOAT_MAT2:
+        elemType = GL_FLOAT;
+        numElems = 2*2;
+        break;
+    case GL_FLOAT_MAT3:
+        elemType = GL_FLOAT;
+        numElems = 3*3;
+        break;
+    case GL_FLOAT_MAT4:
+        elemType = GL_FLOAT;
+        numElems = 4*4;
+        break;
+    case GL_FLOAT_MAT2x3:
+        elemType = GL_FLOAT;
+        numElems = 2*3;
+        break;
+    case GL_FLOAT_MAT2x4:
+        elemType = GL_FLOAT;
+        numElems = 2*4;
+        break;
+    case GL_FLOAT_MAT3x2:
+        elemType = GL_FLOAT;
+        numElems = 3*2;
+        break;
+    case GL_FLOAT_MAT3x4:
+        elemType = GL_FLOAT;
+        numElems = 3*4;
+        break;
+    case GL_FLOAT_MAT4x2:
+        elemType = GL_FLOAT;
+        numElems = 4*2;
+        break;
+    case GL_FLOAT_MAT4x3:
+        elemType = GL_FLOAT;
+        numElems = 4*3;
+        break;
+    case GL_DOUBLE_MAT2:
+        elemType = GL_DOUBLE;
+        numElems = 2*2;
+        break;
+    case GL_DOUBLE_MAT3:
+        elemType = GL_DOUBLE;
+        numElems = 3*3;
+        break;
+    case GL_DOUBLE_MAT4:
+        elemType = GL_DOUBLE;
+        numElems = 4*4;
+        break;
+    case GL_DOUBLE_MAT2x3:
+        elemType = GL_DOUBLE;
+        numElems = 2*3;
+        break;
+    case GL_DOUBLE_MAT2x4:
+        elemType = GL_DOUBLE;
+        numElems = 2*4;
+        break;
+    case GL_DOUBLE_MAT3x2:
+        elemType = GL_DOUBLE;
+        numElems = 3*2;
+        break;
+    case GL_DOUBLE_MAT3x4:
+        elemType = GL_DOUBLE;
+        numElems = 3*4;
+        break;
+    case GL_DOUBLE_MAT4x2:
+        elemType = GL_DOUBLE;
+        numElems = 4*2;
+        break;
+    case GL_DOUBLE_MAT4x3:
+        elemType = GL_DOUBLE;
+        numElems = 4*3;
+        break;
+    case GL_SAMPLER_1D:
+    case GL_SAMPLER_2D:
+    case GL_SAMPLER_3D:
+    case GL_SAMPLER_CUBE:
+    case GL_SAMPLER_1D_SHADOW:
+    case GL_SAMPLER_2D_SHADOW:
+    case GL_SAMPLER_1D_ARRAY:
+    case GL_SAMPLER_2D_ARRAY:
+    case GL_SAMPLER_CUBE_MAP_ARRAY:
+    case GL_SAMPLER_1D_ARRAY_SHADOW:
+    case GL_SAMPLER_2D_ARRAY_SHADOW:
+    case GL_SAMPLER_2D_MULTISAMPLE:
+    case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:
+    case GL_SAMPLER_CUBE_SHADOW:
+    case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW:
+    case GL_SAMPLER_BUFFER:
+    case GL_SAMPLER_2D_RECT:
+    case GL_SAMPLER_2D_RECT_SHADOW:
+    case GL_INT_SAMPLER_1D:
+    case GL_INT_SAMPLER_2D:
+    case GL_INT_SAMPLER_3D:
+    case GL_INT_SAMPLER_CUBE:
+    case GL_INT_SAMPLER_1D_ARRAY:
+    case GL_INT_SAMPLER_2D_ARRAY:
+    case GL_INT_SAMPLER_CUBE_MAP_ARRAY:
+    case GL_INT_SAMPLER_2D_MULTISAMPLE:
+    case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
+    case GL_INT_SAMPLER_BUFFER:
+    case GL_INT_SAMPLER_2D_RECT:
+    case GL_UNSIGNED_INT_SAMPLER_1D:
+    case GL_UNSIGNED_INT_SAMPLER_2D:
+    case GL_UNSIGNED_INT_SAMPLER_3D:
+    case GL_UNSIGNED_INT_SAMPLER_CUBE:
+    case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY:
+    case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
+    case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:
+    case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
+    case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
+    case GL_UNSIGNED_INT_SAMPLER_BUFFER:
+    case GL_UNSIGNED_INT_SAMPLER_2D_RECT:
+        elemType = GL_INT;
+        numElems = 1;
+        break;
+    default:
+        OS::DebugMessage("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type);
+        elemType = GL_NONE;
+        numElems = 0;
+        return;
+    }
+}
+    
 static inline size_t
 __glArrayPointer_size(GLint size, GLenum type, GLsizei stride, GLsizei maxIndex)
 {
index 1050f98868ecb4452a16510b4bd10824f957f555..9d7845250423fc705daf50dbe76588e7b8099c6b 100644 (file)
@@ -29,6 +29,7 @@
 #include <algorithm>
 #include <iostream>
 #include <map>
+#include <sstream>
 
 #include "image.hpp"
 #include "json.hpp"
@@ -209,42 +210,87 @@ dumpCurrentProgramObj(JSONWriter &json)
     }
 }
 
+
 static void
-dumpUniform(JSONWriter &json, GLint program, GLenum type, const GLchar *name) {
+dumpUniform(JSONWriter &json, GLint program, GLint size, GLenum type, const GLchar *name) {
     
-    GLenum basicType;
-    GLint length;
-
-    switch (type) {
-    case GL_FLOAT_VEC4:
-        basicType = GL_FLOAT;
-        length = 4;
-        break;
-    case GL_FLOAT_MAT4:
-        basicType = GL_FLOAT;
-        length = 4*4;
-        break;
-    default:
-        json.writeNull();
+    GLenum elemType;
+    GLint numElems;
+    __gl_uniform_size(type, elemType, numElems);
+    if (elemType == GL_NONE) {
         return;
     }
-    
-    GLint location = glGetUniformLocation(program, name);
 
     GLfloat fvalues[4*4];
+    GLdouble dvalues[4*4];
+    GLint ivalues[4*4];
+    GLuint uivalues[4*4];
+
+    GLint i, j;
+
+    for (i = 0; i < size; ++i) {
+        std::stringstream ss;
+        ss << name;
+
+        if (size > 1) {
+            ss << '[' << i << ']';
+        }
+
+        std::string elemName = ss.str();
+
+        json.beginMember(elemName);
+
+        GLint location = glGetUniformLocation(program, elemName.c_str());
 
-    json.beginArray();
-    switch (basicType) {
-    case GL_FLOAT:
-        glGetUniformfv(program, location, fvalues);
-        for (GLint index = 0; index < length; ++index) {
-            json.writeNumber(fvalues[index]);
+        if (numElems > 1) {
+            json.beginArray();
         }
-        break;
+
+        switch (elemType) {
+        case GL_FLOAT:
+            glGetUniformfv(program, location, fvalues);
+            for (j = 0; j < numElems; ++j) {
+                json.writeNumber(fvalues[j]);
+            }
+            break;
+        case GL_DOUBLE:
+            glGetUniformdv(program, location, dvalues);
+            for (j = 0; j < numElems; ++j) {
+                json.writeNumber(dvalues[j]);
+            }
+            break;
+        case GL_INT:
+            glGetUniformiv(program, location, ivalues);
+            for (j = 0; j < numElems; ++j) {
+                json.writeNumber(ivalues[j]);
+            }
+            break;
+        case GL_UNSIGNED_INT:
+            glGetUniformuiv(program, location, uivalues);
+            for (j = 0; j < numElems; ++j) {
+                json.writeNumber(uivalues[j]);
+            }
+            break;
+        case GL_BOOL:
+            glGetUniformiv(program, location, ivalues);
+            for (j = 0; j < numElems; ++j) {
+                json.writeBool(ivalues[j]);
+            }
+            break;
+        default:
+            assert(0);
+            break;
+        }
+
+        if (numElems > 1) {
+            json.endArray();
+        }
+
+        json.endMember();
     }
-    json.endArray();
 }
 
+
 static inline void
 dumpCurrentProgramUniforms(JSONWriter &json)
 {
@@ -273,18 +319,7 @@ dumpCurrentProgramUniforms(JSONWriter &json)
         GLenum type = GL_NONE;
         glGetActiveUniform(program, index, active_uniform_max_length, &length, &size, &type, name);
 
-
-        json.beginMember(name);
-        json.beginObject();
-        json.writeNumberMember("size", size);
-        json.writeStringMember("type", enumToString(type));
-        
-        json.beginMember("value");
-        dumpUniform(json, program, type, name);
-        json.endMember();
-
-        json.endObject();
-        json.endMember();
+        dumpUniform(json, program, size, type, name);
     }
 
     delete [] name;