[gtk/wip/otte/gl-hdr] display: Get carried away by extension checker



commit c49d63916f2a21c1142ac2a0baf608594f2118ed
Author: Benjamin Otte <otte redhat com>
Date:   Sun Oct 3 17:40:09 2021 +0200

    display: Get carried away by extension checker
    
    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 | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 50 insertions(+), 4 deletions(-)
---
diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c
index abc3c0a16a..64803471ba 100644
--- a/gdk/gdkdisplay.c
+++ b/gdk/gdkdisplay.c
@@ -1502,6 +1502,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,
@@ -1561,12 +1605,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;
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]