[waffle] [PATCH (maint-1.4)] wflinfo: Fix glGetStringi on Mali

Chad Versace chad.versace at linux.intel.com
Wed Nov 19 18:32:58 PST 2014


On Mali EGL 1.4, you can't obtain non-extension functions (including
OpenGL ES 3.0 functions) with eglGetProcAddress. You must use dlsym.

This patch carefully avoids breaking glGetStringi on other platforms,
which may expose glGetStringi dynamically (as in eglGetProcAddress) but
not statically (as in dlsym).

Fixes #20: https://github.com/waffle-gl/waffle/pull/20
Fixes: chromium:428061 [https://code.google.com/p/chromium/issues/detail?id=428061]
See: https://github.com/anholt/libepoxy/issues/21
Reported-by: Frank Henigman <fjhenigman at chromium.org>
Cc: Daniel Kurtz <djkurtz at chromium.org>
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
---

Frank or Daniel, could you please validate this patch on Mali? I tested on
Fedora with Mesa i965.




 src/utils/wflinfo.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/utils/wflinfo.c b/src/utils/wflinfo.c
index 0b03e55..0907b4b 100644
--- a/src/utils/wflinfo.c
+++ b/src/utils/wflinfo.c
@@ -1037,7 +1037,28 @@ main(int argc, char **argv)
     if (!glGetString)
         error_get_gl_symbol("glGetString");
 
-    glGetStringi = waffle_get_proc_address("glGetStringi");
+    // Retrieving GL functions is tricky. When glGetStringi is supported, here
+    // are some boggling variations as of 2014-11-19:
+    //   - Mali drivers on EGL 1.4 expose glGetStringi statically from
+    //     libGLESv2 but not dynamically from eglGetProcAddress. The EGL 1.4 spec
+    //     permits this behavior.
+    //   - EGL 1.5 requires that eglGetStringi be exposed dynamically through
+    //     eglGetProcAddress. Exposing statically with dlsym is optional.
+    //   - Windows requires that glGetStringi be exposed dynamically from
+    //     wglGetProcAddress. Exposing statically from GetProcAddress (Window's
+    //     dlsym equivalent) is optional.
+    //   - Mesa drivers expose glGetStringi statically from libGL and libGLESv2
+    //     and dynamically from eglGetProcAddress and glxGetProcAddress.
+    //   - Mac exposes glGetStringi only statically.
+    //
+    // Try waffle_dl_sym before waffle_get_proc_address because
+    // (1) egl/glXProcAddress can return invalid non-null pointers for
+    // unsupported functions and (2) dlsym returns non-null if and only if the
+    // library exposes the symbol.
+    glGetStringi = waffle_dl_sym(opts.dl, "glGetStringi");
+    if (!glGetStringi) {
+        glGetStringi = waffle_get_proc_address("glGetStringi");
+    }
 
     const struct wflinfo_config_attrs config_attrs = {
         .api = opts.context_api,
-- 
2.1.2.1.g5433a3e



More information about the waffle mailing list