From: Benjamin Otte Date: Sun, 3 Oct 2021 15:40:09 +0000 (+0200) Subject: display: Get carried away by extension checker X-Git-Tag: archive/raspbian/4.6.5+ds-1+rpi1~1^2~19^2~5^2~258^2~12 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=aba37c40d349980784b9ed9aef314277f45e20dd;p=gtk4.git 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. --- diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 6f9bdec930..9f3608d3cd 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -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; }