Roderick Colenbrander : wgl: Make sure WGL_SUPPORT_GDI_ARB is only seen on formats on which we set it during startup (in get_formats).

Alexandre Julliard julliard at winehq.org
Mon May 18 08:13:14 CDT 2009


Module: wine
Branch: master
Commit: 2eec8aca02950dbe3a838a22656b57f6eed3fd67
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2eec8aca02950dbe3a838a22656b57f6eed3fd67

Author: Roderick Colenbrander <thunderbird2k at gmail.com>
Date:   Sat May 16 21:50:58 2009 +0200

wgl: Make sure WGL_SUPPORT_GDI_ARB is only seen on formats on which we set it during startup (in get_formats).

---

 dlls/winex11.drv/opengl.c |   52 +++++++++++++++++++++-----------------------
 1 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 774e4ca..96158dc 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -613,8 +613,6 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
   int drawattrib = 0;
   int nvfloatattrib = GLX_DONT_CARE;
   int pixelattrib = 0;
-  int supportgdi = -1;
-  int doublebuf = -1;
 
   /* The list of WGL attributes is allowed to be NULL. We don't return here for NULL
    * because we need to do fixups for GLX_DRAWABLE_TYPE/GLX_RENDER_TYPE/GLX_FLOAT_COMPONENTS_NV. */
@@ -666,7 +664,6 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
       pop = iWGLAttr[++cur];
       PUSH2(oGLXAttr, GLX_DOUBLEBUFFER, pop);
       TRACE("pAttr[%d] = GLX_DOUBLEBUFFER: %d\n", cur, pop);
-      doublebuf = pop;
       break;
     case WGL_STEREO_ARB:
       pop = iWGLAttr[++cur];
@@ -690,10 +687,9 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
       break;
 
     case WGL_SUPPORT_GDI_ARB:
+      /* This flag is set in a WineGLPixelFormat */
       pop = iWGLAttr[++cur];
-      PUSH2(oGLXAttr, GLX_X_RENDERABLE, pop);
       TRACE("pAttr[%d] = WGL_SUPPORT_GDI_ARB: %d\n", cur, pop);
-      supportgdi = pop;
       break;
 
     case WGL_DRAW_TO_BITMAP_ARB:
@@ -810,15 +806,6 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
     ++cur;
   }
 
-  if(supportgdi > 0) {
-    if(doublebuf > 0) {
-      WARN("Attempting double-buffered gdi format\n");
-      return -1;
-    }
-    if(doublebuf < 0)
-      PUSH2(oGLXAttr, GLX_DOUBLEBUFFER, False);
-  }
-
   /* Apply the OR'd drawable type bitmask now EVEN when WGL_DRAW_TO* is unset.
    * It is needed in all cases because GLX_DRAWABLE_TYPE default to GLX_WINDOW_BIT. */
   PUSH2(oGLXAttr, GLX_DRAWABLE_TYPE, drawattrib);
@@ -1011,7 +998,7 @@ static WineGLPixelFormat* ConvertPixelFormatWGLtoGLX(Display *display, int iPixe
 }
 
 /* Search our internal pixelformat list for the WGL format corresponding to the given fbconfig */
