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
