X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fegltrace.py;h=11d3ad2fba32e6d74bbe94ac2906e279069a3bc6;hb=8b095e5763690867bdc5e8ae204e0712a669b880;hp=4972528fe0e09ed21ff35307696824d0864215cb;hpb=1b6c87507810fe2d72c81fc109110c1ca25ce94f;p=apitrace diff --git a/wrappers/egltrace.py b/wrappers/egltrace.py index 4972528..11d3ad2 100644 --- a/wrappers/egltrace.py +++ b/wrappers/egltrace.py @@ -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,26 +52,54 @@ 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 ' // update the profile' - print ' if (ctx != EGL_NO_CONTEXT) {' - print ' EGLint api = EGL_OPENGL_ES_API, version = 1;' - print ' gltrace::Context *tr = gltrace::getContext();' - print ' __eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_TYPE, &api);' - print ' __eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_VERSION, &version);' - print ' if (api == EGL_OPENGL_API)' - print ' tr->profile = gltrace::PROFILE_COMPAT;' - print ' else if (version == 1)' - print ' tr->profile = gltrace::PROFILE_ES1;' - print ' else' - print ' tr->profile = gltrace::PROFILE_ES2;' + 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);' + print ' if (api == EGL_OPENGL_API)' + print ' tr->profile = gltrace::PROFILE_COMPAT;' + print ' else if (version == 1)' + 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 ' print '#include ' - print '#include ' print print '#include "trace_writer_local.hpp"' print @@ -79,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 * (*PFNDLOPEN)(const char *, int); - static PFNDLOPEN dlopen_ptr = NULL; - - if (!dlopen_ptr) { - dlopen_ptr = (PFNDLOPEN)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 @@ -130,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 || @@ -155,14 +162,14 @@ void * dlopen(const char *filename, int flag) } } - void *handle = __dlopen(filename, flag); + void *handle = _dlopen(filename, flag); if (intercept) { // Get the file path for our shared object, and use it instead static int dummy = 0xdeedbeef; Dl_info info; if (dladdr(&dummy, &info)) { - handle = __dlopen(info.dli_fname, flag); + handle = _dlopen(info.dli_fname, flag); } else { os::log("apitrace: warning: dladdr() failed\n"); } @@ -172,8 +179,65 @@ void * dlopen(const char *filename, int flag) } -#endif /* !ANDROID */ +#if defined(ANDROID) + +/* + * Undocumented Android extensions used by Dalvik which have bound information + * passed to it, but is currently ignored, so probably unreliable. + * + * See: + * https://github.com/android/platform_frameworks_base/blob/master/opengl/libs/GLES_CM/gl.cpp + */ + +extern "C" PUBLIC +void APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) { + (void)count; + glColorPointer(size, type, stride, pointer); +} + +extern "C" PUBLIC +void APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) { + (void)count; + glNormalPointer(type, stride, pointer); +} + +extern "C" PUBLIC +void APIENTRY glTexCoordPointerBounds(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) { + (void)count; + glTexCoordPointer(size, type, stride, pointer); +} + +extern "C" PUBLIC +void APIENTRY glVertexPointerBounds(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) { + (void)count; + glVertexPointer(size, type, stride, pointer); +} + +extern "C" PUBLIC +void GL_APIENTRY glPointSizePointerOESBounds(GLenum type, GLsizei stride, const GLvoid *pointer, GLsizei count) { + (void)count; + glPointSizePointerOES(type, stride, pointer); +} + +extern "C" PUBLIC +void APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer, GLsizei count) { + (void)count; + glMatrixIndexPointerOES(size, type, stride, pointer); +} + +extern "C" PUBLIC +void APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer, GLsizei count) { + (void)count; + glWeightPointerOES(size, type, stride, pointer); +} + +/* + * There is also a glVertexAttribPointerBounds in + * https://github.com/android/platform_frameworks_base/blob/master/opengl/tools/glgen/stubs/gles11/GLES20cHeader.cpp + * but is it not exported. + */ +#endif /* ANDROID */ '''