[Piglit] [PATCH] dispatch: Fix lookup for core OpenGL symbols
Chad Versace
chad.versace at intel.com
Wed Apr 29 19:29:47 PDT 2015
The following commit regressed lookup of some new OpenGL symbols:
commit cb334db3f2bb7ddf9b2f43641f898896f99c69b1
Author: Daniel Kurtz <djkurtz at chromium.org>
Date: Thu Oct 16 21:36:01 2014 +0800
Subject: dispatch: Use dlsym to lookup core symbols for EGL (v2)
It regressed these Piglit tests on i965:
spec at arb_pipeline_statistics_query@arb_pipeline_statistics_query-vert_adj
spec at arb_pipeline_statistics_query@arb_pipeline_statistics_query-geom
Fix the tests by consistently using egl/glXGetProcAddress to lookup core
OpenGL symbols instead of dlsym(), and add a lengthy comment explaining
why. (For core OpenGL ES symbols, continue using dlsym() as in
cb334db3).
Cc: Marek Olšák <marek.olsak at amd.com>
Cc: Mark Janes <mark.a.janes at intel.com>
Cc: Daniel Kurtz <djkurtz at chromium.org>
---
tests/util/piglit-dispatch-init.c | 42 +++++++++++++++++++++++++++++----------
1 file changed, 31 insertions(+), 11 deletions(-)
diff --git a/tests/util/piglit-dispatch-init.c b/tests/util/piglit-dispatch-init.c
index a47d4cc..ead6d2f 100644
--- a/tests/util/piglit-dispatch-init.c
+++ b/tests/util/piglit-dispatch-init.c
@@ -157,13 +157,9 @@ 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;
@@ -213,11 +209,32 @@ get_ext_proc_address(const char *function_name)
* This function is used to retrieve the address of core GL functions
* on Linux.
*
- * eglGetProcAddress supports querying core functions only if EGL >= 1.5
- * or if EGL_KHR_get_all_proc_addresses or
- * EGL_KHR_client_get_all_proc_addresses is supported. Rather than worry
- * about such details, when using EGL we consistently use dlsym() on the
- * client library to lookup core functions.
+ * eglGetProcAddress supports querying core functions only if EGL >= 1.5 or if
+ * EGL_KHR_get_all_proc_addresses or EGL_KHR_client_get_all_proc_addresses is
+ * supported. Rather than worry about such details, we consistently use dlysm()
+ * to lookup core *OpenGL ES* functions on systems where EGL is available.
+ *
+ * Lookup for core *OpenGL* functions is more complicated because the EGL 1.4
+ * specification, the antiquated OpenGL ABI for Linux [1] from year 2000, and
+ * various libGL.so implementations all disagree on the set of symbols that
+ * libGL.so should statically expose and which are queryable with
+ * eglGetProcAddress. The EGL 1.4 spec (as explained above) does not require
+ * eglGetProcAddress to work for core functions. The OpenGL ABI spec requires
+ * that libGL.so expose *no* symbols statically except those contained in GL
+ * 1.2 and select extensions. Actual driver vendors tend to expose most, if not
+ * all, symbols statically from libGL.so.
+ *
+ * Considering how messy this situation is, the best way to query a core OpenGL
+ * function on EGL is eglGetProcAddress (or even glXGetProcAddress!). Sometimes
+ * Mesa's libGL doesn't statically expose all OpenGL functions supported by the
+ * driver, but Mesa's eglGetProcAddress does work for all GL functions, core
+ * and extension. Some other vendors of desktop OpenGL drivers, such as
+ * Nvidia, do the same. (By coincidence, Mesa's glXGetProcAddress also returns
+ * the same addresses as eglGetProcAddress). We don't need to worry about
+ * platforms on which eglGetProcAddress does not work for core functions, such
+ * as Mali, because those platforms support only OpenGL ES.
+ *
+ * [1] https://www.opengl.org/registry/ABI/
*/
static piglit_dispatch_function_ptr
get_core_proc_address(const char *function_name, int gl_10x_version)
@@ -230,8 +247,11 @@ get_core_proc_address(const char *function_name, int gl_10x_version)
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);
+ /* We query the address of core OpenGL functions as if they
+ * were extension functions. Read about the gory details
+ * above. */
+ (void) gl_10x_version;
+ return get_ext_proc_address(function_name);
}
#else
/* We don't need to worry about the GL version, since when using GLX
--
2.3.6
More information about the Piglit
mailing list