Module: wine
Branch: master
Commit: 2eec8aca02950dbe3a838a22656b57f6eed3fd67
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2eec8aca02950dbe3a838a226…
Author: Roderick Colenbrander <thunderbird2k(a)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;