]> git.cworth.org Git - fips/commitdiff
fips-dispatch: Completely separate fips-dispatch GL prototypes from GL/gl.h
authorCarl Worth <cworth@cworth.org>
Mon, 24 Jun 2013 20:22:59 +0000 (13:22 -0700)
committerCarl Worth <cworth@cworth.org>
Mon, 24 Jun 2013 20:31:49 +0000 (13:31 -0700)
Move the OpenGL prototypes previously in fips-dispatch.h to a new
fips-dispatch-gl.h. The idea here is that any given file should
include only one of GL/gl.h or fips-dispatch-gl.h.

Files that implement libfips wrappers for OpenGL functions include
GL/gl.h to ensure that they implement functions with the correct
prototypes.

Meanwhile, files that call into OpenGL functions at run-time, (such as
metrics.c which calls the various OpenGL query-related functions),
instead include fips-dispatch-gl.h and do not include GL/gl.h. With
this approach, any new calls to OpenGL functions will cause
compilation warnings if the stubs are not also added to
fips-dispatch-gl.h.

Makefile.local
fips-dispatch-gl.c [new file with mode: 0644]
fips-dispatch-gl.h [new file with mode: 0644]
fips-dispatch.c
fips-dispatch.h
glwrap.c
metrics.c

index 9b54011107d05e7a60d6e5dfc251da8e8821b378..f468c646de2028cc47c7bb73ce8f92d49f32cdc3 100644 (file)
@@ -95,6 +95,7 @@ extra_cflags += -I$(srcdir) -fPIC
 libfips_srcs = \
        dlwrap.c \
        fips-dispatch.c \
+       fips-dispatch-gl.c \
        glwrap.c \
        glxwrap.c \
        metrics.c
