Module: wine Branch: master Commit: 2a839e96c928b1aea8c7e03bb053deb66d0f238f URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a839e96c928b1aea8c7e03bb0...
Author: Roderick Colenbrander thunderbird2k@gmx.net Date: Thu Sep 13 01:04:30 2007 +0200
wgl: Fix a major ATI regression.
ATI's latest drivers (8.41.7) don't advertise visualids anymore for GLXFBConfigs.
---
dlls/winex11.drv/opengl.c | 26 ++++++++++++++------------ 1 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 3dab1b6..156a574 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -814,9 +814,10 @@ static int get_render_type_from_fbconfig(Display *display, GLXFBConfig fbconfig)
static BOOL init_formats(Display *display, int screen, Visual *visual) { - int fmt_id, tmp_vis_id, tmp_fmt_id, nCfgs, i; + int fmt_id, tmp_fmt_id, nCfgs, i; GLXFBConfig* cfgs; GLXFBConfig fbconfig = NULL; + XVisualInfo *visinfo; VisualID visualid = XVisualIDFromVisual(visual); int nOffscreenFormats = 0;
@@ -833,17 +834,16 @@ static BOOL init_formats(Display *display, int screen, Visual *visual)
/* Count the number of offscreen formats to determine the size for our pixelformat list */ for(i=0; i<nCfgs; i++) { - pglXGetFBConfigAttrib(display, cfgs[i], GLX_VISUAL_ID, &tmp_vis_id); + pglXGetFBConfigAttrib(display, cfgs[i], GLX_FBCONFIG_ID, &tmp_fmt_id);
- /* We have found Wine's main visual */ - if(tmp_vis_id == visualid) { + visinfo = pglXGetVisualFromFBConfig(display, cfgs[i]); + /* Onscreen formats have a corresponding XVisual, offscreen ones don't */ + if(!visinfo) { + nOffscreenFormats++; + } else if(visinfo && visinfo->visualid == visualid) { pglXGetFBConfigAttrib(display, cfgs[i], GLX_FBCONFIG_ID, &fmt_id); fbconfig = cfgs[i]; - } - - /* We have found an offscreen rendering format :) */ - if(tmp_vis_id == 0) { - nOffscreenFormats++; + XFree(visinfo); } } TRACE("Number of offscreen formats: %d\n", nOffscreenFormats); @@ -860,11 +860,11 @@ static BOOL init_formats(Display *display, int screen, Visual *visual)
/* Fill the list with offscreen formats */ for(i=0; i<nCfgs; i++) { - pglXGetFBConfigAttrib(display, cfgs[i], GLX_VISUAL_ID, &tmp_vis_id); pglXGetFBConfigAttrib(display, cfgs[i], GLX_FBCONFIG_ID, &tmp_fmt_id);
- /* We have found an offscreen rendering format :) */ - if(tmp_vis_id == 0) { + visinfo = pglXGetVisualFromFBConfig(display, cfgs[i]); + /* We have found an offscreen rendering format when there is no visualinfo :) */ + if(!visinfo) { TRACE("Found offscreen format FBCONFIG_ID 0x%x corresponding to iPixelFormat %d at GLX index %d\n", tmp_fmt_id, WineGLPixelFormatListSize+1, i); WineGLPixelFormatList[WineGLPixelFormatListSize].iPixelFormat = WineGLPixelFormatListSize+1; /* The index starts at 1 */ WineGLPixelFormatList[WineGLPixelFormatListSize].fbconfig = cfgs[i]; @@ -872,6 +872,8 @@ static BOOL init_formats(Display *display, int screen, Visual *visual) WineGLPixelFormatList[WineGLPixelFormatListSize].render_type = get_render_type_from_fbconfig(display, cfgs[i]); WineGLPixelFormatList[WineGLPixelFormatListSize].offscreenOnly = TRUE; WineGLPixelFormatListSize++; + } else { + XFree(visinfo); } }