Fix for the BadMatch error (bug #4945)

Wino Rojo winorojo at hotmail.com
Wed May 24 11:07:52 CDT 2006


>
>I aggree. The problem is that will break for cards who don't support 24-32 
>bits frame buffers.
>
>You must add a fallback for 16 bits :
>
>- try GLX_RGBA,GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, GLX_DOUBLEBUFFER
>- if failed try  GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_STENCIL_SIZE, 8, 
>GLX_DOUBLEBUFFER
>- if failed try GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER
>

Ok, what about this patch?:



RCS file: /home/wine/wine/dlls/x11drv/opengl.c,v
retrieving revision 1.27
diff -u -r1.27 opengl.c
--- opengl.c	9 May 2006 10:58:46 -0000	1.27
+++ opengl.c	24 May 2006 16:03:28 -0000
@@ -554,24 +554,33 @@
{
     XVisualInfo *visual = NULL;
     /* In order to support OpenGL or D3D, we require a double-buffered 
visual and stencil buffer support, */
-    int dblBuf[] = {GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_STENCIL_SIZE, 8, 
GLX_DOUBLEBUFFER, None};
+    int dblBuf[] = {GLX_RGBA,GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, 
GLX_ALPHA_SIZE, 8, GLX_DOUBLEBUFFER, None};
     if (!has_opengl()) return NULL;

     wine_tsx11_lock();
     visual = pglXChooseVisual(display, DefaultScreen(display), dblBuf);
     wine_tsx11_unlock();
     if (visual == NULL) {
-        /* fallback to no stencil */
-        int dblBuf2[] = {GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, 
None};
-        WARN("Failed to get a visual with at least 8 bits of stencil\n");
+        /* fallback to 16 bits depth, no alpha */
+        int dblBuf2[] = {GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_STENCIL_SIZE, 8, 
GLX_DOUBLEBUFFER, None};
+        WARN("Failed to get a visual with at least 24 bits depth\n");

         wine_tsx11_lock();
         visual = pglXChooseVisual(display, DefaultScreen(display), 
dblBuf2);
         wine_tsx11_unlock();
         if (visual == NULL) {
-            /* This should only happen if we cannot find a match with a 
depth size 16 */
-            FIXME("Failed to find a suitable visual\n");
-            return visual;
+            /* fallback to no stencil */
+            int dblBuf2[] = {GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, 
None};
+            WARN("Failed to get a visual with at least 8 bits of 
stencil\n");
+
+            wine_tsx11_lock();
+            visual = pglXChooseVisual(display, DefaultScreen(display), 
dblBuf2);
+            wine_tsx11_unlock();
+            if (visual == NULL) {
+                /* This should only happen if we cannot find a match with a 
depth size 16 */
+                FIXME("Failed to find a suitable visual\n");
+                return visual;
+	    }
         }
     }
     TRACE("Visual ID %lx Chosen\n",visual->visualid);


This is what I'm doing:

- try GLX_RGBA,GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, GLX_ALPHA_SIZE, 8, 
GLX_DOUBLEBUFFER

- if failed try  GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_STENCIL_SIZE, 8, 
GLX_DOUBLEBUFFER

- if failed try GLX_RGBA,GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER


Comments?

Thanks,

Wino

_________________________________________________________________
Don't just Search. Find! http://search.sympatico.msn.ca/default.aspx The new 
MSN Search! Check it out!




More information about the wine-devel mailing list