X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glretrace_main.cpp;h=cd35889c9dff873303dd27d26274829d296e664d;hb=bde6db84069fd9dfbc645de02cb22cacff17c298;hp=e555923431b2c2c6adfbc88bdaa587d2b5bc8815;hpb=920bffd8441869006382225fd4e268513f1761a2;p=apitrace diff --git a/glretrace_main.cpp b/glretrace_main.cpp index e555923..cd35889 100644 --- a/glretrace_main.cpp +++ b/glretrace_main.cpp @@ -35,7 +35,7 @@ namespace glretrace { -bool double_buffer = false; +bool double_buffer = true; bool insideGlBeginEnd = false; Trace::Parser parser; glws::WindowSystem *ws = NULL; @@ -103,6 +103,37 @@ checkGlError(Trace::Call &call) { std::cerr << "\n"; } +/** + * Grow the current drawble. + * + * We need to infer the drawable size from GL calls because the drawable sizes + * are specified by OS specific calls which we do not trace. + */ +void +updateDrawable(int width, int height) { + if (!drawable) { + return; + } + + if (width <= glretrace::drawable->width && + height <= glretrace::drawable->height) { + return; + } + + // Check for bound framebuffer last, as this may have a performance impact. + GLint draw_framebuffer = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &draw_framebuffer); + if (draw_framebuffer != 0) { + return; + } + + glretrace::drawable->resize(width, height); + if (!drawable->visible) { + drawable->show(); + } + glScissor(0, 0, width, height); +} + void snapshot(unsigned call_no) { if (!drawable || @@ -130,10 +161,16 @@ void snapshot(unsigned call_no) { } if (snapshot_prefix) { - char filename[PATH_MAX]; - snprintf(filename, sizeof filename, "%s%010u.png", snapshot_prefix, call_no); - if (src->writePNG(filename) && retrace::verbosity >= 0) { - std::cout << "Wrote " << filename << "\n"; + if (snapshot_prefix[0] == '-' && snapshot_prefix[1] == 0) { + char comment[21]; + snprintf(comment, sizeof comment, "%u", call_no); + src->writePNM(std::cout, comment); + } else { + char filename[PATH_MAX]; + snprintf(filename, sizeof filename, "%s%010u.png", snapshot_prefix, call_no); + if (src->writePNG(filename) && retrace::verbosity >= 0) { + std::cout << "Wrote " << filename << "\n"; + } } } @@ -157,6 +194,7 @@ void frame_complete(unsigned call_no) { static void display(void) { + startTime = OS::GetTime(); Trace::Call *call; while ((call = parser.parse_call())) { @@ -219,7 +257,7 @@ static void usage(void) { " -c PREFIX compare against snapshots\n" " -db use a double buffer visual (default)\n" " -sb use a single buffer visual\n" - " -s PREFIX take snapshots\n" + " -s PREFIX take snapshots; `-` for PNM stdout output\n" " -S FREQUENCY snapshot frequency: frame (default), framebuffer, or draw\n" " -v verbose output\n" " -D CALLNO dump state at specific call no\n" @@ -245,6 +283,9 @@ int main(int argc, char **argv) retrace::verbosity = -1; } else if (!strcmp(arg, "-c")) { compare_prefix = argv[++i]; + if (snapshot_frequency == FREQUENCY_NEVER) { + snapshot_frequency = FREQUENCY_FRAME; + } } else if (!strcmp(arg, "-D")) { dump_state = atoi(argv[++i]); retrace::verbosity = -2; @@ -260,6 +301,9 @@ int main(int argc, char **argv) if (snapshot_frequency == FREQUENCY_NEVER) { snapshot_frequency = FREQUENCY_FRAME; } + if (snapshot_prefix[0] == '-' && snapshot_prefix[1] == 0) { + retrace::verbosity = -2; + } } else if (!strcmp(arg, "-S")) { arg = argv[++i]; if (!strcmp(arg, "frame")) { @@ -291,11 +335,14 @@ int main(int argc, char **argv) visual = ws->createVisual(double_buffer); for ( ; i < argc; ++i) { - if (parser.open(argv[i])) { - startTime = OS::GetTime(); - display(); - parser.close(); + if (!parser.open(argv[i])) { + std::cerr << "error: failed to open " << argv[i] << "\n"; + return 1; } + + display(); + + parser.close(); } return 0;