#include "fips.h"
+#include "fips-dispatch.h"
+
#include <EGL/egl.h>
#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)
{
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 ();
+
+ return ret;
+}
- ret = eglwrap_real_eglSwapBuffers (dpy, surface);
+EGLBoolean
+eglMakeCurrent (EGLDisplay display, EGLSurface draw, EGLSurface read,
+ EGLContext context)
+{
+ EGLBoolean ret;
- metrics_end_frame ();
+ fips_dispatch_init (FIPS_API_EGL);
+
+ EGLWRAP_DEFER_WITH_RETURN (ret, eglMakeCurrent, display, draw, read, context);
return ret;
}