]> git.cworth.org Git - apitrace/blobdiff - retrace/glstate_shaders.cpp
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / retrace / glstate_shaders.cpp
index 392dc2b5d0a1fc28c8c38a3c8c930d0a803017b5..aeead3bb5d889afe4483c1b680127b56039224f5 100644 (file)
@@ -24,6 +24,7 @@
  **************************************************************************/
 
 
+#include <assert.h>
 #include <string.h>
 
 #include <algorithm>
@@ -128,7 +129,7 @@ dumpProgram(JSONWriter &json, GLint program)
     glGetAttachedShaders(program, attached_shaders, &count, shaders);
     std::sort(shaders, shaders + count);
     for (GLsizei i = 0; i < count; ++ i) {
-       getShaderSource(shaderMap, shaders[i]);
+        getShaderSource(shaderMap, shaders[i]);
     }
     delete [] shaders;
 
@@ -245,16 +246,16 @@ dumpUniformValues(JSONWriter &json, GLenum type, const void *values, GLint matri
 
             switch (elemType) {
             case GL_FLOAT:
-                json.writeNumber(*u.fvalue);
+                json.writeFloat(*u.fvalue);
                 break;
             case GL_DOUBLE:
-                json.writeNumber(*u.dvalue);
+                json.writeFloat(*u.dvalue);
                 break;
             case GL_INT:
-                json.writeNumber(*u.ivalue);
+                json.writeInt(*u.ivalue);
                 break;
             case GL_UNSIGNED_INT:
-                json.writeNumber(*u.uivalue);
+                json.writeInt(*u.uivalue);
                 break;
             case GL_BOOL:
                 json.writeBool(*u.uivalue);
@@ -350,7 +351,7 @@ dumpUniformBlock(JSONWriter &json, GLint program, GLint size, GLenum type, const
             json.endMember();
         }
 
-        glUnmapBuffer(GL_UNIFORM_BUFFER_BINDING);
+        glUnmapBuffer(GL_UNIFORM_BUFFER);
     }
 
     glBindBuffer(GL_UNIFORM_BUFFER, previous_ubo);
@@ -625,10 +626,10 @@ dumpArbProgramUniforms(JSONWriter &json, GLenum target, const char *prefix)
 
         json.beginMember(name);
         json.beginArray();
-        json.writeNumber(params[0]);
-        json.writeNumber(params[1]);
-        json.writeNumber(params[2]);
-        json.writeNumber(params[3]);
+        json.writeFloat(params[0]);
+        json.writeFloat(params[1]);
+        json.writeFloat(params[2]);
+        json.writeFloat(params[3]);
         json.endArray();
         json.endMember();
     }
@@ -648,30 +649,66 @@ dumpArbProgramUniforms(JSONWriter &json, GLenum target, const char *prefix)
 
         json.beginMember(name);
         json.beginArray();
-        json.writeNumber(params[0]);
-        json.writeNumber(params[1]);
-        json.writeNumber(params[2]);
-        json.writeNumber(params[3]);
+        json.writeFloat(params[0]);
+        json.writeFloat(params[1]);
+        json.writeFloat(params[2]);
+        json.writeFloat(params[3]);
         json.endArray();
         json.endMember();
     }
 }
 
+static void
+dumpProgramUniformsStage(JSONWriter &json, GLint program, const char *stage)
+{
+    if (program) {
+        json.beginMember(stage);
+        json.beginObject();
+        dumpProgramUniforms(json, program);
+        json.endObject();
+        json.endMember();
+    }
+}
 
 void
 dumpShadersUniforms(JSONWriter &json, Context &context)
 {
-    GLint program = 0;
-    glGetIntegerv(GL_CURRENT_PROGRAM, &program);
+    GLint pipeline = 0;
+    GLint vertex_program = 0;
+    GLint fragment_program = 0;
+    GLint geometry_program = 0;
+    GLint tess_control_program = 0;
+    GLint tess_evaluation_program = 0;
+
+    if (!context.ES) {
+        glGetIntegerv(GL_PROGRAM_PIPELINE_BINDING, &pipeline);
+        if (pipeline) {
+            glGetProgramPipelineiv(pipeline, GL_VERTEX_SHADER, &vertex_program);
+            glGetProgramPipelineiv(pipeline, GL_FRAGMENT_SHADER, &fragment_program);
+            glGetProgramPipelineiv(pipeline, GL_GEOMETRY_SHADER, &geometry_program);
+            glGetProgramPipelineiv(pipeline, GL_TESS_CONTROL_SHADER, &tess_control_program);
+            glGetProgramPipelineiv(pipeline, GL_TESS_EVALUATION_SHADER, &tess_evaluation_program);
+        }
+    }
 
+    GLint program = 0;
     GLhandleARB programObj = 0;
-    if (!context.ES && !program) {
-        programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB);
+    if (!pipeline) {
+        glGetIntegerv(GL_CURRENT_PROGRAM, &program);
+        if (!context.ES && !program) {
+            programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB);
+        }
     }
 
     json.beginMember("shaders");
     json.beginObject();
-    if (program) {
+    if (pipeline) {
+        dumpProgram(json, vertex_program);
+        dumpProgram(json, fragment_program);
+        dumpProgram(json, geometry_program);
+        dumpProgram(json, tess_control_program);
+        dumpProgram(json, tess_evaluation_program);
+    } else if (program) {
         dumpProgram(json, program);
     } else if (programObj) {
         dumpProgramObj(json, programObj);
@@ -684,7 +721,13 @@ dumpShadersUniforms(JSONWriter &json, Context &context)
 
     json.beginMember("uniforms");
     json.beginObject();
-    if (program) {
+    if (pipeline) {
+        dumpProgramUniformsStage(json, vertex_program, "GL_VERTEX_SHADER");
+        dumpProgramUniformsStage(json, fragment_program, "GL_FRAGMENT_SHADER");
+        dumpProgramUniformsStage(json, geometry_program, "GL_GEOMETRY_SHADER");
+        dumpProgramUniformsStage(json, tess_control_program, "GL_TESS_CONTROL_SHADER");
+        dumpProgramUniformsStage(json, tess_evaluation_program, "GL_TESS_EVALUATION_SHADER");
+    } else if (program) {
         dumpProgramUniforms(json, program);
     } else if (programObj) {
         dumpProgramObjUniforms(json, programObj);