]> git.cworth.org Git - apitrace/blobdiff - glretrace_main.cpp
Make os::getTime() inline and make time frequency OS-dependent variable.
[apitrace] / glretrace_main.cpp
index c23f66473a8efa30a12fa55f0c13a31108b8cd1a..c2ca664239500d76d7d0dc2390533d80139a99f7 100644 (file)
@@ -26,7 +26,8 @@
 
 #include <string.h>
 
-#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";
             }
@@ -202,6 +209,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;
@@ -223,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 << 
@@ -247,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";
 }
@@ -282,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")) {
@@ -325,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])) {
@@ -337,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;