X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=eglwrap.c;h=8317334c8595bca959f5e55101fb5dc844458fd4;hb=6014e77b9f7cf0570fe799fde240970a7cafb7ce;hp=00a8284b1352de7951f6999f40067466cb20b3f7;hpb=9f0b85a2b62ddcd43ef664be7156b8f5bb146367;p=fips diff --git a/eglwrap.c b/eglwrap.c index 00a8284..8317334 100644 --- a/eglwrap.c +++ b/eglwrap.c @@ -21,11 +21,42 @@ #include "fips.h" +#include "fips-dispatch.h" + #include #include "dlwrap.h" #include "metrics.h" +/* Defer to the real 'function' (from libEGL.so.1) to do the real work. + * The symbol is looked up once and cached in a static variable for + * future uses. + */ +#define EGLWRAP_DEFER(function,...) do { \ + static typeof(&function) real_ ## function; \ + if (! real_ ## function) \ + real_ ## function = eglwrap_lookup (#function); \ + real_ ## function(__VA_ARGS__); \ +} while (0); + +/* As EGLWRAP_DEFER, but also set 'ret' to the return value */ +#define EGLWRAP_DEFER_WITH_RETURN(ret, function,...) do { \ + static typeof(&function) real_ ## function; \ + if (! real_ ## function) \ + real_ ## function = eglwrap_lookup (#function); \ + (ret) = real_ ## function(__VA_ARGS__); \ +} while (0); + + +/* Note: We only need to perform a lookup in libEGL.so.1, (not + * libGLESv2.so.2). This is because the functions we wrap, (currently + * wglSwapBufers, eglGetProcAddress, and eglMakeCurrent), exist only + * in libEGL.so.1. + * + * If we *do* later add wrappers for functions that lib in + * libGLESv2.so.2 then those might more naturally live in a file named + * gleswrap.c or so. + */ static void * eglwrap_lookup (char *name) { @@ -48,14 +79,37 @@ EGLBoolean eglSwapBuffers (EGLDisplay dpy, EGLSurface surface) { EGLBoolean ret; - static typeof(&eglSwapBuffers) eglwrap_real_eglSwapBuffers; - if (! eglwrap_real_eglSwapBuffers) - eglwrap_real_eglSwapBuffers = eglwrap_lookup ("eglSwapBuffers"); + EGLWRAP_DEFER_WITH_RETURN (ret, eglSwapBuffers, dpy, surface); + metrics_end_frame (); - ret = eglwrap_real_eglSwapBuffers (dpy, surface); + return ret; +} - metrics_end_frame (); +void (*eglGetProcAddress (char const *func))(void) +{ + void *ret; + + /* If our library has this symbol, that's what we want to give. */ + ret = dlwrap_real_dlsym (NULL, (const char *) func); + if (ret) + return ret; + + /* Otherwise, just defer to the real eglGetProcAddress */ + EGLWRAP_DEFER_WITH_RETURN (ret, eglGetProcAddress, func); + + return ret; +} + +EGLBoolean +eglMakeCurrent (EGLDisplay display, EGLSurface draw, EGLSurface read, + EGLContext context) +{ + EGLBoolean ret; + + fips_dispatch_init (FIPS_API_EGL); + + EGLWRAP_DEFER_WITH_RETURN (ret, eglMakeCurrent, display, draw, read, context); return ret; }