]> git.cworth.org Git - apitrace/commitdiff
Avoid glCreateShaderProgramv when dumping satate so that the shader
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 11 May 2012 13:55:50 +0000 (14:55 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 11 May 2012 13:55:50 +0000 (14:55 +0100)
source can be recovered.

retrace/glretrace.py
retrace/retrace.hpp
retrace/retrace.py
retrace/retrace_main.cpp

index 857c1b5fa551493a9d258520b4935ce8cf0713dc..69a6dce6f7e20bc3ed606505d3b6b14892bcce0c 100644 (file)
@@ -285,7 +285,36 @@ class GlRetracer(Retracer):
             print r'        _pipelineHasBeenBound = true;'
             print r'    }'
         
-        Retracer.invokeFunction(self, function)
+        if function.name == 'glCreateShaderProgramv':
+            # When dumping state, break down glCreateShaderProgramv so that the
+            # shader source can be recovered.
+            print r'    if (retrace::dumpingState) {'
+            print r'        GLuint _shader = glCreateShader(type);'
+            print r'        if (_shader) {'
+            print r'            glShaderSource(_shader, count, strings, NULL);'
+            print r'            glCompileShader(_shader);'
+            print r'            const GLuint _program = glCreateProgram();'
+            print r'            if (_program) {'
+            print r'                GLint compiled = GL_FALSE;'
+            print r'                glGetShaderiv(_shader, GL_COMPILE_STATUS, &compiled);'
+            print r'                glProgramParameteri(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);'
+            print r'                if (compiled) {'
+            print r'                    glAttachShader(_program, _shader);'
+            print r'                    glLinkProgram(_program);'
+            print r'                    //glDetachShader(_program, _shader);'
+            print r'                }'
+            print r'                //append-shader-info-log-to-program-info-log'
+            print r'            }'
+            print r'            //glDeleteShader(_shader);'
+            print r'            _result = _program;'
+            print r'        } else {'
+            print r'            _result = 0;'
+            print r'        }'
+            print r'    } else {'
+            Retracer.invokeFunction(self, function)
+            print r'    }'
+        else:
+            Retracer.invokeFunction(self, function)
 
         # Error checking
         if function.name == "glBegin":
index 2f75dbe6f5285cea539f22123e0d8523fa9d8d35..9a1d5ccc2832c7e5c704b7bac9c42edf5014da13 100644 (file)
@@ -199,6 +199,11 @@ extern bool debug;
  */
 extern bool profiling;
 
+/**
+ * State dumping.
+ */
+extern bool dumpingState;
+
 
 extern bool doubleBuffer;
 extern bool coreProfile;
index 51da6fec24ff2ec78beeb280fd3f591b9a62178e..82910213a0d678e379b8a4f1d6e3c26183d1dec2 100644 (file)
@@ -328,6 +328,7 @@ class Retracer:
 
         self.deserializeArgs(function)
         
+        self.declareRet(function)
         self.invokeFunction(function)
 
         self.swizzleValues(function)
@@ -342,6 +343,7 @@ class Retracer:
 
         self.deserializeArgs(method)
         
+        self.declareRet(method)
         self.invokeInterfaceMethod(interface, method)
 
         self.swizzleValues(method)
@@ -430,10 +432,13 @@ class Retracer:
         visitor = SwizzledValueRegistrator()
         visitor.visit(type, lvalue, rvalue)
 
+    def declareRet(self, function):
+        if function.type is not stdapi.Void:
+            print '    %s _result;' % (function.type)
+
     def invokeFunction(self, function):
         arg_names = ", ".join(function.argNames())
         if function.type is not stdapi.Void:
-            print '    %s _result;' % (function.type)
             print '    _result = %s(%s);' % (function.name, arg_names)
             print '    (void)_result;'
         else:
@@ -450,7 +455,6 @@ class Retracer:
 
         arg_names = ", ".join(method.argNames())
         if method.type is not stdapi.Void:
-            print '    %s _result;' % (method.type)
             print '    _result = _this->%s(%s);' % (method.name, arg_names)
             print '    (void)_result;'
         else:
index d81a374754a8297759a3686bb8ce8fa0c6268a8c..f7fb7113e4178cb757fb6eefe73a13c1c3855cdc 100644 (file)
@@ -54,6 +54,7 @@ trace::Parser parser;
 int verbosity = 0;
 bool debug = true;
 bool profiling = false;
+bool dumpingState = false;
 
 
 bool doubleBuffer = true;
@@ -210,6 +211,8 @@ usage(const char *argv0) {
 extern "C"
 int main(int argc, char **argv)
 {
+    using namespace retrace;
+
     assert(compareFrequency.empty());
     assert(snapshotFrequency.empty());
 
@@ -242,6 +245,7 @@ int main(int argc, char **argv)
             }
         } else if (!strcmp(arg, "-D")) {
             dumpStateCallNo = atoi(argv[++i]);
+            dumpingState = true;
             retrace::verbosity = -2;
         } else if (!strcmp(arg, "-core")) {
             retrace::coreProfile = true;