From 920bffd8441869006382225fd4e268513f1761a2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Thu, 2 Jun 2011 10:04:52 +0100 Subject: [PATCH] Allow to specify the snapshot frequency. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Based on a patch by Michel Dänzer --- glretrace.hpp | 8 ++++++++ glretrace.py | 30 ++++++++++++++++++++++++++++-- glretrace_main.cpp | 26 +++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/glretrace.hpp b/glretrace.hpp index 74eb674..255dd6f 100644 --- a/glretrace.hpp +++ b/glretrace.hpp @@ -45,9 +45,17 @@ extern unsigned frame; extern long long startTime; extern bool wait; +enum frequency { + FREQUENCY_NEVER = 0, + FREQUENCY_FRAME, + FREQUENCY_FRAMEBUFFER, + FREQUENCY_DRAW, +}; + extern bool benchmark; extern const char *compare_prefix; extern const char *snapshot_prefix; +extern enum frequency snapshot_frequency; extern unsigned dump_state; diff --git a/glretrace.py b/glretrace.py index 9a1a835..d8f9d0b 100644 --- a/glretrace.py +++ b/glretrace.py @@ -99,10 +99,22 @@ class GlRetracer(Retracer): #"glMultiModeDrawElementsIBM", ]) + misc_draw_function_names = set([ + "glClear", + "glEnd", + ]) + + bind_framebuffer_function_names = set([ + "glBindFramebuffer", + "glBindFramebufferARB", + "glBindFramebufferEXT", + ]) + def retrace_function_body(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_array = function.name in self.draw_array_function_names is_draw_elements = function.name in self.draw_elements_function_names + is_misc_draw = function.name in self.misc_draw_function_names if is_array_pointer or is_draw_array or is_draw_elements: print ' if (glretrace::parser.version < 1) {' @@ -123,16 +135,30 @@ class GlRetracer(Retracer): print ' }' + # Pre-snapshots + if function.name in self.bind_framebuffer_function_names: + print ' if (glretrace::snapshot_frequency == glretrace::FREQUENCY_FRAMEBUFFER) {' + print ' glretrace::snapshot(call.no - 1);' + print ' }' + Retracer.retrace_function_body(self, function) + # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!glretrace::double_buffer) {' print ' glretrace::frame_complete(call.no);' print ' }' - if function.name == 'glReadPixels': print ' glFinish();' - print ' glretrace::snapshot(call.no);' + print ' if (glretrace::snapshot_frequency == glretrace::FREQUENCY_FRAME ||' + print ' glretrace::snapshot_frequency == glretrace::FREQUENCY_FRAMEBUFFER) {' + print ' glretrace::snapshot(call.no);' + print ' }' + if is_draw_array or is_draw_elements or is_misc_draw: + print ' if (glretrace::snapshot_frequency == glretrace::FREQUENCY_DRAW) {' + print ' glretrace::snapshot(call.no);' + print ' }' + def call_function(self, function): if function.name == "glViewport": diff --git a/glretrace_main.cpp b/glretrace_main.cpp index f559332..e555923 100644 --- a/glretrace_main.cpp +++ b/glretrace_main.cpp @@ -50,6 +50,7 @@ bool wait = false; bool benchmark = false; const char *compare_prefix = NULL; const char *snapshot_prefix = NULL; +enum frequency snapshot_frequency = FREQUENCY_NEVER; unsigned dump_state = ~0; @@ -148,7 +149,10 @@ void snapshot(unsigned call_no) { void frame_complete(unsigned call_no) { ++frame; - snapshot(call_no); + if (snapshot_frequency == FREQUENCY_FRAME || + snapshot_frequency == FREQUENCY_FRAMEBUFFER) { + snapshot(call_no); + } } @@ -216,6 +220,7 @@ static void usage(void) { " -db use a double buffer visual (default)\n" " -sb use a single buffer visual\n" " -s PREFIX take snapshots\n" + " -S FREQUENCY snapshot frequency: frame (default), framebuffer, or draw\n" " -v verbose output\n" " -D CALLNO dump state at specific call no\n" " -w wait on final frame\n"; @@ -252,6 +257,25 @@ int main(int argc, char **argv) return 0; } else if (!strcmp(arg, "-s")) { snapshot_prefix = argv[++i]; + if (snapshot_frequency == FREQUENCY_NEVER) { + snapshot_frequency = FREQUENCY_FRAME; + } + } else if (!strcmp(arg, "-S")) { + arg = argv[++i]; + if (!strcmp(arg, "frame")) { + snapshot_frequency = FREQUENCY_FRAME; + } else if (!strcmp(arg, "framebuffer")) { + snapshot_frequency = FREQUENCY_FRAMEBUFFER; + } else if (!strcmp(arg, "draw")) { + snapshot_frequency = FREQUENCY_DRAW; + } else { + std::cerr << "error: unknown frequency " << arg << "\n"; + usage(); + return 1; + } + if (snapshot_prefix == NULL) { + snapshot_prefix = ""; + } } else if (!strcmp(arg, "-v")) { ++retrace::verbosity; } else if (!strcmp(arg, "-w")) { -- 2.45.2