]> git.cworth.org Git - apitrace/blobdiff - retrace/glretrace_glx.cpp
retrace: Implement glxCopySubBufferMESA
[apitrace] / retrace / glretrace_glx.cpp
index 4e4209600a0487f8238c5a5d3ab843ad88953d9e..7efc3bf38e133ecb18dfce406e7439712a607bde 100644 (file)
@@ -111,10 +111,24 @@ 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());
+
     frame_complete(call);
     if (retrace::doubleBuffer) {
-        currentDrawable->swapBuffers();
+        if (drawable) {
+            drawable->swapBuffers();
+        }
     } else {
         glFlush();
     }
@@ -129,37 +143,14 @@ static void retrace_glXCreateNewContext(trace::Call &call) {
 }
 
 static void retrace_glXCreatePbuffer(trace::Call &call) {
-    int width = 0;
-    int height = 0;
-
-    const trace::Array *attrib_list = dynamic_cast<const trace::Array *>(&call.arg(2));
-    if (attrib_list) {
-        for (size_t i = 0; i + 1 < attrib_list->values.size(); i += 2) {
-            int param = attrib_list->values[i]->toSInt();
-            if (param == 0) {
-                break;
-            }
-
-            int value = attrib_list->values[i + 1]->toSInt();
-
-            switch (param) {
-            case GLX_PBUFFER_WIDTH:
-                width = value;
-                break;
-            case GLX_PBUFFER_HEIGHT:
-                height = value;
-                break;
-            }
-        }
-    }
+    const trace::Value *attrib_list = call.arg(2).toArray();
+    int width = glretrace::parseAttrib(attrib_list, GLX_PBUFFER_WIDTH, 0);
+    int height = glretrace::parseAttrib(attrib_list, GLX_PBUFFER_HEIGHT, 0);
 
     unsigned long long orig_drawable = call.ret->toUInt();
 
-    glws::Drawable *drawable = glretrace::createDrawable();
+    glws::Drawable *drawable = glretrace::createPbuffer(width, height);
     
-    drawable->resize(width, height);
-    drawable->show();
-
     drawable_map[orig_drawable] = drawable;
 }
 
@@ -184,7 +175,7 @@ const retrace::Entry glretrace::glx_callbacks[] = {
     //{"glXBindChannelToWindowSGIX", &retrace_glXBindChannelToWindowSGIX},
     //{"glXBindSwapBarrierNV", &retrace_glXBindSwapBarrierNV},
     //{"glXBindSwapBarrierSGIX", &retrace_glXBindSwapBarrierSGIX},
-    //{"glXBindTexImageEXT", &retrace_glXBindTexImageEXT},
+    {"glXBindTexImageEXT", &retrace::ignore},
     //{"glXChannelRectSGIX", &retrace_glXChannelRectSGIX},
     //{"glXChannelRectSyncSGIX", &retrace_glXChannelRectSyncSGIX},
     {"glXChooseFBConfig", &retrace::ignore},
@@ -192,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},
@@ -201,14 +192,14 @@ const retrace::Entry glretrace::glx_callbacks[] = {
     //{"glXCreateGLXPixmapWithConfigSGIX", &retrace_glXCreateGLXPixmapWithConfigSGIX},
     {"glXCreateNewContext", &retrace_glXCreateNewContext},
     {"glXCreatePbuffer", &retrace_glXCreatePbuffer},
-    //{"glXCreatePixmap", &retrace_glXCreatePixmap},
+    {"glXCreatePixmap", &retrace::ignore},
     //{"glXCreateWindow", &retrace_glXCreateWindow},
     //{"glXCushionSGI", &retrace_glXCushionSGI},
     {"glXDestroyContext", &retrace_glXDestroyContext},
     //{"glXDestroyGLXPbufferSGIX", &retrace_glXDestroyGLXPbufferSGIX},
     //{"glXDestroyGLXPixmap", &retrace_glXDestroyGLXPixmap},
     {"glXDestroyPbuffer", &retrace_glXDestroyPbuffer},
-    //{"glXDestroyPixmap", &retrace_glXDestroyPixmap},
+    {"glXDestroyPixmap", &retrace::ignore},
     //{"glXDestroyWindow", &retrace_glXDestroyWindow},
     //{"glXFreeContextEXT", &retrace_glXFreeContextEXT},
     {"glXGetAGPOffsetMESA", &retrace::ignore},
@@ -230,6 +221,7 @@ const retrace::Entry glretrace::glx_callbacks[] = {
     {"glXGetProcAddress", &retrace::ignore},
     {"glXGetSelectedEvent", &retrace::ignore},
     {"glXGetSelectedEventSGIX", &retrace::ignore},
+    {"glXGetSwapIntervalMESA", &retrace::ignore},
     {"glXGetSyncValuesOML", &retrace::ignore},
     {"glXGetVideoSyncSGI", &retrace::ignore},
     {"glXGetVisualFromFBConfig", &retrace::ignore},
@@ -256,7 +248,7 @@ const retrace::Entry glretrace::glx_callbacks[] = {
     {"glXQuerySwapGroupNV", &retrace::ignore},
     {"glXQueryVersion", &retrace::ignore},
     //{"glXReleaseBuffersMESA", &retrace_glXReleaseBuffersMESA},
-    //{"glXReleaseTexImageEXT", &retrace_glXReleaseTexImageEXT},
+    {"glXReleaseTexImageEXT", &retrace::ignore},
     //{"glXResetFrameCountNV", &retrace_glXResetFrameCountNV},
     //{"glXSelectEvent", &retrace_glXSelectEvent},
     //{"glXSelectEventSGIX", &retrace_glXSelectEventSGIX},