[PATCH] glretrace: Eliminate busy-waiting on "glretrace -w"

Carl Worth cworth at cworth.org
Wed Sep 5 12:29:36 PDT 2012


Previously, if the user passed the "-w" option to beable to see the
last frame of the retrace, the glretrace would enter an infinite
busy-waiting loop, consuming as much CPU as possible. The only way to
halt it was to interrupt the process.

Fix this by implementing the retrace::waitForInput() function via a
new glws::Drawable::waitForInput method. This method is currently
implemented only on glws_glx where it correctly waits for a key-press
event. On all other targets this method will simply return immediately
for now.
---

This is a better implementation than the previous patch. It avoids the
arbitrary polling interval by instead adding a new glws method to wait
for keyboard input.

 retrace/glretrace.hpp      |    1 +
 retrace/glretrace_main.cpp |    5 ++++-
 retrace/glretrace_ws.cpp   |    3 ++-
 retrace/glws.hpp           |    6 ++++++
 retrace/glws_glx.cpp       |   15 +++++++++++++--
 5 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/retrace/glretrace.hpp b/retrace/glretrace.hpp
index 10991a4..8c7a268 100644
--- a/retrace/glretrace.hpp
+++ b/retrace/glretrace.hpp
@@ -55,6 +55,7 @@ extern bool insideGlBeginEnd;
 extern bool supportsARBShaderObjects;
 
 extern glws::Drawable *currentDrawable;
+extern glws::Drawable *latestDrawable;
 extern Context *currentContext;
 
 glws::Drawable *
diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp
index 109efd9..55adeb4 100644
--- a/retrace/glretrace_main.cpp
+++ b/retrace/glretrace_main.cpp
@@ -409,8 +409,11 @@ retrace::flushRendering(void) {
 
 void
 retrace::waitForInput(void) {
-    while (glws::processEvents()) {
+    if (!glretrace::latestDrawable) {
+        return;
     }
+
+    glretrace::latestDrawable->waitForInput();
 }
 
 void
diff --git a/retrace/glretrace_ws.cpp b/retrace/glretrace_ws.cpp
index bead54e..5cf8bb8 100644
--- a/retrace/glretrace_ws.cpp
+++ b/retrace/glretrace_ws.cpp
@@ -41,6 +41,7 @@ namespace glretrace {
 
 
 glws::Drawable *currentDrawable = NULL;
+glws::Drawable *latestDrawable = NULL;
 Context *currentContext = NULL;
 
 
@@ -140,7 +141,7 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
     }
 
     if (drawable && context) {
-        currentDrawable = drawable;
+        latestDrawable = currentDrawable = drawable;
         currentContext = context;
     } else {
         currentDrawable = NULL;
diff --git a/retrace/glws.hpp b/retrace/glws.hpp
index 05903a7..a40ee95 100644
--- a/retrace/glws.hpp
+++ b/retrace/glws.hpp
@@ -31,6 +31,7 @@
 #define _GLWS_HPP_
 
 
+#include <iostream>
 #include <vector>
 
 
@@ -121,6 +122,11 @@ public:
     }
 
     virtual void swapBuffers(void) = 0;
+
+    virtual void waitForInput(void) {
+        /* No waiting unless implemented by derived class. */
+        std::cout << "Ack! Virtualized.\n";
+    }
 };
 
 
diff --git a/retrace/glws_glx.cpp b/retrace/glws_glx.cpp
index 1573bb9..b9b0429 100644
--- a/retrace/glws_glx.cpp
+++ b/retrace/glws_glx.cpp
@@ -102,7 +102,7 @@ public:
         attr.background_pixel = 0;
         attr.border_pixel = 0;
         attr.colormap = XCreateColormap(display, root, visinfo->visual, AllocNone);
-        attr.event_mask = StructureNotifyMask;
+        attr.event_mask = StructureNotifyMask | KeyPressMask;
 
         unsigned long mask;
         mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
@@ -138,11 +138,22 @@ public:
     void waitForEvent(int type) {
         XEvent event;
         do {
-            XWindowEvent(display, window, StructureNotifyMask, &event);
+            XWindowEvent(display, window, StructureNotifyMask | KeyPressMask, &event);
             describeEvent(event);
         } while (event.type != type);
     }
 
+    void waitForInput(void) {
+        /* Flush any old events. */
+        while (XPending(display) > 0) {
+            XEvent event;
+            XNextEvent(display, &event);
+        }
+
+        /* Then wait for a new key-press event. */
+        waitForEvent(KeyPress);
+    }
+
     ~GlxDrawable() {
         XDestroyWindow(display, window);
     }
-- 
1.7.10



More information about the apitrace mailing list