[waffle] [PATCH 1/2] tests/gl_basic: Make GL symbol queries more robust

Chad Versace chad.versace at intel.com
Tue Jun 14 21:12:39 UTC 2016


The rules that dictate how to properly query a GL symbol are complex.
The rules depend on the OS, on the winsys API, and even on the
particular driver being used. The rules differ between EGL 1.4 and EGL
1.5; differ between Linux, Windows, and Mac; and differ between Mesa and
Mali.

gl_basic_test didn't try very hard when querying a GL symbol. It tried
only dlsym. If dlsym failed, then the test failed.

Make gl_basic_test more robust by falling back to
waffle_get_proc_address() whenever dlsym fails.

Suggested-by: Emil Velikov <emil.l.velikov at collabora.co.uk>
Signed-off-by: Chad Versace <chad.versace at intel.com>
---
 tests/functional/gl_basic_test.c | 55 +++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 21 deletions(-)

diff --git a/tests/functional/gl_basic_test.c b/tests/functional/gl_basic_test.c
index 7af2229..4a90dfd 100644
--- a/tests/functional/gl_basic_test.c
+++ b/tests/functional/gl_basic_test.c
@@ -169,19 +169,36 @@ teardown(void **state)
     return 0;
 }
 
-static int32_t
-libgl_from_context_api(int32_t waffle_context_api)
+// The rules that dictate how to properly query a GL symbol are complex. The
+// rules depend on the OS, on the winsys API, and even on the particular driver
+// being used. The rules differ between EGL 1.4 and EGL 1.5; differ between
+// Linux, Windows, and Mac; and differ between Mesa and Mali.
+//
+// This function hides that complexity with a naive heuristic: try, then try
+// again.
+static void *
+get_gl_symbol(enum waffle_enum context_api, const char *name)
 {
-    switch (waffle_context_api) {
-        case WAFFLE_CONTEXT_OPENGL:     return WAFFLE_DL_OPENGL;
-        case WAFFLE_CONTEXT_OPENGL_ES1: return WAFFLE_DL_OPENGL_ES1;
-        case WAFFLE_CONTEXT_OPENGL_ES2: return WAFFLE_DL_OPENGL_ES2;
-        case WAFFLE_CONTEXT_OPENGL_ES3: return WAFFLE_DL_OPENGL_ES3;
-
-        default:
-            assert_true(0);
-            return 0;
+    void *sym = NULL;
+    enum waffle_enum dl = 0;
+
+    switch (context_api) {
+        case WAFFLE_CONTEXT_OPENGL: dl = WAFFLE_DL_OPENGL; break;
+        case WAFFLE_CONTEXT_OPENGL_ES1: dl = WAFFLE_DL_OPENGL_ES1; break;
+        case WAFFLE_CONTEXT_OPENGL_ES2: dl = WAFFLE_DL_OPENGL_ES2; break;
+        case WAFFLE_CONTEXT_OPENGL_ES3: dl = WAFFLE_DL_OPENGL_ES3; break;
+        default: assert_true(0); break;
+    }
+
+    if (waffle_dl_can_open(dl)) {
+        sym = waffle_dl_sym(dl, name);
     }
+
+    if (!sym) {
+        sym = waffle_get_proc_address(name);
+    }
+
+    return sym;
 }
 
 static int
@@ -270,8 +287,6 @@ gl_basic_draw__(void **state, struct gl_basic_draw_args__ args)
     bool context_debug = args.debug;
     bool alpha = args.alpha;
 
-    int32_t libgl;
-
     int32_t config_attrib_list[64];
     int i;
 
@@ -281,8 +296,6 @@ gl_basic_draw__(void **state, struct gl_basic_draw_args__ args)
         0,
     };
 
-    libgl = libgl_from_context_api(waffle_context_api);
-
     i = 0;
     config_attrib_list[i++] = WAFFLE_CONTEXT_API;
     config_attrib_list[i++] = waffle_context_api;
@@ -353,12 +366,12 @@ gl_basic_draw__(void **state, struct gl_basic_draw_args__ args)
     }
 
     // Get OpenGL functions.
-    assert_true(glClear         = waffle_dl_sym(libgl, "glClear"));
-    assert_true(glClearColor    = waffle_dl_sym(libgl, "glClearColor"));
-    assert_true(glGetError      = waffle_dl_sym(libgl, "glGetError"));
-    assert_true(glGetIntegerv   = waffle_dl_sym(libgl, "glGetIntegerv"));
-    assert_true(glReadPixels    = waffle_dl_sym(libgl, "glReadPixels"));
-    assert_true(glGetString     = waffle_dl_sym(libgl, "glGetString"));
+    assert_true(glClear         = get_gl_symbol(waffle_context_api, "glClear"));
+    assert_true(glClearColor    = get_gl_symbol(waffle_context_api, "glClearColor"));
+    assert_true(glGetError      = get_gl_symbol(waffle_context_api, "glGetError"));
+    assert_true(glGetIntegerv   = get_gl_symbol(waffle_context_api, "glGetIntegerv"));
+    assert_true(glReadPixels    = get_gl_symbol(waffle_context_api, "glReadPixels"));
+    assert_true(glGetString     = get_gl_symbol(waffle_context_api, "glGetString"));
 
     assert_true(waffle_make_current(ts->dpy, ts->window, ts->ctx));
 
-- 
2.9.0.rc2



More information about the waffle mailing list