gdk/x11: Check if we have access to GL before using GLX API
authorEmmanuele Bassi <ebassi@gnome.org>
Fri, 20 Jan 2017 18:07:01 +0000 (18:07 +0000)
committerMichael Biebl <biebl@debian.org>
Tue, 14 Mar 2017 00:38:30 +0000 (00:38 +0000)
If the platform does not have access to libGL then any call to GL and
GLX API through libepoxy will fail with an assertion. Until such time
that libepoxy exposes API for us to use, we can simply dlopen libGL
ourselves and do a symbol check.

[smcv: fix typo]

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=775279
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=847366

Gbp-Pq: Name gdk-x11-Check-if-we-have-access-to-GL-before-using-G.patch

gdk/x11/gdkglcontext-x11.c

index 0819f89648eba18b04d00fdc4251ea184682c20c..d8ddf0fe196df0878c1555727b862cd98d9340cb 100644 (file)
@@ -854,6 +854,32 @@ gdk_x11_screen_init_gl (GdkScreen *screen)
   if (_gdk_gl_flags & GDK_GL_DISABLE)
     return FALSE;
 
+  /* This is an ad hoc check that bypasses libepoxy to check if libGL.so is
+   * unavailable, and disables GL support if that's the case
+   *
+   * Ideally, libepoxy should do this for us, but that would require adding
+   * new API, and we'd need a fallback anyway.
+   */
+  {
+    Bool (* fp_glXQueryExtension) (Display *dpy, int *err_base, int *ev_base);
+    GModule *module = g_module_open ("libGL.so.1", 0);
+
+    if (module == NULL)
+      {
+        GDK_NOTE (OPENGL, g_message ("No libGL.so found"));
+        return FALSE;
+      }
+
+    if (!g_module_symbol (module, "glXQueryExtension", (gpointer *) &fp_glXQueryExtension))
+      {
+        GDK_NOTE (OPENGL, g_message ("No glXQueryExtension symbol found"));
+        g_module_close (module);
+        return FALSE;
+      }
+
+    g_module_close (module);
+  }
+
   dpy = gdk_x11_display_get_xdisplay (display);
 
   if (!glXQueryExtension (dpy, &error_base, &event_base))