glXChooseVisual: Only consider fbconfig if we can get the corresponding visual.
authorMichel Dänzer <daenzer@vmware.com>
Tue, 12 May 2009 06:01:22 +0000 (08:01 +0200)
committerMichel Dänzer <daenzer@vmware.com>
Tue, 12 May 2009 07:34:13 +0000 (09:34 +0200)
This can fail, e.g. when XLIB_SKIP_ARGB_VISUALS=1 is set.

See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=524794 and
http://bugs.freedesktop.org/show_bug.cgi?id=21600 .

src/glx/x11/glxcmds.c

index b9e0706d312c66717dac50e808d0858f6fce7b49..ec3e69e4fe145734f971ae843f81be8973e9f65e 100644 (file)
@@ -1319,30 +1319,31 @@ PUBLIC XVisualInfo *glXChooseVisual(Display *dpy, int screen, int *attribList)
     ** Eliminate visuals that don't meet minimum requirements
     ** Compute a score for those that do
     ** Remember which visual, if any, got the highest score
+    ** If no visual is acceptable, return None
+    ** Otherwise, create an XVisualInfo list with just the selected X visual
+    ** and return this.
     */
     for ( modes = psc->visuals ; modes != NULL ; modes = modes->next ) {
        if ( fbconfigs_compatible( & test_config, modes )
             && ((best_config == NULL)
                 || (fbconfig_compare( (const __GLcontextModes * const * const)&modes, &best_config ) < 0)) ) {
-           best_config = modes;
+           XVisualInfo visualTemplate;
+           XVisualInfo *newList;
+           int  i;
+
+           visualTemplate.screen = screen;
+           visualTemplate.visualid = modes->visualID;
+           newList = XGetVisualInfo( dpy, VisualScreenMask|VisualIDMask,
+                                     &visualTemplate, &i );
+
+           if (newList) {
+               Xfree(visualList);
+               visualList = newList;
+               best_config = modes;
+           }
        }
     }
 
-    /*
-    ** If no visual is acceptable, return None
-    ** Otherwise, create an XVisualInfo list with just the selected X visual
-    ** and return this.
-    */
-    if (best_config != NULL) {
-       XVisualInfo visualTemplate;
-       int  i;
-
-       visualTemplate.screen = screen;
-       visualTemplate.visualid = best_config->visualID;
-       visualList = XGetVisualInfo( dpy, VisualScreenMask|VisualIDMask,
-                                    &visualTemplate, &i );
-    }
-
     return visualList;
 }