diff --git a/fips-dispatch-gl.c b/fips-dispatch-gl.c
new file mode 100644 (file)
index 0000000..cd9e35e
--- /dev/null
@@ -0,0 +1,149 @@
+/* Copyright © 2012, Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "fips-dispatch-gl.h"
+
+static void
+check_initialized (void)
+{
+       if (fips_dispatch_initialized)
+               return;
+
+       fprintf (stderr,
+                "Internal error: fips_dispatch_init must be called before\n"
+                "any OpenGL function supported via fips_dispatch.\n");
+       exit (1);
+}
+
+static void
+unsupported (const char *name)
+{
+       fprintf (stderr, "Error: fips failed to find support for %s\n", name);
+
+       exit (1);
+}
+
+static void
+resolve_glGenQueries (void)
+{
+       fips_dispatch_glGenQueries = fips_dispatch_lookup ("glGenQueries");
+
+       if (! fips_dispatch_glGenQueries)
+               fips_dispatch_glGenQueries = fips_dispatch_lookup ("glGenQueriesARB");
+
+       if (! fips_dispatch_glGenQueries)
+               unsupported ("GenQueries");
+}
+
+static void
+stub_glGenQueries (GLsizei n, GLuint *ids)
+{
+       check_initialized ();
+       resolve_glGenQueries ();
+       fips_dispatch_glGenQueries (n, ids);
+}
+
+PFNGLGENQUERIESPROC fips_dispatch_glGenQueries = stub_glGenQueries;
+
+static void
+resolve_glDeleteQueries (void)
+{
+       fips_dispatch_glDeleteQueries = fips_dispatch_lookup ("glDeleteQueries");
+
+       if (! fips_dispatch_glDeleteQueries)
+               fips_dispatch_glDeleteQueries = fips_dispatch_lookup ("glDeleteQueriesARB");
+
+       if (! fips_dispatch_glDeleteQueries)
+               unsupported ("DeleteQueries");
+}
+
+static void
+stub_glDeleteQueries (GLsizei n, const GLuint * ids)
+{
+       check_initialized ();
+       resolve_glDeleteQueries ();
+       fips_dispatch_glDeleteQueries (n, ids);
+}
+
+PFNGLDELETEQUERIESPROC fips_dispatch_glDeleteQueries = stub_glDeleteQueries;
+
+static void
+resolve_glBeginQuery (void)
+{
+       fips_dispatch_glBeginQuery = fips_dispatch_lookup ("glBeginQuery");
+
+       if (! fips_dispatch_glBeginQuery)
+               fips_dispatch_glBeginQuery = fips_dispatch_lookup ("glBeginQueryARB");
+
+       if (! fips_dispatch_glBeginQuery)
+               unsupported ("BeginQuery");
+}
+
+static void
+stub_glBeginQuery (GLenum target, GLuint id)
+{
+       check_initialized ();
+       resolve_glBeginQuery ();
+       fips_dispatch_glBeginQuery (target, id);
+}
+
+PFNGLBEGINQUERYPROC fips_dispatch_glBeginQuery = stub_glBeginQuery;
+
+static void
+resolve_glEndQuery (void)
+{
+       fips_dispatch_glEndQuery = fips_dispatch_lookup ("glEndQuery");
+
+       if (! fips_dispatch_glEndQuery)
+               fips_dispatch_glEndQuery = fips_dispatch_lookup ("glEndQueryARB");
+
+       if (! fips_dispatch_glEndQuery)
+               unsupported ("EndQuery");
+}
+
+static void
+stub_glEndQuery (GLenum target)
+{
+       check_initialized ();
+       resolve_glEndQuery ();
+       fips_dispatch_glEndQuery (target);
+}
+
+PFNGLENDQUERYPROC fips_dispatch_glEndQuery = stub_glEndQuery;
+
+static void
+resolve_glGetQueryObjectuiv (void)
+{
+       fips_dispatch_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) fips_dispatch_lookup ("glGetQueryObjectuivARB");
+
+       if (! fips_dispatch_glGetQueryObjectuiv)
+               unsupported ("GetQueryObjectuiv");
+}
+
+static void
+stub_glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint * params)
+{
+       check_initialized ();
+       resolve_glGetQueryObjectuiv ();
+       fips_dispatch_glGetQueryObjectuiv (id, pname, params);
+}
+
+PFNGLGETQUERYOBJECTUIVPROC fips_dispatch_glGetQueryObjectuiv = stub_glGetQueryObjectuiv;
diff --git a/fips-dispatch-gl.h b/fips-dispatch-gl.h
new file mode 100644 (file)
index 0000000..928d139
--- /dev/null
@@ -0,0 +1,90 @@
+/* Copyright © 2012, Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* This header file provides an interface to (the fips-dispatch subset
+ * of) OpenGL through dynamic dispatch as an alternative to including
+ * <GL/gl.h>.
+ *
+ * No file in fips should include both <GL/gl.h> and
+ * "fips-dispatch-gl.h" (whether directly or indirectly).
+ */
+
+#ifndef FIPS_DISPATCH_GL_H
+#define FIPS_DISPATCH_GL_H
+
+#include "fips-dispatch.h"
+
+#include <stdint.h>
+#include <stddef.h>
+
+typedef unsigned int GLenum;
+typedef unsigned int GLbitfield;
+typedef unsigned int GLuint;
+typedef int GLint;
+typedef int GLsizei;
+typedef unsigned char GLboolean;
+typedef signed char GLbyte;
+typedef short GLshort;
+typedef unsigned char GLubyte;
+typedef unsigned short GLushort;
+typedef unsigned long GLulong;
+typedef float GLfloat;
+typedef float GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void GLvoid;
+typedef int64_t GLint64EXT;
+typedef uint64_t GLuint64EXT;
+typedef GLint64EXT  GLint64;
+typedef GLuint64EXT GLuint64;
+typedef char GLchar;
+typedef ptrdiff_t GLintptr;
+typedef ptrdiff_t GLsizeiptr;
+typedef ptrdiff_t GLintptrARB;
+typedef ptrdiff_t GLsizeiptrARB;
+typedef char GLcharARB;
+typedef unsigned int GLhandleARB;
+
+typedef void (*PFNGLGENQUERIESPROC)(GLsizei, GLuint *);
+typedef void (*PFNGLDELETEQUERIESPROC)(GLsizei, const GLuint *);
+typedef void (*PFNGLBEGINQUERYPROC)(GLenum, GLuint);
+typedef void (*PFNGLENDQUERYPROC)(GLenum);
+typedef void (*PFNGLGETQUERYOBJECTUIVPROC)(GLuint, GLenum, GLuint *);
+
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+
+extern PFNGLGENQUERIESPROC fips_dispatch_glGenQueries;
+#define glGenQueries fips_dispatch_glGenQueries
+
+extern PFNGLDELETEQUERIESPROC fips_dispatch_glDeleteQueries;
+#define glDeleteQueries fips_dispatch_glDeleteQueries
+
+extern PFNGLBEGINQUERYPROC fips_dispatch_glBeginQuery;
+#define glBeginQuery fips_dispatch_glBeginQuery
+
+extern PFNGLENDQUERYPROC fips_dispatch_glEndQuery;
+#define glEndQuery fips_dispatch_glEndQuery
+
+extern PFNGLGETQUERYOBJECTUIVPROC fips_dispatch_glGetQueryObjectuiv;
+#define glGetQueryObjectuiv fips_dispatch_glGetQueryObjectuiv
+
+#endif /* FIPS_DISPATCH_GL_H */
index c5f767cee7f2112e34c768d829d892013292dc81..beb0fa771188ace238d6e749196fada531a0df51 100644 (file)
@@ -19,8 +19,6 @@
  * THE SOFTWARE.
  */
 
