wine/dlls/x11drv opengl.c

Alexandre Julliard julliard at wine.codeweavers.com
Fri Dec 2 04:29:36 CST 2005


ChangeSet ID:	21612
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/12/02 04:29:36

Modified files:
	dlls/x11drv    : opengl.c 

Log message:
	Raphael Junqueira <fenix at club-internet.fr>
	Handle DONTCARE flags on ChoosePixelFormat.
	DOUBLEBUFFER and STEREO are non-mandatory options (ie if not available
	find a compatible pixel format without). So try without if we cannot
	find a valid fbconfig with these options.

Patch: http://cvs.winehq.org/patch.py?id=21612

Old revision  New revision  Changes     Path
 1.18          1.19          +38 -9      wine/dlls/x11drv/opengl.c

Index: wine/dlls/x11drv/opengl.c
diff -u -p wine/dlls/x11drv/opengl.c:1.18 wine/dlls/x11drv/opengl.c:1.19
--- wine/dlls/x11drv/opengl.c:1.18	2 Dec 2005 10:29:36 -0000
+++ wine/dlls/x11drv/opengl.c	2 Dec 2005 10:29:36 -0000
@@ -183,6 +183,7 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEV
 			     const PIXELFORMATDESCRIPTOR *ppfd) {
   int att_list[64];
   int att_pos = 0;
+  int att_pos_fac = 0;
   GLXFBConfig* cfgs = NULL;
   int ret = 0;
 
@@ -204,22 +205,24 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEV
   }
 
   /* Now, build the request to GLX */
-  TEST_AND_ADD2(ppfd->dwFlags & PFD_DOUBLEBUFFER, GLX_DOUBLEBUFFER, TRUE);
-  TEST_AND_ADD1(ppfd->dwFlags & PFD_STEREO, GLX_STEREO);
   
   if (ppfd->iPixelType == PFD_TYPE_COLORINDEX) {
     ADD2(GLX_BUFFER_SIZE, ppfd->cColorBits);
   }  
   if (ppfd->iPixelType == PFD_TYPE_RGBA) {
     ADD2(GLX_RENDER_TYPE, GLX_RGBA_BIT);
-    if (32 == ppfd->cDepthBits) {
-      /**
-       * for 32 bpp depth buffers force to use 24.
-       * needed as some drivers don't support 32bpp
-       */
-      TEST_AND_ADD2(ppfd->cDepthBits, GLX_DEPTH_SIZE, 24);
+    if (ppfd->dwFlags & PFD_DEPTH_DONTCARE) {
+      ADD2(GLX_DEPTH_SIZE, GLX_DONT_CARE);
     } else {
-      TEST_AND_ADD2(ppfd->cDepthBits, GLX_DEPTH_SIZE, ppfd->cDepthBits);
+      if (32 == ppfd->cDepthBits) {
+	/**
+	 * for 32 bpp depth buffers force to use 24.
+	 * needed as some drivers don't support 32bpp
+	 */
+	TEST_AND_ADD2(ppfd->cDepthBits, GLX_DEPTH_SIZE, 24);
+      } else {
+	TEST_AND_ADD2(ppfd->cDepthBits, GLX_DEPTH_SIZE, ppfd->cDepthBits);
+      }
     }
     if (32 == ppfd->cColorBits) {
       ADD2(GLX_RED_SIZE,   8);
@@ -237,6 +240,21 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEV
   /* These flags are not supported yet...
   ADD2(GLX_ACCUM_SIZE, ppfd->cAccumBits);
   */
+
+  /** facultative flags now */
+  att_pos_fac = att_pos;
+  if (ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) {
+    ADD2(GLX_DOUBLEBUFFER, GLX_DONT_CARE);
+  } else {
+    ADD2(GLX_DOUBLEBUFFER, (ppfd->dwFlags & PFD_DOUBLEBUFFER) ? TRUE : FALSE);
+  }
+  if (ppfd->dwFlags & PFD_STEREO_DONTCARE) {
+    ADD2(GLX_STEREO, GLX_DONT_CARE);
+  } else {
+    ADD2(GLX_STEREO, (ppfd->dwFlags & PFD_STEREO) ? TRUE : FALSE);
+  }
+  
+  /** Attributes List End */
   att_list[att_pos] = None;
 
   wine_tsx11_lock(); 
@@ -251,6 +269,17 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEV
     UINT it_fmt;
 
     cfgs = pglXChooseFBConfig(gdi_display, DefaultScreen(gdi_display), att_list, &nCfgs); 
+    /** 
+     * if we have facultative flags and we failed, try without 
+     *  as MSDN said
+     *
+     * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/ntopnglr_2qb8.asp
+     */
+    if ((NULL == cfgs || 0 == nCfgs) && att_pos > att_pos_fac) {
+      att_list[att_pos_fac] = None;
+      cfgs = pglXChooseFBConfig(gdi_display, DefaultScreen(gdi_display), att_list, &nCfgs); 
+    }
+
     if (NULL == cfgs || 0 == nCfgs) {
       ERR("glXChooseFBConfig returns NULL (glError: %d)\n", pglGetError());
       ret = 0;



More information about the wine-cvs mailing list