From 3db3b2f03af32da02faa59b9bcbdd0e2879e280a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 11 May 2012 14:55:50 +0100 Subject: [PATCH] Avoid glCreateShaderProgramv when dumping satate so that the shader source can be recovered. --- retrace/glretrace.py | 31 ++++++++++++++++++++++++++++++- retrace/retrace.hpp | 5 +++++ retrace/retrace.py | 8 ++++++-- retrace/retrace_main.cpp | 4 ++++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/retrace/glretrace.py b/retrace/glretrace.py index 857c1b5..69a6dce 100644 --- a/retrace/glretrace.py +++ b/retrace/glretrace.py @@ -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": diff --git a/retrace/retrace.hpp b/retrace/retrace.hpp index 2f75dbe..9a1d5cc 100644 --- a/retrace/retrace.hpp +++ b/retrace/retrace.hpp @@ -199,6 +199,11 @@ extern bool debug; */ extern bool profiling; +/** + * State dumping. + */ +extern bool dumpingState; + extern bool doubleBuffer; extern bool coreProfile; diff --git a/retrace/retrace.py b/retrace/retrace.py index 51da6fe..8291021 100644 --- a/retrace/retrace.py +++ b/retrace/retrace.py @@ -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: diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp index d81a374..f7fb711 100644 --- a/retrace/retrace_main.cpp +++ b/retrace/retrace_main.cpp @@ -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; -- 2.43.0