]> git.cworth.org Git - apitrace/blobdiff - retrace/retrace_main.cpp
Extend profiling tool to support Vsize and Rss memory usage profile per call
[apitrace] / retrace / retrace_main.cpp
index 63d3dab07064a7b2a615af967e1263440b68862a..7cc3fcab869bf0e5935d504838275de4909bd940 100644 (file)
@@ -1,6 +1,8 @@
 /**************************************************************************
  *
  * Copyright 2011 Jose Fonseca
+ * Copyright (C) 2013 Intel Corporation. All rights reversed.
+ * Author: Shuang He <shuang.he@intel.com>
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -35,6 +37,7 @@
 #include "image.hpp"
 #include "trace_callset.hpp"
 #include "trace_dump.hpp"
+#include "trace_option.hpp"
 #include "retrace.hpp"
 
 
@@ -71,6 +74,8 @@ bool profiling = false;
 bool profilingGpuTimes = false;
 bool profilingCpuTimes = false;
 bool profilingPixelsDrawn = false;
+bool profilingMemoryUsage = false;
+bool useCallNos = true;
 
 unsigned frameNo = 0;
 unsigned callNo = 0;
@@ -92,6 +97,8 @@ Dumper *dumper = &defaultDumper;
  */
 static void
 takeSnapshot(unsigned call_no) {
+    static unsigned snapshot_no = 0;
+
     assert(snapshotPrefix || comparePrefix);
 
     image::Image *ref = NULL;
@@ -116,10 +123,13 @@ takeSnapshot(unsigned call_no) {
     if (snapshotPrefix) {
         if (snapshotPrefix[0] == '-' && snapshotPrefix[1] == 0) {
             char comment[21];
-            snprintf(comment, sizeof comment, "%u", call_no);
+            snprintf(comment, sizeof comment, "%u",
+                     useCallNos ? call_no : snapshot_no);
             src->writePNM(std::cout, comment);
         } else {
-            os::String filename = os::String::format("%s%010u.png", snapshotPrefix, call_no);
+            os::String filename = os::String::format("%s%010u.png",
+                                                     snapshotPrefix,
+                                                     useCallNos ? call_no : snapshot_no);
             if (src->writePNG(filename) && retrace::verbosity >= 0) {
                 std::cout << "Wrote " << filename << "\n";
             }
@@ -133,6 +143,8 @@ takeSnapshot(unsigned call_no) {
 
     delete src;
 
+    snapshot_no++;
+
     return;
 }
 
@@ -505,8 +517,10 @@ usage(const char *argv0) {
         "      --pcpu              cpu profiling (cpu times per call)\n"
         "      --pgpu              gpu profiling (gpu times per draw call)\n"
         "      --ppd               pixels drawn profiling (pixels drawn per draw call)\n"
+        "      --pmem              memory usage profiling (vsize rss per call)\n"
         "  -c, --compare=PREFIX    compare against snapshots with given PREFIX\n"
         "  -C, --calls=CALLSET     calls to compare (default is every frame)\n"
+        "      --call-nos[=BOOL]   use call numbers in snapshot filenames\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"
@@ -519,12 +533,14 @@ usage(const char *argv0) {
 }
 
 enum {
-    CORE_OPT = CHAR_MAX + 1,
+    CALL_NOS_OPT = CHAR_MAX + 1,
+    CORE_OPT,
     DB_OPT,
     DRIVER_OPT,
     PCPU_OPT,
     PGPU_OPT,
     PPD_OPT,
+    PMEM_OPT,
     SB_OPT,
 };
 
@@ -534,6 +550,7 @@ shortOptions = "bc:C:D:hs:S:vw";
 const static struct option
 longOptions[] = {
     {"benchmark", no_argument, 0, 'b'},
+    {"call-nos", optional_argument, 0, CALL_NOS_OPT },
     {"calls", required_argument, 0, 'C'},
     {"compare", required_argument, 0, 'c'},
     {"core", no_argument, 0, CORE_OPT},
@@ -544,6 +561,7 @@ longOptions[] = {
     {"pcpu", no_argument, 0, PCPU_OPT},
     {"pgpu", no_argument, 0, PGPU_OPT},
     {"ppd", no_argument, 0, PPD_OPT},
+    {"pmem", no_argument, 0, PMEM_OPT},
     {"sb", no_argument, 0, SB_OPT},
     {"snapshot-prefix", required_argument, 0, 's'},
     {"snapshot", required_argument, 0, 'S'},
@@ -578,6 +596,9 @@ int main(int argc, char **argv)
             retrace::debug = false;
             retrace::verbosity = -1;
             break;
+        case CALL_NOS_OPT:
+            useCallNos = trace::boolOption(optarg);
+            break;
         case 'c':
             comparePrefix = optarg;
             if (compareFrequency.empty()) {
@@ -661,6 +682,13 @@ int main(int argc, char **argv)
 
             retrace::profilingPixelsDrawn = true;
             break;
+        case PMEM_OPT:
+            retrace::debug = false;
+            retrace::profiling = true;
+            retrace::verbosity = -1;
+
+            retrace::profilingMemoryUsage = true;
+            break;
         default:
             std::cerr << "error: unknown option " << opt << "\n";
             usage(argv[0]);
@@ -670,7 +698,7 @@ int main(int argc, char **argv)
 
     retrace::setUp();
     if (retrace::profiling) {
-        retrace::profiler.setup(retrace::profilingCpuTimes, retrace::profilingGpuTimes, retrace::profilingPixelsDrawn);
+        retrace::profiler.setup(retrace::profilingCpuTimes, retrace::profilingGpuTimes, retrace::profilingPixelsDrawn, retrace::profilingMemoryUsage);
     }
 
     os::setExceptionCallback(exceptionCallback);