-#include "fips.h"
-
 #include "fips-dispatch.h"
 
 #define GL_GLEXT_PROTOTYPES
 
 #include <EGL/egl.h>
 
-static bool fips_initialized;
-static fips_api_t fips_api;
+bool fips_dispatch_initialized;
+fips_api_t fips_dispatch_api;
 
 void
 fips_dispatch_init (fips_api_t api)
 {
-       fips_api = api;
-
-       fips_initialized = true;
-}
-
-static void
-check_initialized (void)
-{
-       if (fips_initialized)
-               return;
-
-       fprintf (stderr,
-                "Internal error: fips_dispatch_init must be called before\n"
-                "any OpenGL function supported via fips_dispatch.\n");
-       exit (1);
-}
-
-static void
-unsupported (const char *name)
-{
-       fprintf (stderr, "Error: fips failed to find support for %s\n", name);
+       fips_dispatch_api = api;
 
-       exit (1);
+       fips_dispatch_initialized = true;
 }
 
-static void *
-lookup (const char *name)
+void *
+fips_dispatch_lookup (const char *name)
 {
-       if (fips_api == FIPS_API_GLX)
+       if (fips_dispatch_api == FIPS_API_GLX)
                return glXGetProcAddressARB ((const GLubyte *)name);
        else
                return eglGetProcAddress (name);
 }
-
-static void
-resolve_glGenQueries (void)
-{
-       fips_dispatch_glGenQueries = lookup ("glGenQueries");
-
-       if (! fips_dispatch_glGenQueries)
-               fips_dispatch_glGenQueries = lookup ("glGenQueriesARB");
-
-       if (! fips_dispatch_glGenQueries)
-               unsupported ("GenQueries");
-}
-
-static void
-stub_glGenQueries (GLsizei n, GLuint *ids)
-{
-       check_initialized ();
-       resolve_glGenQueries ();
-       fips_dispatch_glGenQueries (n, ids);
-}
-
-PFNGLGENQUERIESPROC fips_dispatch_glGenQueries = stub_glGenQueries;
-
-static void
-resolve_glDeleteQueries (void)
-{
-       fips_dispatch_glDeleteQueries = lookup ("glDeleteQueries");
-
-       if (! fips_dispatch_glDeleteQueries)
-               fips_dispatch_glDeleteQueries = lookup ("glDeleteQueriesARB");
-
-       if (! fips_dispatch_glDeleteQueries)
-               unsupported ("DeleteQueries");
-}
-
-static void
-stub_glDeleteQueries (GLsizei n, const GLuint * ids)
-{
-       check_initialized ();
-       resolve_glDeleteQueries ();
-       fips_dispatch_glDeleteQueries (n, ids);
-}
-
-PFNGLDELETEQUERIESPROC fips_dispatch_glDeleteQueries = stub_glDeleteQueries;
-
-static void
-resolve_glBeginQuery (void)
-{
-       fips_dispatch_glBeginQuery = lookup ("glBeginQuery");
-
-       if (! fips_dispatch_glBeginQuery)
-               fips_dispatch_glBeginQuery = lookup ("glBeginQueryARB");
-
-       if (! fips_dispatch_glBeginQuery)
-               unsupported ("BeginQuery");
-}
-
-static void
-stub_glBeginQuery (GLenum target, GLuint id)
-{
-       check_initialized ();
-       resolve_glBeginQuery ();
-       fips_dispatch_glBeginQuery (target, id);
-}
-
-PFNGLBEGINQUERYPROC fips_dispatch_glBeginQuery = stub_glBeginQuery;
-
-static void
-resolve_glEndQuery (void)
-{
-       fips_dispatch_glEndQuery = lookup ("glEndQuery");
-
-       if (! fips_dispatch_glEndQuery)
-               fips_dispatch_glEndQuery = lookup ("glEndQueryARB");
-
-       if (! fips_dispatch_glEndQuery)
-               unsupported ("EndQuery");
-}
-
-static void
-stub_glEndQuery (GLenum target)
-{
-       check_initialized ();
-       resolve_glEndQuery ();
-       fips_dispatch_glEndQuery (target);
-}
-
-PFNGLENDQUERYPROC fips_dispatch_glEndQuery = stub_glEndQuery;
-
-static void
-resolve_glGetQueryObjectuiv (void)
-{
-       fips_dispatch_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVARBPROC) lookup("glGetQueryObjectuivARB");
-
-       if (! fips_dispatch_glGetQueryObjectuiv)
-               unsupported ("GetQueryObjectuiv");
-}
-
-static void
-stub_glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint * params)
-{
-       check_initialized ();
-       resolve_glGetQueryObjectuiv ();
-       fips_dispatch_glGetQueryObjectuiv (id, pname, params);
-}
-
-PFNGLGETQUERYOBJECTUIVPROC fips_dispatch_glGetQueryObjectuiv = stub_glGetQueryObjectuiv;
index a3717032f84614e165a32d2fa54c8f38552f3edf..8938e61fb74501d2710c0f30280e48e653259add 100644 (file)
  * THE SOFTWARE.
  */
 
