Upstream commit to support glxCopySubBufferMESA. Modified to fix compile error with egl. commit 4dc3f3bdc3611ca1b3dec402f9242a036db8c8e4 Author: Carl Worth Date: Thu Oct 17 14:52:21 2013 -0700 retrace: Implement glxCopySubBufferMESA This enables replay of a trace captured on ChromeOS. Note: Replaying on EGL is not supported, (will trigger a warning), since, as far as I know, EGL does not provide an equivalent function. --- apitrace/retrace/glretrace_glx.cpp +++ apitrace/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}, --- apitrace/retrace/glws.hpp +++ apitrace/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; }; --- apitrace/retrace/glws_egl_xlib.cpp +++ apitrace/retrace/glws_egl_xlib.cpp @@ -244,6 +244,10 @@ public: Drawable::show(); } + void copySubBuffer(int x, int y, int width, int height) { + std::cerr << "glws_egl_xlib: Warning: copySubBuffer Not yet implemented\n"; + } + void swapBuffers(void) { eglBindAPI(api); eglSwapBuffers(eglDisplay, surface); --- apitrace/retrace/glws_glx.cpp +++ apitrace/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);