From: Daniel Kurtz <[email protected]>

eglGetProcAddress() only supports extension functions.
Therefore, we must use dlsym() directly on the GL client library to look
up core functions.

The implementation here is a much simplified version of the one in
libepoxy.  Most of the simplification is because piglit dispatch already
knows exactly for which GL API it is looking up a symbol.

Signed-off-by: Daniel Kurtz <[email protected]>
---
 tests/util/piglit-dispatch-init.c | 57 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 55 insertions(+), 2 deletions(-)

diff --git a/tests/util/piglit-dispatch-init.c 
b/tests/util/piglit-dispatch-init.c
index cc8b684..b0e1649 100644
--- a/tests/util/piglit-dispatch-init.c
+++ b/tests/util/piglit-dispatch-init.c
@@ -33,6 +33,8 @@
 
 #else /* Linux */
 
+#include <dlfcn.h>
+
 #if defined(PIGLIT_HAS_GLX)
 #      include "glxew.h"
 #elif defined(PIGLIT_HAS_EGL)
@@ -154,6 +156,42 @@ get_core_proc_address(const char *function_name, int 
gl_10x_version)
 
 #else /* Linux */
 
+#if defined(PIGLIT_HAS_EGL)
+#define GLX_LIB "libGL.so.1"
+#define GLES1_LIB "libGLESv1_CM.so.1"
+#define GLES2_LIB "libGLESv2.so.2"
+
+/** dlopen() return value for libGL.so.1 */
+static void *glx_handle;
+
+/** dlopen() return value for libGLESv1_CM.so.1 */
+static void *gles1_handle;
+
+/** dlopen() return value for libGLESv2.so.2 */
+static void *gles2_handle;
+
+static void *
+do_dlsym(void **handle, const char *lib_name, const char *function_name)
+{
+    void *result;
+
+    if (!*handle)
+        *handle = dlopen(lib_name, RTLD_LAZY | RTLD_LOCAL);
+
+    if (!*handle) {
+        fprintf(stderr, "Could not open %s: %s\n", lib_name, dlerror());
+        return NULL;
+    }
+
+    result = dlsym(*handle, function_name);
+    if (!result)
+        fprintf(stderr, "%s() not found in %s: %s\n", function_name, lib_name,
+                dlerror());
+
+    return result;
+}
+#endif
+
 /**
  * This function is used to retrieve the address of all GL functions
  * on Linux.
@@ -174,16 +212,31 @@ get_ext_proc_address(const char *function_name)
 /**
  * This function is used to retrieve the address of core GL functions
  * on Linux.
+ *
+ * Since eglGetProcAddress() only supports extension functions, we must use
+ * dlsym() directly on the GL client library to lookup core functions.
  */
 static piglit_dispatch_function_ptr
 get_core_proc_address(const char *function_name, int gl_10x_version)
 {
-       /* We don't need to worry about the GL version, since on Apple
+#if defined(PIGLIT_HAS_EGL)
+       switch (gl_10x_version) {
+       case 11:
+               return do_dlsym(&gles1_handle, GLES1_LIB, function_name);
+       case 20:
+               return do_dlsym(&gles2_handle, GLES2_LIB, function_name);
+       case 10:
+       default:
+               /* GL does not have its own library, so use GLX */
+               return do_dlsym(&glx_handle, GLX_LIB, function_name);
+       }
+#else
+       /* We don't need to worry about the GL version, since when using GLX
         * we retrieve all proc addresses in the same way.
         */
        (void) gl_10x_version;
-
        return get_ext_proc_address(function_name);
+#endif
 }
 
 #endif
-- 
2.1.0

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to