glx: Trap errors inside loop
authorBenjamin Otte <otte@redhat.com>
Sat, 3 Jun 2023 16:00:56 +0000 (18:00 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 3 Jun 2023 16:03:56 +0000 (18:03 +0200)
Instead of trapping errors for the whole loop trying to create GL
contexts, trap them once per GL context.

Apparently GLX does throw an error when a too high version is requested
and doesn't just return NULL and then that error lingers when we try
lower versions.

Fixes #5857

gdk/x11/gdkglcontext-glx.c

index 7ad18e4307194713a2fc8eb78f2ade995cc3e9f1..89571643ebb74a5ad24fbd32e5f7ced8252fe148 100644 (file)
@@ -543,14 +543,14 @@ gdk_x11_context_create_glx_context (GdkGLContext *context,
   if (share != NULL)
     share_glx = GDK_X11_GL_CONTEXT_GLX (share);
 
-  gdk_x11_display_error_trap_push (display);
-
   supported_versions = gdk_gl_versions_get_for_api (api);
   for (j = 0; gdk_gl_version_greater_equal (&supported_versions[j], &version); j++)
     {
       context_attribs [major_idx] = gdk_gl_version_get_major (&supported_versions[j]);
       context_attribs [minor_idx] = gdk_gl_version_get_minor (&supported_versions[j]);
 
+      gdk_x11_display_error_trap_push (display);
+
       /* If we don't have access to GLX_ARB_create_context_profile, then
        * we have to fall back to the old GLX 1.3 API.
        */
@@ -568,22 +568,19 @@ gdk_x11_context_create_glx_context (GdkGLContext *context,
                                           True,
                                           context_attribs);
 
-      if (ctx)
+      if (ctx == NULL)
+        {
+          gdk_x11_display_error_trap_pop_ignored (display);
+        }
+      else if (gdk_x11_display_error_trap_pop (display))
+        {
+          glXDestroyContext (dpy, ctx);
+          ctx = NULL;
+        }
+      else
         break;
     }
 
-  if (ctx == NULL)
-    {
-      gdk_x11_display_error_trap_pop_ignored (display);
-      return 0;
-    }
-
-  if (gdk_x11_display_error_trap_pop (display))
-    {
-      glXDestroyContext (dpy, ctx);
-      return 0;
-    }
-
   GDK_DISPLAY_DEBUG (display, OPENGL,
                      "Realized GLX context[%p], %s, version: %d.%d",
                      context_glx->glx_context,