]> git.cworth.org Git - apitrace/blobdiff - wrappers/egltrace.py
image: Allow to read PNG from a C++ stream.
[apitrace] / wrappers / egltrace.py
index f40b8a06a863e2875d8704d6c8f64d4f03d1e82c..11d3ad2fba32e6d74bbe94ac2906e279069a3bc6 100644 (file)
@@ -33,7 +33,7 @@
 
 
 from gltrace import GlTracer
-from specs.stdapi import API
+from specs.stdapi import Module, API
 from specs.glapi import glapi
 from specs.eglapi import eglapi
 from specs.glesapi import glesapi
@@ -52,11 +52,16 @@ class EglTracer(GlTracer):
     def traceFunctionImplBody(self, function):
         GlTracer.traceFunctionImplBody(self, function)
 
+        if function.name == 'eglCreateContext':
+            print '    if (_result != EGL_NO_CONTEXT)'
+            print '        gltrace::createContext((uintptr_t)_result);'
+
         if function.name == 'eglMakeCurrent':
             print '    if (_result) {'
             print '        // update the profile'
             print '        if (ctx != EGL_NO_CONTEXT) {'
             print '            EGLint api = EGL_OPENGL_ES_API, version = 1;'
+            print '            gltrace::setContext((uintptr_t)ctx);'
             print '            gltrace::Context *tr = gltrace::getContext();'
             print '            _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_TYPE, &api);'
             print '            _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_VERSION, &version);'
@@ -66,14 +71,35 @@ class EglTracer(GlTracer):
             print '                tr->profile = gltrace::PROFILE_ES1;'
             print '            else'
             print '                tr->profile = gltrace::PROFILE_ES2;'
+            print '        } else {'
+            print '            gltrace::clearContext();'
             print '        }'
             print '    }'
 
+        if function.name == 'eglDestroyContext':
+            print '    if (_result) {'
+            print '        gltrace::releaseContext((uintptr_t)ctx);'
+            print '    }'
+
+        if function.name == 'glEGLImageTargetTexture2DOES':
+            print '    image_info *info = _EGLImageKHR_get_image_info(target, image);'
+            print '    if (info) {'
+            print '        GLint level = 0;'
+            print '        GLint internalformat = info->internalformat;'
+            print '        GLsizei width = info->width;'
+            print '        GLsizei height = info->height;'
+            print '        GLint border = 0;'
+            print '        GLenum format = info->format;'
+            print '        GLenum type = info->type;'
+            print '        const GLvoid * pixels = info->pixels;'
+            self.emitFakeTexture2D()
+            print '        _EGLImageKHR_free_image_info(info);'
+            print '    }'
+
 
 if __name__ == '__main__':
     print '#include <stdlib.h>'
     print '#include <string.h>'
-    print '#include <dlfcn.h>'
     print
     print '#include "trace_writer_local.hpp"'
     print
@@ -81,45 +107,24 @@ if __name__ == '__main__':
     print '#define GL_GLEXT_PROTOTYPES'
     print '#define EGL_EGLEXT_PROTOTYPES'
     print
+    print '#include "dlopen.hpp"'
     print '#include "glproc.hpp"'
     print '#include "glsize.hpp"'
+    print '#include "eglsize.hpp"'
     print
     
+    module = Module()
+    module.mergeModule(eglapi)
+    module.mergeModule(glapi)
+    module.mergeModule(glesapi)
     api = API()
-    api.addApi(eglapi)
-    api.addApi(glapi)
-    api.addApi(glesapi)
+    api.addModule(module)
     tracer = EglTracer()
     tracer.traceApi(api)
 
     print r'''
 
 
-/*
- * Android does not support LD_PRELOAD.
- */
-#if !defined(ANDROID)
-
-
-/*
- * Invoke the true dlopen() function.
- */
-static void *_dlopen(const char *filename, int flag)
-{
-    typedef void * (*PFN_DLOPEN)(const char *, int);
-    static PFN_DLOPEN dlopen_ptr = NULL;
-
-    if (!dlopen_ptr) {
-        dlopen_ptr = (PFN_DLOPEN)dlsym(RTLD_NEXT, "dlopen");
-        if (!dlopen_ptr) {
-            os::log("apitrace: error: dlsym(RTLD_NEXT, \"dlopen\") failed\n");
-            return NULL;
-        }
-    }
-
-    return dlopen_ptr(filename, flag);
-}
-
 
 /*
  * Several applications, such as Quake3, use dlopen("libGL.so.1"), but
@@ -132,7 +137,7 @@ void * dlopen(const char *filename, int flag)
 {
     bool intercept = false;
 
-    if (filename) {
+    if (filename && trace::isTracingEnabled()) {
         intercept =
             strcmp(filename, "libEGL.so") == 0 ||
             strcmp(filename, "libEGL.so.1") == 0 ||
@@ -174,9 +179,6 @@ void * dlopen(const char *filename, int flag)
 }
 
 
-#endif /* !ANDROID */
-
-
 #if defined(ANDROID)
 
 /*