From 993748b1388b5d393588f073d677397eca109f8b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 13 Jan 2012 11:33:36 +0000 Subject: [PATCH] Retrace eglCreatePbufferSurface and eglDestroySurface properly. --- glretrace_egl.cpp | 29 +++++++++++++++++++++++------ glws_egl_xlib.cpp | 2 ++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/glretrace_egl.cpp b/glretrace_egl.cpp index 7393ab1..e4178e3 100644 --- a/glretrace_egl.cpp +++ b/glretrace_egl.cpp @@ -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}, diff --git a/glws_egl_xlib.cpp b/glws_egl_xlib.cpp index c1cb0d9..6655781 100644 --- a/glws_egl_xlib.cpp +++ b/glws_egl_xlib.cpp @@ -150,7 +150,9 @@ public: ~EglDrawable() { eglDestroySurface(eglDisplay, surface); + eglWaitClient(); XDestroyWindow(display, window); + eglWaitNative(EGL_CORE_NATIVE_ENGINE); } void -- 2.45.2