X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=eglwrap.c;h=6f009c35c53f3017d49cf8e22caa5a8725ca0966;hb=d307a28f436ae7f2d80ce40589328fc64f540947;hp=aaa8cb7815cf3d6bb3ecfb50d144d3e45e4c5754;hpb=b1570730174c0efe6431e8b032c5d408c7367a21;p=fips diff --git a/eglwrap.c b/eglwrap.c index aaa8cb7..6f009c3 100644 --- a/eglwrap.c +++ b/eglwrap.c @@ -26,6 +26,26 @@ #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); + + static void * eglwrap_lookup (char *name) { @@ -48,13 +68,8 @@ 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); + EGLWRAP_DEFER_WITH_RETURN (ret, eglSwapBuffers, dpy, surface); metrics_end_frame (); return ret;