From: Carl Worth Date: Mon, 6 May 2013 18:30:06 +0000 (-0700) Subject: Add support for OpenGL ES by conditionally compiling wrapper for eglSwapBuffers X-Git-Url: https://git.cworth.org/git?p=fips;a=commitdiff_plain;h=b1570730174c0efe6431e8b032c5d408c7367a21 Add support for OpenGL ES by conditionally compiling wrapper for eglSwapBuffers The configure script now looks for EGL/egl.h, (via pkg-config or directly), and if present, will compile a wrapper for eglSwapBuffers. This allows fips to report metrics for OpenGL ES programs. --- diff --git a/Makefile.local b/Makefile.local index 2f9b5f0..c81b076 100644 --- a/Makefile.local +++ b/Makefile.local @@ -85,6 +85,10 @@ libfips_srcs = \ glxwrap.c \ metrics.c +ifeq ($(HAVE_EGL),Yes) +libfips_srcs += eglwrap.c +endif + libfips_32_modules = $(libfips_srcs:.c=-32.o) libfips_64_modules = $(libfips_srcs:.c=-64.o) diff --git a/configure b/configure index 121aec4..a799607 100755 --- a/configure +++ b/configure @@ -251,18 +251,37 @@ printf "Checking for GL window-system-binding headers:\n" have_gl_winsys=0 printf " Checking for GL/glx.h... " -have_glx=0 +have_glx=No printf "#include \nint main(void){return 0;}\n" > glx-minimal.c if ${CC} -o glx-minimal glx-minimal.c ${gl_cflags} > /dev/null 2>&1 then printf "Yes.\n" have_gl_winsys=1 - have_glx=1 + have_glx=Yes else printf "No.\n" fi rm -f glx-minimal glx-minimal.c +printf " Checking for GL/egl.h... " +have_egl=No +if pkg-config --exists egl; then + printf "Yes.\n" + have_egl=Yes + egl_cflags=$(pkg-config --cflags egl) +else + printf "#include \nint main(void){return 0;}\n" > egl-minimal.c + if ${CC} -o egl-minimal egl-minimal.c ${gl_cflags} > /dev/null 2>&1 + then + printf "Yes.\n" + have_gl_winsys=1 + have_egl=1 + else + printf "No.\n" + fi + rm -f egl-minimal egl-minimal.c +fi + if [ $have_gl_winsys -eq 0 ]; then errors=$((errors + 1)) fi @@ -291,7 +310,7 @@ EOF echo fi if [ $have_gl_winsys -eq 0 ]; then - echo " OpenGL window-system-bindings header files (GL/glx.h)" + echo " OpenGL window-system-bindings header files (GL/glx.h and/or GL/egl.h)" echo " http://www.mesa3d.org/" echo fi @@ -303,12 +322,12 @@ case a simple command will install everything you need. For example: On Debian and similar systems: sudo apt-get install libtalloc-dev libelf-dev \\ - libgl1-mesa-dev + libgl1-mesa-dev libgles2-mesa-dev Or on Fedora and similar systems: sudo yum install libtalloc-devel libelf-devel \\ - mesa-libGL-devel + mesa-libGL-devel mesa-libGLES-devel On other systems, similar commands can be used, but the details of the package names may be different. @@ -357,8 +376,14 @@ rm -f minimal minimal.c cat < + +#include "dlwrap.h" +#include "metrics.h" + +static void * +eglwrap_lookup (char *name) +{ + const char *libegl_filename = "libEGL.so.1"; + static void *libegl_handle = NULL; + + if (! libegl_handle) { + libegl_handle = dlwrap_real_dlopen (libegl_filename, RTLD_NOW | RTLD_DEEPBIND); + if (! libegl_handle) { + fprintf (stderr, "Error: Failed to dlopen %s\n", + libegl_filename); + exit (1); + } + } + + return dlwrap_real_dlsym (libegl_handle, name); +} + +EGLBoolean +eglSwapBuffers (EGLDisplay dpy, EGLSurface surface) +{ + EGLBoolean ret; + static typeof(&eglSwapBuffers) real_eglSwapBuffers; + + if (! real_eglSwapBuffers) + real_eglSwapBuffers = eglwrap_lookup ("eglSwapBuffers"); + + ret = real_eglSwapBuffers (dpy, surface); + + metrics_end_frame (); + + return ret; +} diff --git a/glxwrap.c b/glxwrap.c index 885f679..d7670a7 100644 --- a/glxwrap.c +++ b/glxwrap.c @@ -26,15 +26,15 @@ #include #include "dlwrap.h" - #include "glwrap.h" +#include "metrics.h" void glXSwapBuffers (Display *dpy, GLXDrawable drawable) { GLWRAP_DEFER (glXSwapBuffers, dpy, drawable); - glwrap_end_frame (); + metrics_end_frame (); } diff --git a/libfips.sym b/libfips.sym index 65567cf..15342a5 100644 --- a/libfips.sym +++ b/libfips.sym @@ -35,6 +35,7 @@ global: glUseProgramObjectARB; glXSwapBuffers; glXGetProcAddressARB; + eglSwapBuffers; local: *; };