-static WineGLPixelFormat* ConvertPixelFormatGLXtoWGL(Display *display, int fmt_id)
+static WineGLPixelFormat* ConvertPixelFormatGLXtoWGL(Display *display, int fmt_id, DWORD dwFlags)
 {
     WineGLPixelFormat *list;
     int i, size;
@@ -1019,7 +1006,9 @@ static WineGLPixelFormat* ConvertPixelFormatGLXtoWGL(Display *display, int fmt_i
     if (!(list = get_formats(display, &size, NULL ))) return NULL;
 
     for(i=0; i<size; i++) {
-        if(list[i].fmt_id == fmt_id) {
+        /* A GLX format can appear multiple times in the pixel format list due to fake formats for bitmap rendering.
+         * Fake formats might get selected when the user passes the proper flags using the dwFlags parameter. */
+        if( (list[i].fmt_id == fmt_id) && ((list[i].dwFlags & dwFlags) == dwFlags) ) {
             TRACE("Returning iPixelFormat %d for fmt_id 0x%x\n", list[i].iPixelFormat, fmt_id);
             return &list[i];
         }
@@ -1034,7 +1023,7 @@ int pixelformat_from_fbconfig_id(XID fbconfig_id)
 
     if (!fbconfig_id) return 0;
 
-    fmt = ConvertPixelFormatGLXtoWGL(gdi_display, fbconfig_id);
+    fmt = ConvertPixelFormatGLXtoWGL(gdi_display, fbconfig_id, 0 /* no flags */);
     if(fmt)
         return fmt->iPixelFormat;
     /* This will happen on hwnds without a pixel format set; it's ok */
@@ -2682,6 +2671,8 @@ static GLboolean WINAPI X11DRV_wglChoosePixelFormatARB(HDC hdc, const int *piAtt
     WineGLPixelFormat *fmt;
     UINT pfmt_it = 0;
     int run;
+    int i;
+    DWORD dwFlags = 0;
 
     TRACE("(%p, %p, %p, %d, %p, %p): hackish\n", hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats);
     if (NULL != pfAttribFList) {
@@ -2695,6 +2686,19 @@ static GLboolean WINAPI X11DRV_wglChoosePixelFormatARB(HDC hdc, const int *piAtt
     }
     PUSH1(attribs, None);
 
+    /* There is no 1:1 mapping between GLX and WGL formats because we duplicate some GLX formats for bitmap rendering (see get_formats).
+     * Flags like PFD_SUPPORT_GDI, PFD_DRAW_TO_BITMAP and others are a property of the WineGLPixelFormat. We don't query these attributes
+     * using glXChooseFBConfig but we filter the result of glXChooseFBConfig later on by passing a dwFlags to 'ConvertPixelFormatGLXtoWGL'. */
+    for(i=0; piAttribIList[i] != 0; i+=2)
+    {
+        if(piAttribIList[i] == WGL_SUPPORT_GDI_ARB)
+        {
+            if(piAttribIList[i+1])
+                dwFlags |= PFD_SUPPORT_GDI;
+            break;
+        }
+    }
+
     /* Search for FB configurations matching the requirements in attribs */
     wine_tsx11_lock();
     cfgs = pglXChooseFBConfig(gdi_display, DefaultScreen(gdi_display), attribs, &nCfgs);
@@ -2716,7 +2720,7 @@ static GLboolean WINAPI X11DRV_wglChoosePixelFormatARB(HDC hdc, const int *piAtt
             }
 
             /* Search for the format in our list of compatible formats */
-            fmt = ConvertPixelFormatGLXtoWGL(gdi_display, fmt_id);
+            fmt = ConvertPixelFormatGLXtoWGL(gdi_display, fmt_id, dwFlags);
             if(!fmt)
                 continue;
 
@@ -2884,14 +2888,8 @@ static GLboolean WINAPI X11DRV_wglGetPixelFormatAttribivARB(HDC hdc, int iPixelF
 
             case WGL_SUPPORT_GDI_ARB:
                 if (!fmt) goto pix_error;
-                hTest = pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_DOUBLEBUFFER, &tmp);
-                if (hTest) goto get_error;
-                if(tmp) {
-                    piValues[i] = GL_FALSE;
-                    continue;
-                }
-                curGLXAttr = GLX_X_RENDERABLE;
-                break;
+                piValues[i] = (fmt->dwFlags & PFD_SUPPORT_GDI) ? TRUE : FALSE;
+                continue;
 
             case WGL_DRAW_TO_WINDOW_ARB:
             case WGL_DRAW_TO_BITMAP_ARB:
@@ -3596,7 +3594,7 @@ XVisualInfo *visual_from_fbconfig_id( XID fbconfig_id )
     WineGLPixelFormat *fmt;
     XVisualInfo *ret;
 
-    fmt = ConvertPixelFormatGLXtoWGL(gdi_display, fbconfig_id);
+    fmt = ConvertPixelFormatGLXtoWGL(gdi_display, fbconfig_id, 0 /* no flags */);
     if(fmt == NULL)
         return NULL;
 




More information about the wine-cvs mailing list