]> git.cworth.org Git - apitrace/commitdiff
Retrace eglCreatePbufferSurface and eglDestroySurface properly.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 13 Jan 2012 11:33:36 +0000 (11:33 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 13 Jan 2012 11:33:36 +0000 (11:33 +0000)
glretrace_egl.cpp
glws_egl_xlib.cpp

index 7393ab174b604b47f55118f90874a96e0215f5d6..e4178e307e3dfa8bca267ab8aed36c55020a8c03 100644 (file)
@@ -78,9 +78,8 @@ getContext(unsigned long long context_ptr) {
     return (it != context_map.end()) ? it->second : NULL;
 }
 
-static void retrace_eglCreateWindowSurface(trace::Call &call) {
-    unsigned long long orig_surface = call.ret->toUIntPtr();
-    unsigned long long orig_config = call.arg(1).toUIntPtr();
+static void createDrawable(unsigned long long orig_config, unsigned long long orig_surface)
+{
     ProfileMap::iterator it = profile_map.find(orig_config);
     glws::Profile profile;
 
@@ -93,10 +92,25 @@ static void retrace_eglCreateWindowSurface(trace::Call &call) {
         profile = last_profile;
     }
 
-    glws::Drawable *drawable = glws::createDrawable(glretrace::visual[profile]);
+    glws::Visual *visual = glretrace::visual[profile];
+
+    glws::Drawable *drawable = glws::createDrawable(visual);
     drawable_map[orig_surface] = drawable;
 }
 
+static void retrace_eglCreateWindowSurface(trace::Call &call) {
+    unsigned long long orig_config = call.arg(1).toUIntPtr();
+    unsigned long long orig_surface = call.ret->toUIntPtr();
+    createDrawable(orig_config, orig_surface);
+}
+
+static void retrace_eglCreatePbufferSurface(trace::Call &call) {
+    unsigned long long orig_config = call.arg(1).toUIntPtr();
+    unsigned long long orig_surface = call.ret->toUIntPtr();
+    createDrawable(orig_config, orig_surface);
+    // TODO: Respect the pbuffer dimensions too
+}
+
 static void retrace_eglDestroySurface(trace::Call &call) {
     unsigned long long orig_surface = call.arg(1).toUIntPtr();
 
@@ -104,7 +118,10 @@ static void retrace_eglDestroySurface(trace::Call &call) {
     it = drawable_map.find(orig_surface);
 
     if (it != drawable_map.end()) {
-        delete it->second;
+        if (it->second != drawable) {
+            // TODO: reference count
+            delete it->second;
+        }
         drawable_map.erase(it);
     }
 }
@@ -228,7 +245,7 @@ const retrace::Entry glretrace::egl_callbacks[] = {
     {"eglChooseConfig", &retrace::ignore},
     {"eglGetConfigAttrib", &retrace::ignore},
     {"eglCreateWindowSurface", &retrace_eglCreateWindowSurface},
-    //{"eglCreatePbufferSurface", &retrace::ignore},
+    {"eglCreatePbufferSurface", &retrace_eglCreatePbufferSurface},
     //{"eglCreatePixmapSurface", &retrace::ignore},
     {"eglDestroySurface", &retrace_eglDestroySurface},
     {"eglQuerySurface", &retrace::ignore},
index c1cb0d9dc626f9b126eae00c1d9aa53a83d011c9..66557815017fda939a5edc4e622b84c7e0ee7459 100644 (file)
@@ -150,7 +150,9 @@ public:
 
     ~EglDrawable() {
         eglDestroySurface(eglDisplay, surface);
+        eglWaitClient();
         XDestroyWindow(display, window);
+        eglWaitNative(EGL_CORE_NATIVE_ENGINE);
     }
 
     void