[PATCH] glretrace: Add optional parameter to allow looping N last frames

Jon Ashburn jon at lunarg.com
Mon Aug 11 14:35:33 PDT 2014


---
 common/trace_option.cpp  |  8 ++++++++
 common/trace_option.hpp  |  3 ++-
 retrace/retrace_main.cpp | 14 ++++++++++----
 3 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/common/trace_option.cpp b/common/trace_option.cpp
index 5c4563f..edaa8e8 100644
--- a/common/trace_option.cpp
+++ b/common/trace_option.cpp
@@ -28,6 +28,7 @@
 
 #include <string.h>
 #include <iostream>
+#include <stdlib.h>
 
 namespace trace {
 
@@ -50,4 +51,11 @@ boolOption(const char *option, bool default_) {
     return default_;
 }
 
+int
+intOption(const char *option, int default_) {
+    if (!option) {
+        return default_;
+    }
+    return atoi(option);
+}
 } /* namespace trace */
diff --git a/common/trace_option.hpp b/common/trace_option.hpp
index e22a422..0397c97 100644
--- a/common/trace_option.hpp
+++ b/common/trace_option.hpp
@@ -31,7 +31,8 @@ namespace trace {
 
 bool
 boolOption(const char *option, bool default_ = true);
-
+int
+intOption(const char *option, int default_ = 0);
 } /* namespace trace */
 
 #endif /* _TRACE_CALLSET_HPP_ */
diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp
index 746fc56..dda1c2f 100644
--- a/retrace/retrace_main.cpp
+++ b/retrace/retrace_main.cpp
@@ -46,6 +46,7 @@
 
 static bool waitOnFinish = false;
 static bool loopOnFinish = false;
+static bool loopContinuos = false;
 
 static const char *snapshotPrefix = NULL;
 static enum {
@@ -90,7 +91,7 @@ bool singleThread = false;
 
 unsigned frameNo = 0;
 unsigned callNo = 0;
-
+unsigned loopIter = 1;
 
 void
 frameComplete(trace::Call &call) {
@@ -342,9 +343,11 @@ public:
 
             /* Restart last frame if looping is requested. */
             if (loopOnFinish) {
-                if (!call) {
+                if (!call  && (loopIter > 0  || loopContinuos)) {
                     parser.setBookmark(lastFrameStart);
                     call = parser.parse_call();
+                    if (!loopContinuos)
+                        loopIter--;
                 } else if (callEndsFrame) {
                     lastFrameStart = frameStart;
                 }
@@ -584,7 +587,7 @@ usage(const char *argv0) {
         "  -v, --verbose           increase output verbosity\n"
         "  -D, --dump-state=CALL   dump state at specific call no\n"
         "  -w, --wait              waitOnFinish on final frame\n"
-        "      --loop              continuously loop, replaying final frame.\n"
+        "      --loop[=N]          loop N times (N=0 continuously) replaying final frame.\n"
         "      --singlethread      use a single thread to replay command stream\n";
 }
 
@@ -630,7 +633,7 @@ longOptions[] = {
     {"snapshot-interval", required_argument, 0, SNAPSHOT_INTERVAL_OPT},
     {"verbose", no_argument, 0, 'v'},
     {"wait", no_argument, 0, 'w'},
-    {"loop", no_argument, 0, LOOP_OPT},
+    {"loop", optional_argument, 0, LOOP_OPT},
     {"singlethread", no_argument, 0, SINGLETHREAD_OPT},
     {0, 0, 0, 0}
 };
@@ -751,6 +754,9 @@ int main(int argc, char **argv)
             waitOnFinish = true;
             break;
         case LOOP_OPT:
+            loopIter = trace::intOption(optarg);
+            if (loopIter == 0)
+                loopContinuos = true;
             loopOnFinish = true;
             break;
         case PGPU_OPT:
-- 
1.8.1.2



More information about the apitrace mailing list