+/* This header file provides prototypes to iniatialize the
+ * fips-dispatch system (fips_dispatch_init) but does not provide the
+ * prototypes for dynamically-dipatched OpenGL functions.
+ * See fips-dispatch-gl.h for those.
+ */
+
 #ifndef FIPS_DISPATCH_H
 #define FIPS_DISPATCH_H
 
-#define GL_GLEXT_PROTOTYPES
-#include <GL/gl.h>
-
-extern PFNGLGENQUERIESPROC fips_dispatch_glGenQueries;
-#define glGenQueries fips_dispatch_glGenQueries
-
-extern PFNGLDELETEQUERIESPROC fips_dispatch_glDeleteQueries;
-#define glDeleteQueries fips_dispatch_glDeleteQueries
-
-extern PFNGLBEGINQUERYPROC fips_dispatch_glBeginQuery;
-#define glBeginQuery fips_dispatch_glBeginQuery
-
-extern PFNGLENDQUERYPROC fips_dispatch_glEndQuery;
-#define glEndQuery fips_dispatch_glEndQuery
-
-extern PFNGLGETQUERYOBJECTUIVPROC fips_dispatch_glGetQueryObjectuiv;
-#define glGetQueryObjectuiv fips_dispatch_glGetQueryObjectuiv
+#include "fips.h"
 
 typedef enum {
        FIPS_API_GLX,
        FIPS_API_EGL
 } fips_api_t;
 
+extern bool fips_dispatch_initialized;
+extern fips_api_t fips_dispatch_api;
+
+/* Initialize fips-dispatch with the appropriate API, (whether GLX or
+ * EGL, etc.). */
 void
 fips_dispatch_init (fips_api_t api);
 
+/* Lookup a named symbol, (via either glXGetProcAddressARB or
+ * eglGetProcAddress).
+ *
+ * Note: No user of fips-dispatch need ever call this
+ * function. Instead, users should simply include fips-dispatch-gl.h,
+ * then make direct calls to GL functions and through some
+ * C-preprocessor magic, the lookup will magically happen at
+ * runtime.
+ */
+void *
+fips_dispatch_lookup (const char *name);
+
 #endif /* FIPS_DISPATCH_H */
index e92889a7688da5efb636f1fc4503c251e3f91b79..bcb8111a03e990baa9298c3c939f2f77494a11ad 100644 (file)
--- a/glwrap.c
+++ b/glwrap.c
  */
 #define const
 
+#define GL_GLEXT_PROTOTYPES
+#include <GL/gl.h>
+
 #include "fips.h"
-#include "fips-dispatch.h"
 
 #include "glwrap.h"
 
index cbfe52e9d1ce6d8c19bed45c9d038b11d14bfa0e..7298fa82bb093ba225371132e03abb1339df3077 100644 (file)
--- a/metrics.c
+++ b/metrics.c
@@ -24,7 +24,8 @@
 
 #include <sys/time.h>
 
-#include "fips-dispatch.h"
+#include "fips-dispatch-gl.h"
+
 #include "metrics.h"
 
 typedef struct counter