BUG (3920) + sync between DIBs and X Server optimisation. (please help)

Marinescu-Ghetau Iulian giulian2003 at hotmail.com
Tue Dec 13 08:11:55 CST 2005

Yeah, i also belive putting the modifying rect in Coerce is better, when i 
first made the changes i just wanted to modify as little as possible and add 
things without modifying the already existing code too much, keeping it 
clean. I also belive i am doing something wrong:

I noticed that in X11DRV_DIB_CopyDIBSection() function created to optimise 
bitblt(), the sync is done this way:

    X11DRV_DIB_DoCopyDIBSection(physBitmap, FALSE, colorMap, nColorMap,
				physDevDst->drawable, xSrc, ySrc,
                                physDevDst->org.x + xDest, physDevDst->org.y 
+ yDest,
				width, height);

They take in consideration the (org.x,org.y) in the physical device! I don't 
understand too well what  a physical devise exactly is, and i was wondering 
if i am not mistaking when i sync like this in 

    X11DRV_DIB_DoCopyDIBSection(physBitmap, toDIB,
                                physBitmap->colorMap, physBitmap->nColorMap,
                                physBitmap->pixmap, x, y, x, y,
                                width, height);

and not taking in consideration the origins of the device?


>From: Robert Shearman <rob at codeweavers.com>
>To: Marinescu-Ghetau Iulian <giulian2003 at hotmail.com>
>CC: wine-devel at winehq.org
>Subject: Re: BUG (3920) + sync between DIBs and X Server optimisation. 
>(please help)
>Date: Mon, 12 Dec 2005 11:07:20 -0600
>Marinescu-Ghetau Iulian wrote:
>>I came to the conclusion that the slowness in "Heroes IV" it has to do 
>>sync'ing lage bitmaps between application DIBs and X Server(see the log: 
>>http://bugs.winehq.org/attachment.cgi?id=1470&action=view ).
>>Also, a complete description of the bug is here: 
>>So i had this ideea that every GDI function could memorise the rectangle 
>>that is modifying, so each time a sync between DIB and X Server is needed, 
>>only a small part from the bitmap will get copied! I also made some 
>>changes to dib.c, bitblt.c and x11drv.h in "wine-0.9.2\dlls\x11drv" folder 
>>to implement my ideea, keeping backwards compatibility (if a DIB function 
>>doesn't set a valid rectangle for the bitmap that its modifying, the 
>>default values are taken - which is the entire bitmap)
>>- and finally, a GDI function calls it like this (for example bitblt):
>>    X11DRV_SetBoundRect(physDevDst->bitmap,xDst,yDst,width,height);
>>    X11DRV_CoerceDIBSection( physDevDst, DIB_Status_GdiMod, FALSE );
>>    if (physDevDst != physDevSrc)
>>    {
>>      X11DRV_SetBoundRect(physDevSrc->bitmap,xSrc,ySrc,width,height);
>>      X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE );
>>    }
>I think it would be better to make X11DRV_CoerceDIBSection take the 
>parameters for a bounding rect, otherwise it is possible to forget a call 
>to SetBoundRect and cause the DIB to not be updated.
>Rob Shearman

More information about the wine-devel mailing list