X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglretrace_egl.cpp;h=c03d04c2d4fc16743e6b71665c42de5f4d518bcd;hb=8cf630712592eea93b1a1988a0875fe293e6aea8;hp=43e8169836b257c73c08a75fc61f5a77b813b92f;hpb=c748fbcb434374ec13e14cc837ade7c581789e0c;p=apitrace diff --git a/retrace/glretrace_egl.cpp b/retrace/glretrace_egl.cpp index 43e8169..c03d04c 100644 --- a/retrace/glretrace_egl.cpp +++ b/retrace/glretrace_egl.cpp @@ -46,7 +46,7 @@ using namespace glretrace; typedef std::map DrawableMap; -typedef std::map ContextMap; +typedef std::map ContextMap; typedef std::map ProfileMap; static DrawableMap drawable_map; static ContextMap context_map; @@ -77,7 +77,7 @@ getDrawable(unsigned long long surface_ptr) { return (it != drawable_map.end()) ? it->second : NULL; } -static glws::Context * +static Context * getContext(unsigned long long context_ptr) { if (context_ptr == 0) { return NULL; @@ -127,7 +127,8 @@ static void retrace_eglDestroySurface(trace::Call &call) { it = drawable_map.find(orig_surface); if (it != drawable_map.end()) { - if (it->second != currentDrawable) { + glretrace::Context *currentContext = glretrace::getCurrentContext(); + if (!currentContext || it->second != currentContext->drawable) { // TODO: reference count delete it->second; } @@ -137,13 +138,14 @@ static void retrace_eglDestroySurface(trace::Call &call) { static void retrace_eglBindAPI(trace::Call &call) { current_api = call.arg(0).toUInt(); + eglBindAPI(current_api); } static void retrace_eglCreateContext(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); unsigned long long orig_config = call.arg(1).toUIntPtr(); - glws::Context *share_context = getContext(call.arg(2).toUIntPtr()); - trace::Array *attrib_array = dynamic_cast(&call.arg(3)); + Context *share_context = getContext(call.arg(2).toUIntPtr()); + trace::Array *attrib_array = call.arg(3).toArray(); glws::Profile profile; switch (current_api) { @@ -168,7 +170,7 @@ static void retrace_eglCreateContext(trace::Call &call) { } - glws::Context *context = glretrace::createContext(share_context, profile); + Context *context = glretrace::createContext(share_context, profile); if (!context) { const char *name; switch (profile) { @@ -187,7 +189,7 @@ static void retrace_eglCreateContext(trace::Call &call) { } retrace::warning(call) << "Failed to create " << name << " context.\n"; - os::abort(); + exit(1); } context_map[orig_context] = context; @@ -202,24 +204,32 @@ static void retrace_eglDestroyContext(trace::Call &call) { it = context_map.find(orig_context); if (it != context_map.end()) { - delete it->second; + glretrace::Context *currentContext = glretrace::getCurrentContext(); + if (it->second != currentContext) { + // TODO: reference count + delete it->second; + } context_map.erase(it); } } static void retrace_eglMakeCurrent(trace::Call &call) { glws::Drawable *new_drawable = getDrawable(call.arg(1).toUIntPtr()); - glws::Context *new_context = getContext(call.arg(3).toUIntPtr()); + Context *new_context = getContext(call.arg(3).toUIntPtr()); glretrace::makeCurrent(call, new_drawable, new_context); } static void retrace_eglSwapBuffers(trace::Call &call) { + glws::Drawable *drawable = getDrawable(call.arg(1).toUIntPtr()); + frame_complete(call); - if (retrace::doubleBuffer && currentDrawable) { - currentDrawable->swapBuffers(); + if (retrace::doubleBuffer) { + if (drawable) { + drawable->swapBuffers(); + } } else { glFlush(); }