]> git.cworth.org Git - fips/commitdiff
dispatch: Fix dispatcher to perform lookup for the GetProcAddress functions
authorCarl Worth <cworth@cworth.org>
Fri, 25 Oct 2013 22:12:25 +0000 (15:12 -0700)
committerCarl Worth <cworth@cworth.org>
Mon, 28 Oct 2013 18:15:20 +0000 (11:15 -0700)
Previously, the fips dispatch code was directly calling
glxGetProcAddressARB and eglGetProcAddress. This meant that the
dispatch code was calling into fips's own version of these functions.

Up until now, that has worked fine, since fips was not implementing
wrappers for any of the functions supported by fips-dispatch, so
fips's GetProcAddress functions were successfully calling the "real"
GetProcAddress functions and the dispatch code was calling the real
functions.

However, we're about to start adding wrappers for functions that are
also dispatched, (such as glBeginQuery). At this point, it would be
incorrect for the dispatch code to return the fips-wrapped
versions. The whole point of wrapping these functions is to make the
application calls into these functions different than the fips calls
into the real functions (through the dispatch).

To fix this, we ensure that the dispatch code calls glwrap_lookup or
eglwrap_lookup to locate the "real" GetProcAddress functions which in
turn ensures that the dispatch code will never resolve to a wrapped
function.

eglwrap.c
eglwrap.h [new file with mode: 0644]
fips-dispatch.c

index 73b7a8d39699001dab539a2c54a0875d6120fad0..f5da71726db498c972d04e78e67748bbca709c00 100644 (file)
--- a/eglwrap.c
+++ b/eglwrap.c
@@ -25,6 +25,7 @@
 
 #include <EGL/egl.h>
 
+#include "eglwrap.h"
 #include "dlwrap.h"
 #include "metrics.h"
 
@@ -53,7 +54,7 @@
  * eglSwapBufers, eglGetProcAddress, and eglMakeCurrent), exist only
  * in libEGL.so.1.
  */
-static void *
+void *
 eglwrap_lookup (char *name)
 {
        const char *libegl_filename = "libEGL.so.1";
diff --git a/eglwrap.h b/eglwrap.h
new file mode 100644 (file)
index 0000000..ed74907
--- /dev/null
+++ b/eglwrap.h
@@ -0,0 +1,29 @@
+/* Copyright © 2013, 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.
+ */
+
+#ifndef EGLWRAP_H
+#define EGLWRAP_H
+
+/* Lookup a function named 'name' in the underlying, real, libEGL.so.1 */
+void *
+eglwrap_lookup (char *name);
+
+#endif
index beb0fa771188ace238d6e749196fada531a0df51..12b0bcb21b3aec757a0787c346a993c5a4162d83 100644 (file)
@@ -27,6 +27,9 @@
 
 #include <EGL/egl.h>
 
+#include "glwrap.h"
+#include "eglwrap.h"
+
 bool fips_dispatch_initialized;
 fips_api_t fips_dispatch_api;
 
@@ -38,11 +41,21 @@ fips_dispatch_init (fips_api_t api)
        fips_dispatch_initialized = true;
 }
 
+typedef void (*generic_function_pointer)(void);
+
 void *
 fips_dispatch_lookup (const char *name)
 {
-       if (fips_dispatch_api == FIPS_API_GLX)
-               return glXGetProcAddressARB ((const GLubyte *)name);
-       else
-               return eglGetProcAddress (name);
+       static PFNGLXGETPROCADDRESSPROC glx_gpa = NULL;
+       static generic_function_pointer (*egl_gpa)(const char *name) = NULL;
+       
+       if (fips_dispatch_api == FIPS_API_GLX) {
+               if (glx_gpa == NULL)
+                       glx_gpa = glwrap_lookup ("glXGetProcAddressARB");
+               return glx_gpa ((const GLubyte *)name);
+       } else {
+               if (egl_gpa == NULL)
+                       egl_gpa = eglwrap_lookup ("eglGetProcAddress");
+               return egl_gpa (name);
+       }
 }