Alexandre Julliard : winex11: Change the pixel format initialisation to make sure it happens under the X11 lock .
Alexandre Julliard
julliard at winehq.org
Wed May 28 14:45:50 CDT 2008
Module: wine
Branch: master
Commit: 2fba300cefb52d192e9c879f19cdf35425db5157
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2fba300cefb52d192e9c879f19cdf35425db5157
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed May 28 16:57:46 2008 +0200
winex11: Change the pixel format initialisation to make sure it happens under the X11 lock.
---
dlls/winex11.drv/opengl.c | 104 +++++++++++++++++++++++----------------------
1 files changed, 53 insertions(+), 51 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 836a56a..3e02512 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -144,10 +144,6 @@ static int swap_interval = 1;
static const WineGLExtension *WineGLExtensionList[MAX_EXTENSIONS];
static int WineGLExtensionListSize;
-static WineGLPixelFormat *WineGLPixelFormatList;
-static int WineGLPixelFormatListSize = 0;
-static int WineGLPixelFormatOnScreenSize = 0;
-
static void X11DRV_WineGL_LoadExtensions(void);
static BOOL glxRequireVersion(int requiredVersion);
static BOOL glxRequireExtension(const char *requiredExtension);
@@ -841,20 +837,27 @@ static int get_render_type_from_fbconfig(Display *display, GLXFBConfig fbconfig)
return render_type;
}
-static BOOL init_formats(Display *display, int screen, Visual *visual)
+static WineGLPixelFormat *get_formats(Display *display, int *size_ret, int *onscreen_size_ret)
{
+ static WineGLPixelFormat *list;
+ static int size, onscreen_size;
+
int fmt_id, nCfgs, i, run;
GLXFBConfig* cfgs;
XVisualInfo *visinfo;
+ wine_tsx11_lock();
+ if (list) goto done;
+
cfgs = pglXGetFBConfigs(display, DefaultScreen(display), &nCfgs);
if (NULL == cfgs || 0 == nCfgs) {
- ERR("glXChooseFBConfig returns NULL\n");
if(cfgs != NULL) XFree(cfgs);
- return FALSE;
+ wine_tsx11_unlock();
+ ERR("glXChooseFBConfig returns NULL\n");
+ return NULL;
}
- WineGLPixelFormatList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nCfgs*sizeof(WineGLPixelFormat));
+ list = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nCfgs*sizeof(WineGLPixelFormat));
/* Fill the pixel format list. Put onscreen formats at the top and offscreen ones at the bottom.
* Do this as GLX doesn't guarantee that the list is sorted */
@@ -878,32 +881,34 @@ static BOOL init_formats(Display *display, int screen, Visual *visual)
if(visinfo->depth != screen_depth)
continue;
- TRACE("Found onscreen format FBCONFIG_ID 0x%x corresponding to iPixelFormat %d at GLX index %d\n", fmt_id, WineGLPixelFormatListSize+1, i);
- WineGLPixelFormatList[WineGLPixelFormatListSize].iPixelFormat = WineGLPixelFormatListSize+1; /* The index starts at 1 */
- WineGLPixelFormatList[WineGLPixelFormatListSize].fbconfig = cfgs[i];
- WineGLPixelFormatList[WineGLPixelFormatListSize].fmt_id = fmt_id;
- WineGLPixelFormatList[WineGLPixelFormatListSize].render_type = get_render_type_from_fbconfig(display, cfgs[i]);
-
- WineGLPixelFormatList[WineGLPixelFormatListSize].offscreenOnly = FALSE;
- WineGLPixelFormatListSize++;
- WineGLPixelFormatOnScreenSize++;
+ TRACE("Found onscreen format FBCONFIG_ID 0x%x corresponding to iPixelFormat %d at GLX index %d\n", fmt_id, size+1, i);
+ list[size].iPixelFormat = size+1; /* The index starts at 1 */
+ list[size].fbconfig = cfgs[i];
+ list[size].fmt_id = fmt_id;
+ list[size].render_type = get_render_type_from_fbconfig(display, cfgs[i]);
+ list[size].offscreenOnly = FALSE;
+ size++;
+ onscreen_size++;
XFree(visinfo);
} else if(run && !visinfo) {
- TRACE("Found offscreen format FBCONFIG_ID 0x%x corresponding to iPixelFormat %d at GLX index %d\n", fmt_id, WineGLPixelFormatListSize+1, i);
- WineGLPixelFormatList[WineGLPixelFormatListSize].iPixelFormat = WineGLPixelFormatListSize+1; /* The index starts at 1 */
- WineGLPixelFormatList[WineGLPixelFormatListSize].fbconfig = cfgs[i];
- WineGLPixelFormatList[WineGLPixelFormatListSize].fmt_id = fmt_id;
- WineGLPixelFormatList[WineGLPixelFormatListSize].render_type = get_render_type_from_fbconfig(display, cfgs[i]);
-
- WineGLPixelFormatList[WineGLPixelFormatListSize].offscreenOnly = TRUE;
- WineGLPixelFormatListSize++;
+ TRACE("Found offscreen format FBCONFIG_ID 0x%x corresponding to iPixelFormat %d at GLX index %d\n", fmt_id, size+1, i);
+ list[size].iPixelFormat = size+1; /* The index starts at 1 */
+ list[size].fbconfig = cfgs[i];
+ list[size].fmt_id = fmt_id;
+ list[size].render_type = get_render_type_from_fbconfig(display, cfgs[i]);
+ list[size].offscreenOnly = TRUE;
+ size++;
}
}
}
if(cfgs != NULL) XFree(cfgs);
- return TRUE;
+done:
+ if (size_ret) *size_ret = size;
+ if (onscreen_size_ret) *onscreen_size_ret = onscreen_size;
+ wine_tsx11_unlock();
+ return list;
}
/* GLX can advertise dozens of different pixelformats including offscreen and onscreen ones.
@@ -914,26 +919,24 @@ static BOOL init_formats(Display *display, int screen, Visual *visual)
*/
static WineGLPixelFormat* ConvertPixelFormatWGLtoGLX(Display *display, int iPixelFormat, BOOL AllowOffscreen, int *fmt_count)
{
- WineGLPixelFormat *res = NULL;
+ WineGLPixelFormat *list, *res = NULL;
+ int size, onscreen_size;
- /* Init the list of pixel formats when we need it */
- if(!WineGLPixelFormatListSize)
- init_formats(display, DefaultScreen(display), visual);
+ if (!(list = get_formats(display, &size, &onscreen_size ))) return NULL;
/* Check if the pixelformat is valid. Note that it is legal to pass an invalid
* iPixelFormat in case of probing the number of pixelformats.
*/
- if((iPixelFormat > 0) && (iPixelFormat <= WineGLPixelFormatListSize) &&
- ((WineGLPixelFormatList[iPixelFormat-1].offscreenOnly == FALSE) ||
- AllowOffscreen)) {
- res = &WineGLPixelFormatList[iPixelFormat-1];
+ if((iPixelFormat > 0) && (iPixelFormat <= size) &&
+ (!list[iPixelFormat-1].offscreenOnly || AllowOffscreen)) {
+ res = &list[iPixelFormat-1];
TRACE("Returning FBConfig=%p for iPixelFormat=%d\n", res->fbconfig, iPixelFormat);
}
if(AllowOffscreen)
- *fmt_count = WineGLPixelFormatListSize;
+ *fmt_count = size;
else
- *fmt_count = WineGLPixelFormatOnScreenSize;
+ *fmt_count = onscreen_size;
TRACE("Number of returned pixelformats=%d\n", *fmt_count);
@@ -943,16 +946,15 @@ 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)
{
- int i;
+ WineGLPixelFormat *list;
+ int i, size;
- /* Init the list of pixel formats when we need it */
- if(!WineGLPixelFormatListSize)
- init_formats(display, DefaultScreen(display), visual);
+ if (!(list = get_formats(display, &size, NULL ))) return NULL;
- for(i=0; i<WineGLPixelFormatListSize; i++) {
- if(WineGLPixelFormatList[i].fmt_id == fmt_id) {
- TRACE("Returning iPixelFormat %d for fmt_id 0x%x\n", WineGLPixelFormatList[i].iPixelFormat, fmt_id);
- return &WineGLPixelFormatList[i];
+ for(i=0; i<size; i++) {
+ if(list[i].fmt_id == fmt_id) {
+ TRACE("Returning iPixelFormat %d for fmt_id 0x%x\n", list[i].iPixelFormat, fmt_id);
+ return &list[i];
}
}
TRACE("No compatible format found for fmt_id 0x%x\n", fmt_id);
@@ -1034,9 +1036,9 @@ static XID create_bitmap_glxpixmap(X11DRV_PDEVICE *physDev, WineGLPixelFormat *f
*/
int X11DRV_ChoosePixelFormat(X11DRV_PDEVICE *physDev,
const PIXELFORMATDESCRIPTOR *ppfd) {
- WineGLPixelFormat *fmt = NULL;
+ WineGLPixelFormat *list;
+ int onscreen_size;
int ret = 0;
- int nPixelFormats;
int value = 0;
int i = 0;
int bestFormat = -1;
@@ -1059,15 +1061,15 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEVICE *physDev,
dump_PIXELFORMATDESCRIPTOR(ppfd);
}
+ if (!(list = get_formats(gdi_display, NULL, &onscreen_size ))) return 0;
+
wine_tsx11_lock();
- ConvertPixelFormatWGLtoGLX(gdi_display, 0, FALSE /* offscreen */, &nPixelFormats);
- for(i=0; i<nPixelFormats; i++)
+ for(i=0; i<onscreen_size; i++)
{
int dwFlags = 0;
int iPixelType = 0;
int alpha=0, color=0, depth=0, stencil=0, aux=0;
-
- fmt = ConvertPixelFormatWGLtoGLX(gdi_display, i+1 /* 1-based index */, FALSE /* offscreen */, &value);
+ WineGLPixelFormat *fmt = &list[i];
/* Pixel type */
pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_RENDER_TYPE, &value);
@@ -1264,7 +1266,7 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEVICE *physDev,
}
else {
ret = bestFormat+1; /* the return value should be a 1-based index */
- TRACE("Successfully found a matching mode, returning index: %d %x\n", ret, WineGLPixelFormatList[bestFormat].fmt_id);
+ TRACE("Successfully found a matching mode, returning index: %d %x\n", ret, list[bestFormat].fmt_id);
}
wine_tsx11_unlock();
More information about the wine-cvs
mailing list