X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fegltrace.py;h=11d3ad2fba32e6d74bbe94ac2906e279069a3bc6;hb=a0708b02018902497da4df6c9be05cd053374afc;hp=65c14efdb69415d67bb7f10f254697b5969dd8a4;hpb=452d3256a3ba7f249222ef857d69c8caaaa753f3;p=apitrace diff --git a/wrappers/egltrace.py b/wrappers/egltrace.py index 65c14ef..11d3ad2 100644 --- a/wrappers/egltrace.py +++ b/wrappers/egltrace.py @@ -33,8 +33,7 @@ from gltrace import GlTracer -from dispatch import function_pointer_type, function_pointer_value -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 @@ -46,35 +45,61 @@ class EglTracer(GlTracer): # The symbols visible in libEGL.so can vary, so expose them all return True + getProcAddressFunctionNames = [ + "eglGetProcAddress", + ] + 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 ' }' - def wrapRet(self, function, instance): - GlTracer.wrapRet(self, function, instance) + if function.name == 'eglDestroyContext': + print ' if (_result) {' + print ' gltrace::releaseContext((uintptr_t)ctx);' + print ' }' - if function.name == "eglGetProcAddress": - print ' %s = __unwrap_proc_addr(procname, %s);' % (instance, instance) + 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 @@ -82,61 +107,23 @@ 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 - print 'static __eglMustCastToProperFunctionPointerType __unwrap_proc_addr(const char * procname, __eglMustCastToProperFunctionPointerType procPtr);' - 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.trace_api(api) - - print 'static __eglMustCastToProperFunctionPointerType __unwrap_proc_addr(const char * procname, __eglMustCastToProperFunctionPointerType procPtr) {' - print ' if (!procPtr) {' - print ' return procPtr;' - print ' }' - for f in api.functions: - ptype = function_pointer_type(f) - pvalue = function_pointer_value(f) - print ' if (!strcmp("%s", procname)) {' % f.name - print ' %s = (%s)procPtr;' % (pvalue, ptype) - print ' return (__eglMustCastToProperFunctionPointerType)&%s;' % (f.name,) - print ' }' - print ' os::log("apitrace: warning: unknown function \\"%s\\"\\n", procname);' - print ' return procPtr;' - print '}' - print - print r''' - - -/* - * Android does not support LD_PRELOAD. - */ -#if !defined(ANDROID) + tracer.traceApi(api) + print r''' -/* - * 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); -} /* @@ -150,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 || @@ -175,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"); } @@ -192,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 */ '''