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;
#"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) {'
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":
bool benchmark = false;
const char *compare_prefix = NULL;
const char *snapshot_prefix = NULL;
+enum frequency snapshot_frequency = FREQUENCY_NEVER;
unsigned dump_state = ~0;
void frame_complete(unsigned call_no) {
++frame;
- snapshot(call_no);
+ if (snapshot_frequency == FREQUENCY_FRAME ||
+ snapshot_frequency == FREQUENCY_FRAMEBUFFER) {
+ snapshot(call_no);
+ }
}
" -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";
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")) {