display: Get carried away by extension checker
authorBenjamin Otte <otte@redhat.com>
Sun, 3 Oct 2021 15:40:09 +0000 (17:40 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 6 Oct 2021 01:43:47 +0000 (03:43 +0200)
I wanted to make it easy to check for multiple extensions and then got
carried away by trying to generate beautiful error messages.

gdk/gdkdisplay.c

index 6f9bdec930fd0bc28216ef4afb8f25e590e7493c..9f3608d3cd683cb314e843bb86873d0eb2a0c52e 100644 (file)
@@ -1570,6 +1570,50 @@ gdk_display_create_egl_config (GdkDisplay               *self,
 
 #undef MAX_EGL_ATTRS
 
+static gboolean
+gdk_display_check_egl_extensions (EGLDisplay   egl_display,
+                                  const char **extensions,
+                                  GError     **error)
+{
+  GString *missing = NULL;
+  gsize i, n_missing;
+
+  n_missing = 0;
+
+  for (i = 0; extensions[i] != NULL; i++)
+    {
+      if (!epoxy_has_egl_extension (egl_display, extensions[i]))
+        {
+          if (missing == NULL)
+            {
+              missing = g_string_new (extensions[i]);
+            }
+          else
+            {
+              g_string_append (missing, ", ");
+              g_string_append (missing, extensions[i]);
+            }
+          n_missing++;
+        }
+    }
+
+  if (n_missing)
+    {
+      g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_UNSUPPORTED_PROFILE,
+                   /* translators: Arguments are the number of missing extensions
+                    * followed by a comma-separated list of their names */
+                   g_dngettext (GETTEXT_PACKAGE,
+                                "EGL implementation is missing extension %2$s",
+                                "EGL implementation is missing %d extensions: %s",
+                                n_missing),
+                   (int) n_missing, missing->str);
+
+      g_string_free (missing, TRUE);
+      return FALSE;
+    }
+
+  return TRUE;
+}
 
 gboolean
 gdk_display_init_egl (GdkDisplay  *self,
@@ -1629,12 +1673,14 @@ gdk_display_init_egl (GdkDisplay  *self,
       return FALSE;
     }
 
-  if (!epoxy_has_egl_extension (priv->egl_display, "EGL_KHR_surfaceless_context"))
+  if (!gdk_display_check_egl_extensions (priv->egl_display,
+                                         (const char *[]) {
+                                           "EGL_KHR_surfaceless_context",
+                                           NULL
+                                         },
+                                         error))
     {
       g_clear_pointer (&priv->egl_display, eglTerminate);
-      g_set_error_literal (error, GDK_GL_ERROR,
-                           GDK_GL_ERROR_UNSUPPORTED_PROFILE,
-                           _("Surfaceless contexts are not supported on this EGL implementation"));
       return FALSE;
     }