]> git.cworth.org Git - apitrace/blobdiff - retrace/glretrace_egl.cpp
retrace: Implement glxCopySubBufferMESA
[apitrace] / retrace / glretrace_egl.cpp
index 72368a9ccfe1ee7b19c8bd6006c2189f690548a0..c03d04c2d4fc16743e6b71665c42de5f4d518bcd 100644 (file)
@@ -46,7 +46,7 @@ using namespace glretrace;
 
 
 typedef std::map<unsigned long long, glws::Drawable *> DrawableMap;
-typedef std::map<unsigned long long, glws::Context *> ContextMap;
+typedef std::map<unsigned long long, Context *> ContextMap;
 typedef std::map<unsigned long long, glws::Profile> 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<trace::Array *>(&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,46 +204,37 @@ 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();
     }
 }
 
-static void retrace_glEGLImageTargetTexture2DOES(trace::Call &call)
-{
-    EGLenum target = call.arg(0).toUInt();
-    struct image_blob *iblob;
-    struct image_info *info;
-
-    if (target != GL_TEXTURE_2D) {
-        os::log("%s: target %d not supported\n", __func__, target);
-        return;
-    }
-    iblob = static_cast<struct image_blob *>((call.arg(1)).toPointer());
-    info = &iblob->info;
-
-    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, info->width, info->height, 0,
-                 GL_RGBA, GL_UNSIGNED_BYTE, iblob->data);
-}
-
 const retrace::Entry glretrace::egl_callbacks[] = {
     {"eglGetError", &retrace::ignore},
     {"eglGetDisplay", &retrace::ignore},
@@ -278,6 +271,7 @@ const retrace::Entry glretrace::egl_callbacks[] = {
     //{"eglCopyBuffers", &retrace::ignore},
     {"eglGetProcAddress", &retrace::ignore},
     {"eglCreateImageKHR", &retrace::ignore},
-    {"glEGLImageTargetTexture2DOES", &retrace_glEGLImageTargetTexture2DOES},
+    {"eglDestroyImageKHR", &retrace::ignore},
+    {"glEGLImageTargetTexture2DOES", &retrace::ignore},
     {NULL, NULL},
 };