X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glretrace_main.cpp;h=c2ca664239500d76d7d0dc2390533d80139a99f7;hb=ddbf8c0065ce1b7502e3e127a846add476ab7a4c;hp=dfb051c6a352b216ba47eea89c1386c48741b076;hpb=d71895d95c880efe5d1dbe6ab3bfd752e6f8faea;p=apitrace diff --git a/glretrace_main.cpp b/glretrace_main.cpp index dfb051c..c2ca664 100644 --- a/glretrace_main.cpp +++ b/glretrace_main.cpp @@ -26,7 +26,8 @@ #include -#include "os_path.hpp" +#include "os_string.hpp" +#include "os_time.hpp" #include "image.hpp" #include "retrace.hpp" #include "glproc.hpp" @@ -39,7 +40,8 @@ namespace glretrace { bool double_buffer = true; bool insideGlBeginEnd = false; trace::Parser parser; -glws::Visual *visual = NULL; +glws::Profile defaultProfile = glws::PROFILE_COMPAT; +glws::Visual *visual[glws::PROFILE_MAX]; glws::Drawable *drawable = NULL; glws::Context *context = NULL; @@ -117,6 +119,11 @@ updateDrawable(int width, int height) { return; } + // Ignore zero area viewports + if (width == 0 || height == 0) { + return; + } + // Check for bound framebuffer last, as this may have a performance impact. GLint draw_framebuffer = 0; glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &draw_framebuffer); @@ -140,7 +147,7 @@ void snapshot(unsigned call_no) { image::Image *ref = NULL; if (compare_prefix) { - os::Path filename = os::Path::format("%s%010u.png", compare_prefix, call_no); + os::String filename = os::String::format("%s%010u.png", compare_prefix, call_no); ref = image::readPNG(filename); if (!ref) { return; @@ -161,7 +168,7 @@ void snapshot(unsigned call_no) { snprintf(comment, sizeof comment, "%u", call_no); src->writePNM(std::cout, comment); } else { - os::Path filename = os::Path::format("%s%010u.png", snapshot_prefix, call_no); + os::String filename = os::String::format("%s%010u.png", snapshot_prefix, call_no); if (src->writePNG(filename) && retrace::verbosity >= 0) { std::cout << "Wrote " << filename << "\n"; } @@ -224,7 +231,7 @@ static void display(void) { glFlush(); long long endTime = os::getTime(); - float timeInterval = (endTime - startTime) * 1.0E-6; + float timeInterval = (endTime - startTime) * (1.0 / os::timeFrequency); if (retrace::verbosity >= -1) { std::cout << @@ -248,11 +255,12 @@ static void usage(void) { "\n" " -b benchmark mode (no error checking or warning messages)\n" " -c PREFIX compare against snapshots\n" + " -core use core profile\n" " -db use a double buffer visual (default)\n" " -sb use a single buffer visual\n" " -s PREFIX take snapshots; `-` for PNM stdout output\n" " -S FREQUENCY snapshot frequency: frame (default), framebuffer, or draw\n" - " -v verbose output\n" + " -v increase output verbosity\n" " -D CALLNO dump state at specific call no\n" " -w wait on final frame\n"; } @@ -283,6 +291,8 @@ int main(int argc, char **argv) } else if (!strcmp(arg, "-D")) { dump_state = atoi(argv[++i]); retrace::verbosity = -2; + } else if (!strcmp(arg, "-core")) { + defaultProfile = glws::PROFILE_CORE; } else if (!strcmp(arg, "-db")) { double_buffer = true; } else if (!strcmp(arg, "-sb")) { @@ -326,7 +336,10 @@ int main(int argc, char **argv) } glws::init(); - visual = glws::createVisual(double_buffer); + visual[glws::PROFILE_COMPAT] = glws::createVisual(double_buffer, glws::PROFILE_COMPAT); + visual[glws::PROFILE_CORE] = glws::createVisual(double_buffer, glws::PROFILE_CORE); + visual[glws::PROFILE_ES1] = glws::createVisual(double_buffer, glws::PROFILE_ES1); + visual[glws::PROFILE_ES2] = glws::createVisual(double_buffer, glws::PROFILE_ES2); for ( ; i < argc; ++i) { if (!parser.open(argv[i])) { @@ -338,8 +351,11 @@ int main(int argc, char **argv) parser.close(); } - - delete visual; + + for (int n = 0; n < glws::PROFILE_MAX; n++) { + delete visual[n]; + } + glws::cleanup(); return 0;