X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glretrace_main.cpp;h=d80775f0ed3dd76c591c632e479065580c573939;hb=8e3c2c0d01c7ec5479845fedc053da00fa88e76a;hp=2f6d371d5453c68305bd702e118f2b0219fe5a5c;hpb=559d5349e8039871ff14509a26c54c980c8e2cc7;p=apitrace diff --git a/glretrace_main.cpp b/glretrace_main.cpp index 2f6d371..d80775f 100644 --- a/glretrace_main.cpp +++ b/glretrace_main.cpp @@ -26,6 +26,8 @@ #include +#include "os_string.hpp" +#include "os_time.hpp" #include "image.hpp" #include "retrace.hpp" #include "glproc.hpp" @@ -37,8 +39,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; @@ -116,6 +118,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); @@ -139,8 +146,7 @@ void snapshot(unsigned call_no) { image::Image *ref = NULL; if (compare_prefix) { - char filename[PATH_MAX]; - snprintf(filename, sizeof filename, "%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; @@ -150,7 +156,7 @@ void snapshot(unsigned call_no) { } } - image::Image *src = glstate::getDrawBufferImage(GL_RGBA); + image::Image *src = glstate::getDrawBufferImage(); if (!src) { return; } @@ -161,8 +167,7 @@ void snapshot(unsigned call_no) { 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); + 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"; } @@ -203,6 +208,7 @@ static void display(void) { retracer.addCallbacks(glx_callbacks); retracer.addCallbacks(wgl_callbacks); retracer.addCallbacks(cgl_callbacks); + retracer.addCallbacks(egl_callbacks); startTime = os::getTime(); trace::Call *call; @@ -224,7 +230,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 +254,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 +290,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 +335,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 +350,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;