[PATCH] retrace: Implement glxCopySubBufferMESA

Carl Worth cworth at cworth.org
Thu Oct 17 14:54:45 PDT 2013


This enables replay of a trace captured on ChromeOS.

Note: Replaying on EGL is not supported, (will trigger an abort),
since, as far as I know, EGL does not provide an equivalent function.
---
 retrace/glretrace_glx.cpp | 12 +++++++++++-
 retrace/glws.hpp          |  2 ++
 retrace/glws_egl_xlib.cpp |  5 +++++
 retrace/glws_glx.cpp      |  6 ++++++
 4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/retrace/glretrace_glx.cpp b/retrace/glretrace_glx.cpp
index 3179c1e..7efc3bf 100644
--- a/retrace/glretrace_glx.cpp
+++ b/retrace/glretrace_glx.cpp
@@ -111,6 +111,16 @@ static void retrace_glXDestroyContext(trace::Call &call) {
     delete context;
 }
 
+static void retrace_glXCopySubBufferMESA(trace::Call &call) {
+    glws::Drawable *drawable = getDrawable(call.arg(1).toUInt());
+    int x = call.arg(2).toSInt();
+    int y = call.arg(3).toSInt();
+    int width = call.arg(4).toSInt();
+    int height = call.arg(5).toSInt();
+
+    drawable->copySubBuffer(x, y, width, height);
+}
+
 static void retrace_glXSwapBuffers(trace::Call &call) {
     glws::Drawable *drawable = getDrawable(call.arg(1).toUInt());
 
@@ -173,7 +183,7 @@ const retrace::Entry glretrace::glx_callbacks[] = {
     {"glXChooseVisual", &retrace::ignore},
     //{"glXCopyContext", &retrace_glXCopyContext},
     //{"glXCopyImageSubDataNV", &retrace_glXCopyImageSubDataNV},
-    //{"glXCopySubBufferMESA", &retrace_glXCopySubBufferMESA},
+    {"glXCopySubBufferMESA", &retrace_glXCopySubBufferMESA},
     {"glXCreateContextAttribsARB", &retrace_glXCreateContextAttribsARB},
     {"glXCreateContext", &retrace_glXCreateContext},
     //{"glXCreateContextWithConfigSGIX", &retrace_glXCreateContextWithConfigSGIX},
diff --git a/retrace/glws.hpp b/retrace/glws.hpp
index c76e193..a8b6844 100644
--- a/retrace/glws.hpp
+++ b/retrace/glws.hpp
@@ -127,6 +127,8 @@ public:
         visible = true;
     }
 
+    virtual void copySubBuffer(int x, int y, int width, int height) = 0;
+
     virtual void swapBuffers(void) = 0;
 };
 
diff --git a/retrace/glws_egl_xlib.cpp b/retrace/glws_egl_xlib.cpp
index 6bfc40d..7e86887 100644
--- a/retrace/glws_egl_xlib.cpp
+++ b/retrace/glws_egl_xlib.cpp
@@ -244,6 +244,11 @@ public:
         Drawable::show();
     }
 
+    void copySubBuffer(int x, int y, int width, int height) {
+        printf("glws_egl_xlib:copySubBuffer: Not yet implemented\n");
+        exit(1);
+    }
+
     void swapBuffers(void) {
         eglBindAPI(api);
         eglSwapBuffers(eglDisplay, surface);
diff --git a/retrace/glws_glx.cpp b/retrace/glws_glx.cpp
index d150aa6..537ea3c 100644
--- a/retrace/glws_glx.cpp
+++ b/retrace/glws_glx.cpp
@@ -213,6 +213,12 @@ public:
         Drawable::show();
     }
 
+    void copySubBuffer(int x, int y, int width, int height) {
+        glXCopySubBufferMESA(display, window, x, y, width, height);
+
+        processKeys();
+    }
+
     void swapBuffers(void) {
         glXSwapBuffers(display, window);
 
-- 
1.8.4.rc3



More information about the apitrace mailing list