]> git.cworth.org Git - apitrace/commitdiff
retrace: Implement glxCopySubBufferMESA glx-copy-sub-buffer
authorCarl Worth <cworth@cworth.org>
Thu, 17 Oct 2013 21:52:21 +0000 (14:52 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 17 Oct 2013 21:52:21 +0000 (14:52 -0700)
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
retrace/glws.hpp
retrace/glws_egl_xlib.cpp
retrace/glws_glx.cpp

index 3179c1ea7ff34d779635fdcb86d3b1c25dc58979..7efc3bf38e133ecb18dfce406e7439712a607bde 100644 (file)
@@ -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},
index c76e19321706a5c8a02fca80dfcce7774ad2ce6f..a8b6844d117cdef527909dd47c889cf3361574a4 100644 (file)
@@ -127,6 +127,8 @@ public:
         visible = true;
     }
 
+    virtual void copySubBuffer(int x, int y, int width, int height) = 0;
+
     virtual void swapBuffers(void) = 0;
 };
 
index 6bfc40d600f45ad256137c10329acf111ccd1f20..7e86887510ee549ff9339f798d9cb78ec491b31f 100644 (file)
@@ -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);
index d150aa609c5a2acb53c71633c9b97fb0ab77a351..537ea3cfb1ca706c5abada650879919d0389e510 100644 (file)
@@ -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);