Looks like there's been a regression lately. I'm
getting errors like this
X Error of failed request: BadPixmap (invalid Pixmap parameter)
Major opcode of failed request: 54 (X_FreePixmap)
Resource id in failed request: 0x2a0006a
randomly, about every fourth time I run things that used to
work. A user on c.e.m.w.
http://groups.google.com/group/comp.emulators.ms-windows.wine/msg/1f41dbd21a...
speculates that the recent cursors patch
introduced the regression.
The error doesn't happen often enough to make
a regression test easy, and I haven't tried myself yet.
Could you see if this helps? It looks like XRenderFreePicture
actually destroys the underlying pixmap, so we ended up freeing it
twice.
Thanks,
Huw.
--
Huw Davies
huw@codeweavers.com
>From 8a76cf26395043428c24851d675c219735bcf502 Mon Sep 17 00:00:00 2001
From: Huw Davies
huw@codeweavers.com
Date: Tue, 3 Apr 2007 17:12:32 +0100
Subject: winex11.drv: XRenderFreePicture destroys the underlying storage, so don't free the pixmap.
To: wine-patches
wine-patches@winehq.org
---
dlls/winex11.drv/xrender.c | 22 +++++++++-------------
1 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index e03540e..6b86c74 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -85,7 +85,6 @@ struct tagXRENDERINFO
int cache_index;
Picture pict;
Picture tile_pict;
- Pixmap tile_xpm;
COLORREF lastTextColor;
};
@@ -596,7 +595,6 @@ void X11DRV_XRender_UpdateDrawable(X11DRV_PDEVICE *physDev)
if(physDev->xrender->pict)
{
TRACE("freeing pict = %lx dc = %p\n", physDev->xrender->pict, physDev->hdc);
- XFlush(gdi_display);
pXRenderFreePicture(gdi_display, physDev->xrender->pict);
physDev->xrender->pict = 0;
}
@@ -605,11 +603,6 @@ void X11DRV_XRender_UpdateDrawable(X11DRV_PDEVICE *physDev)
pXRenderFreePicture(gdi_display, physDev->xrender->tile_pict);
physDev->xrender->tile_pict = 0;
}
- if(physDev->xrender->tile_xpm)
- {
- XFreePixmap(gdi_display, physDev->xrender->tile_xpm);
- physDev->xrender->tile_xpm = 0;
- }
wine_tsx11_unlock();
@@ -1186,18 +1179,21 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
if(X11DRV_XRender_Installed) {
/* Create a 1x1 pixmap to tile over the font mask */
- if(!physDev->xrender->tile_xpm) {
+ if(!physDev->xrender->tile_pict) {
XRenderPictureAttributes pa;
+ Pixmap xpm;
XRenderPictFormat *format = (physDev->depth == 1) ? mono_format : screen_format;
wine_tsx11_lock();
- physDev->xrender->tile_xpm = XCreatePixmap(gdi_display,
- physDev->drawable,
- 1, 1,
- format->depth);
+
+ /* The pixmap will be freed with XRenderFreePicture */
+ xpm = XCreatePixmap(gdi_display,
+ physDev->drawable,
+ 1, 1,
+ format->depth);
pa.repeat = True;
physDev->xrender->tile_pict = pXRenderCreatePicture(gdi_display,
- physDev->xrender->tile_xpm,
+ xpm,
format,
CPRepeat, &pa);
wine_tsx11_unlock();
--
1.5.0.5