]> git.cworth.org Git - apitrace/blobdiff - retrace/retrace_main.cpp
image: Make PNG writing an Image method.
[apitrace] / retrace / retrace_main.cpp
index e3e74f84cf20d979928b6fd704593939f22305ba..63d3dab07064a7b2a615af967e1263440b68862a 100644 (file)
@@ -61,6 +61,9 @@ int verbosity = 0;
 bool debug = true;
 bool dumpingState = false;
 
+Driver driver = DRIVER_DEFAULT;
+const char *driverModule = NULL;
+
 bool doubleBuffer = true;
 bool coreProfile = false;
 
@@ -79,6 +82,11 @@ frameComplete(trace::Call &call) {
 }
 
 
+static Dumper defaultDumper;
+
+Dumper *dumper = &defaultDumper;
+
+
 /**
  * Take/compare snapshots.
  */
@@ -99,8 +107,9 @@ takeSnapshot(unsigned call_no) {
         }
     }
 
-    image::Image *src = getSnapshot();
+    image::Image *src = dumper->getSnapshot();
     if (!src) {
+        std::cout << "Failed to get snapshot\n";
         return;
     }
 
@@ -162,7 +171,7 @@ retraceCall(trace::Call *call) {
         takeSnapshot(call->no);
 
     if (call->no >= dumpStateCallNo &&
-        dumpState(std::cout)) {
+        dumper->dumpState(std::cout)) {
         exit(0);
     }
 }
@@ -500,6 +509,7 @@ usage(const char *argv0) {
         "  -C, --calls=CALLSET     calls to compare (default is every frame)\n"
         "      --core              use core profile\n"
         "      --db                use a double buffer visual (default)\n"
+        "      --driver=DRIVER     force driver type (`hw`, `sw`, `ref`, `null`, or driver module name)\n"
         "      --sb                use a single buffer visual\n"
         "  -s, --snapshot-prefix=PREFIX    take snapshots; `-` for PNM stdout output\n"
         "  -S, --snapshot=CALLSET  calls to snapshot (default is every frame)\n"
@@ -511,6 +521,7 @@ usage(const char *argv0) {
 enum {
     CORE_OPT = CHAR_MAX + 1,
     DB_OPT,
+    DRIVER_OPT,
     PCPU_OPT,
     PGPU_OPT,
     PPD_OPT,
@@ -527,6 +538,7 @@ longOptions[] = {
     {"compare", required_argument, 0, 'c'},
     {"core", no_argument, 0, CORE_OPT},
     {"db", no_argument, 0, DB_OPT},
+    {"driver", required_argument, 0, DRIVER_OPT},
     {"dump-state", required_argument, 0, 'D'},
     {"help", no_argument, 0, 'h'},
     {"pcpu", no_argument, 0, PCPU_OPT},
@@ -540,6 +552,13 @@ longOptions[] = {
     {0, 0, 0, 0}
 };
 
+
+static void exceptionCallback(void)
+{
+    std::cerr << retrace::callNo << ": error: caught an unhandled exception\n";
+}
+
+
 extern "C"
 int main(int argc, char **argv)
 {
@@ -582,6 +601,20 @@ int main(int argc, char **argv)
         case DB_OPT:
             retrace::doubleBuffer = true;
             break;
+        case DRIVER_OPT:
+            if (strcasecmp(optarg, "hw") == 0) {
+                driver = DRIVER_HARDWARE;
+            } else if (strcasecmp(optarg, "sw") == 0) {
+                driver = DRIVER_SOFTWARE;
+            } else if (strcasecmp(optarg, "ref") == 0) {
+                driver = DRIVER_REFERENCE;
+            } else if (strcasecmp(optarg, "null") == 0) {
+                driver = DRIVER_NULL;
+            } else {
+                driver = DRIVER_MODULE;
+                driverModule = optarg;
+            }
+            break;
         case SB_OPT:
             retrace::doubleBuffer = false;
             break;
@@ -640,9 +673,10 @@ int main(int argc, char **argv)
         retrace::profiler.setup(retrace::profilingCpuTimes, retrace::profilingGpuTimes, retrace::profilingPixelsDrawn);
     }
 
+    os::setExceptionCallback(exceptionCallback);
+
     for (i = optind; i < argc; ++i) {
         if (!retrace::parser.open(argv[i])) {
-            std::cerr << "error: failed to open " << argv[i] << "\n";
             return 1;
         }
 
@@ -650,6 +684,8 @@ int main(int argc, char **argv)
 
         retrace::parser.close();
     }
+    
+    os::resetExceptionCallback();
 
     // XXX: X often hangs on XCloseDisplay
     //retrace::cleanUp();