set of patches from the last 3 weeks

eric anholt ericanholt@hotmail.com
Thu, 19 Feb 2004 21:49:42 +0000


This is a multi-part message in MIME format.

------=_NextPart_000_1976_6e84_1015
Content-Type: text/plain; format=flowed

Here are a few of the patches I've been working on while I've been here in 
Cuba.  I can't commit them myself because I don't have access to anything 
but email and web -- no cvs, cvsup, ftp, ssh, telnet, etc.  Besides, I'm so 
out of contact that I wouldn't be able to clean up after any mess I made.  
So, I'm hoping someone will pick these up and commit if they look good.

The first is some work on the offscreen memory manager.  The first part of 
it is marking pixmaps as dirty whenever they get written to.  This allows us 
to avoid the read from framebuffer when moving back to main memory.  I think 
I've managed to find all the places the pixmap would get touched, but 
someone should look it over to see if I've made any bad assumptions or 
missed places.  Depending on how fast writing to fb is compared to reading 
from fb, we may want to just throw out !dirty pixmaps in offscreen when 
kaaPixmapUseMemory is called.

The second part is keeping a score of how used each pixmap is.  The existing 
score value was only really useful for keeping track of whether a pixmap 
ought to be in framebuffer or not, not whether it was of more value in 
framebuffer than another pixmap.  So, a new score is also kept that gets 
bumped when a pixmap in memory is used and which is degraded over time.  The 
simple calculation now of what set of pixmaps to throw out when allocating 
is whatever group has the least total score that will let the allocation 
succeed.  I don't know of a good enough way to calculate a good working set 
to decide to fail the allocation, so any time we UseScreen a pixmap that 
should be on screen, we bring it in again if it was in memory.  The numbers 
used for how often the value is degraded and for how much the value is 
degraded are arbitrary and un-tuned, primarily because I don't know of any 
good simulation of a desktop environment that we would want to use to 
measure the effectiveness and overhead.  However, I can say that 
subjectively the server is doing much better since I've added this.

The second is a tarball of a trident driver.  I based it off of the old 
driver from Keith, but used the Xati style and fixed some bugs.  I'm not 
sure what the deal is with the corruption on dx < 0 copies (seen for example 
when dragging a window quickly to the right without xcompmgr, but not in any 
other circumstance as far as I can tell), but things seem to work fine if I 
just have those copies fall back.  The server is quite usable with xcompmgr. 
  I'd still like to get the hardware cursor support in, and maybe the 
Composite accel if it's useful, but it's probably as much as I'm going to do 
with that driver for a while, particularly since I didn't bring the docs 
with me.  The computer got damaged and the keyboard doesn't work, so I've 
been working on the thing remotely.  The tarball also contains the bits I 
was working on for the blade driver but which I haven't tested at all.

Work is progressing on a render test suite.  I'm not using Cairo, because it 
doesn't look like it would let me stress Composite as specifically as I 
would like.  So, I'm just comparing the server's output to expected output I 
calculate using floating point calculations.  My main problem is lack of 
xlib knowledge.  I'm fetching the (0,0) value of a window successfully, it 
looks like, but fetching other pixels isn't working.  If someone could 
forward me some sample xlib code to grab an arbitrary pixel from a window 
(and stuff it in an XRenderColor), that would help me a lot.  I don't have 
xlib manual pages or other documentation, and internet access is really 
expensive.  I've written a few tests despite that, and things seem to be 
going pretty well.  I noticed that the Saturate was being done as a 
fbCombineDisjointOver instead of fbCombineDisjointOverReverse, contrary to 
the spec.  I'm not sure if the unused fbCombineSaturate implementations 
would be useful speed-wise, so the diff just axes them and uses the right 
disjoint op.

At this point I'm stuck on the mask != null composite tests because the 
server usually hangs (no C-A-B, but magic sysrq can save me).  It will also 
hang almost 100% of the time when I open the gnome font preferences window 
or SciTE over the network from the trident box, and I've seen it in a couple 
of other odd situations.  It also happens with Xvesa (at least the SciTE 
issue), which confuses me.  It doesn't appear to be related directly to the 
offscreen work, but rather a side effect of it.  So far I've tried disabling 
the dirty optimization with no change, and enabling offscreen debugging to 
see if there was a problem with the offscreen changes, which didn't complain 
about anything.  However, I can't say for sure that it's not a problem with 
the offscreen stuff.

Also attached is a little fix to the ATI driver to allow R128 to accelerate 
more cases, particularly the 1400x1050x16bpp screen case on my laptop.

Please send all replies or personal communication to ericanholt@hotmail.com, 
but remember that I probably won't be able to respond for a week, and try to 
be nice because it's expensive to check email.  My lclark.edu box is 
extremely full and I won't find anything in there.

_________________________________________________________________
Click, drag and drop. My MSN is the simple way to design your homepage. 
http://click.atdmt.com/AVE/go/onm00200364ave/direct/01/

------=_NextPart_000_1976_6e84_1015
Content-Type: text/plain; name="xserver-offscreen-4.diff"; format=flowed
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="xserver-offscreen-4.diff"

Index: kaa.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kaa.c,v
retrieving revision 1.23
diff -u -r1.23 kaa.c
--- kaa.c	8 Jan 2004 08:16:24 -0000	1.23
+++ kaa.c	19 Feb 2004 22:33:08 -0000
@@ -54,25 +54,36 @@
#define KAA_PIXMAP_SCORE_MOVE_OUT   -10
#define KAA_PIXMAP_SCORE_MIN	    -20

-#define MIN_OFFPIX_SIZE		(4096)
+void
+kaaPixmapDirty (DrawablePtr pDrawable)
+{
+    PixmapPtr pPixmap;
+    KaaPixmapPrivPtr pKaaPixmap;
+
+    if (pDrawable->type == DRAWABLE_WINDOW)
+	pPixmap = (*pDrawable->pScreen->GetWindowPixmap)((WindowPtr) pDrawable);
+    else
+	pPixmap = (PixmapPtr)pDrawable;
+
+    pKaaPixmap = KaaGetPixmapPriv(pPixmap);
+    pKaaPixmap->dirty = TRUE;
+}

static void
kaaPixmapSave (ScreenPtr pScreen, KdOffscreenArea *area)
{
     PixmapPtr pPixmap = area->privData;
-    KaaPixmapPriv(pPixmap);
+    KaaPixmapPriv (pPixmap);
     int dst_pitch, src_pitch, bytes;
     unsigned char *dst, *src;
     int i;

     DBG_MIGRATE (("Save 0x%08x (0x%x) (%dx%d)\n",
		  pPixmap->drawable.id,
-		  KaaGetPixmapPriv(pPixmap)->area ?
-		  KaaGetPixmapPriv(pPixmap)->area->offset : -1,
+		  pKaaPixmap->area ?
+		  pKaaPixmap->area->offset : -1,
		  pPixmap->drawable.width,
		  pPixmap->drawable.height));
-
-    KdCheckSync (pPixmap->drawable.pScreen);

     src_pitch = pPixmap->devKind;
     dst_pitch = pKaaPixmap->devKind;
@@ -84,15 +95,21 @@
     pPixmap->devPrivate.ptr = dst;
     pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
     pKaaPixmap->area = NULL;
-
+
+    if (!pKaaPixmap->dirty)
+	return;
+
     bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch;

+    KdCheckSync (pPixmap->drawable.pScreen);
+
     i = pPixmap->drawable.height;
     while (i--) {
	memcpy (dst, src, bytes);
	dst += dst_pitch;
	src += src_pitch;
     }
+    pKaaPixmap->dirty = FALSE;
}

static Bool
@@ -118,8 +135,8 @@

     DBG_PIXMAP(("++ 0x%08x (0x%x) (%dx%d)\n",
		  pPixmap->drawable.id,
-		  KaaGetPixmapPriv(pPixmap)->area ?
-		  KaaGetPixmapPriv(pPixmap)->area->offset : -1,
+		  pKaaPixmap->area ?
+		  pKaaPixmap->area->offset : -1,
		  pPixmap->drawable.width,
		  pPixmap->drawable.height));
     pPixmap->devKind = pitch;
@@ -132,6 +149,7 @@
kaaMoveInPixmap (PixmapPtr pPixmap)
{
     ScreenPtr	pScreen = pPixmap->drawable.pScreen;
+    KaaPixmapPriv (pPixmap);
     KaaScreenPriv (pScreen);
     int dst_pitch, src_pitch, bytes;
     unsigned char *dst, *src;
@@ -139,8 +157,8 @@

     DBG_MIGRATE (("-> 0x%08x (0x%x) (%dx%d)\n",
		  pPixmap->drawable.id,
-		  KaaGetPixmapPriv(pPixmap)->area ?
-		  KaaGetPixmapPriv(pPixmap)->area->offset : -1,
+		  pKaaPixmap->area ?
+		  pKaaPixmap->area->offset : -1,
		  pPixmap->drawable.width,
		  pPixmap->drawable.height));

@@ -152,8 +170,10 @@

     if (pKaaScr->info->UploadToScreen)
     {
-	if (pKaaScr->info->UploadToScreen(pPixmap, src, src_pitch))
+	if (pKaaScr->info->UploadToScreen(pPixmap, src, src_pitch)) {
+	    pKaaPixmap->dirty = FALSE;
	    return;
+	}
     }

     dst = pPixmap->devPrivate.ptr;
@@ -161,14 +181,13 @@

     bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch;

-    KdCheckSync (pPixmap->drawable.pScreen);
-
     i = pPixmap->drawable.height;
     while (i--) {
	memcpy (dst, src, bytes);
	dst += dst_pitch;
	src += src_pitch;
     }
+    pKaaPixmap->dirty = FALSE;
}

static void
@@ -195,13 +214,12 @@
{
     KaaPixmapPriv (pPixmap);

+    KdOffscreenMarkUsed (pPixmap);
     if (pKaaPixmap->score < KAA_PIXMAP_SCORE_MAX)
-    {
	pKaaPixmap->score++;
-	if (!pKaaPixmap->area &&
-	    pKaaPixmap->score >= KAA_PIXMAP_SCORE_MOVE_IN)
-	    kaaMoveInPixmap (pPixmap);
-    }
+    if (!pKaaPixmap->area &&
+	pKaaPixmap->score >= KAA_PIXMAP_SCORE_MOVE_IN)
+	kaaMoveInPixmap (pPixmap);
}

void
@@ -265,11 +283,9 @@
     if (!pPixmap)
	return NULL;
     pKaaPixmap = KaaGetPixmapPriv(pPixmap);
-    pKaaPixmap->score = 0;
+    pKaaPixmap->score = KAA_PIXMAP_SCORE_MOVE_IN - 1;
     pKaaPixmap->area = NULL;

-    if ((pPixmap->devKind * h) >= MIN_OFFPIX_SIZE)
-	kaaPixmapAllocArea (pPixmap);
     return pPixmap;
}

@@ -407,6 +423,7 @@
	}
     }
     (*pKaaScr->info->DoneSolid) ();
+    kaaPixmapDirty(pDrawable);
     KdMarkSync(pDrawable->pScreen);
}

@@ -466,6 +483,7 @@
		    pbox, nbox, dx, dy, reverse, upsidedown,
		    bitplane, closure);
     }
+    kaaPixmapDirty(pDstDrawable);
}

static RegionPtr
@@ -575,6 +593,7 @@
	}
     }
     (*pKaaScr->info->DoneSolid) ();
+    kaaPixmapDirty(pDrawable);
     KdMarkSync(pDrawable->pScreen);
}

@@ -605,6 +624,7 @@
	fbSolidBoxClipped (pDrawable, pClip, x1, y1, x2, y2,
			   fbAnd (GXcopy, fg, pm),
			   fbXor (GXcopy, fg, pm));
+	kaaPixmapDirty(pDrawable);
	return;
     }
     for (nbox = REGION_NUM_RECTS(pClip), pbox = REGION_RECTS(pClip);
@@ -637,6 +657,7 @@
				 partX2 + xoff, partY2 + yoff);
     }
     (*pKaaScr->info->DoneSolid) ();
+    kaaPixmapDirty(pDrawable);
     KdMarkSync(pDrawable->pScreen);
}

@@ -724,6 +745,7 @@
     }

     KdCheckSync (pDrawable->pScreen);
+    kaaPixmapDirty(pDrawable);

     ppci = ppciInit;
     while (nglyph--)
@@ -889,6 +911,7 @@
	fbFillRegionSolid (pDrawable, pRegion, 0,
			   fbReplicatePixel (pixel, pDrawable->bitsPerPixel));
     }
+    kaaPixmapDirty(pDrawable);
}

static void
Index: kaa.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kaa.h,v
retrieving revision 1.2
diff -u -r1.2 kaa.h
--- kaa.h	29 Dec 2003 06:24:01 -0000	1.2
+++ kaa.h	6 Feb 2004 22:29:51 -0000
@@ -44,6 +44,7 @@
     int		    score;
     int		    devKind;
     DevUnion	    devPrivate;
+    Bool	    dirty;
} KaaPixmapPrivRec, *KaaPixmapPrivPtr;

extern int kaaScreenPrivateIndex;
@@ -62,6 +63,9 @@
Bool
kaaPixmapIsOffscreen(PixmapPtr p);

+void
+kaaPixmapDirty(DrawablePtr pDrawable);
+
PixmapPtr
kaaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp);

Index: kaapict.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kaapict.c,v
retrieving revision 1.8
diff -u -r1.8 kaapict.c
--- kaapict.c	9 Jan 2004 08:40:32 -0000	1.8
+++ kaapict.c	19 Feb 2004 22:34:37 -0000
@@ -296,6 +296,7 @@
     }

     (*pKaaScr->info->DoneSolid) ();
+    kaaPixmapDirty(pDst->pDrawable);
     KdMarkSync(pDst->pDrawable->pScreen);

     REGION_UNINIT(pDst->pDrawable->pScreen, &region);
@@ -332,12 +333,11 @@
				   width, height))
	return 1;

-
     if (pSrc->pDrawable->type == DRAWABLE_PIXMAP)
	kaaPixmapUseScreen ((PixmapPtr) pSrc->pDrawable);
     if (pDst->pDrawable->type == DRAWABLE_PIXMAP)
	kaaPixmapUseScreen ((PixmapPtr) pDst->pDrawable);
-
+
     pSrcPix = kaaGetOffscreenPixmap (pSrc->pDrawable, &src_off_x, 
&src_off_y);
     pDstPix = kaaGetOffscreenPixmap (pDst->pDrawable, &dst_off_x, 
&dst_off_y);

@@ -382,6 +382,7 @@
     }

     (*pKaaScr->info->DoneBlend) ();
+    kaaPixmapDirty(pDst->pDrawable);
     KdMarkSync(pDst->pDrawable->pScreen);

     REGION_UNINIT(pDst->pDrawable->pScreen, &region);
@@ -426,7 +427,6 @@
				   width, height))
	return 1;

-
     if (pSrc->pDrawable->type == DRAWABLE_PIXMAP)
	kaaPixmapUseScreen ((PixmapPtr) pSrc->pDrawable);
     if (pMask && pMask->pDrawable->type == DRAWABLE_PIXMAP)
@@ -490,6 +490,7 @@
     }

     (*pKaaScr->info->DoneComposite) ();
+    kaaPixmapDirty(pDst->pDrawable);
     KdMarkSync(pDst->pDrawable->pScreen);

     REGION_UNINIT(pDst->pDrawable->pScreen, &region);
Index: kasync.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kasync.c,v
retrieving revision 1.14
diff -u -r1.14 kasync.c
--- kasync.c	2 Nov 2003 19:56:10 -0000	1.14
+++ kasync.c	6 Feb 2004 22:38:03 -0000
@@ -27,6 +27,7 @@
#include <config.h>
#endif
#include "kdrive.h"
+#include "kaa.h"

/*
  * These functions wrap the low-level fb rendering functions and
@@ -40,6 +41,7 @@
{
     KdCheckSync (pDrawable->pScreen);
     fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -48,6 +50,7 @@
{
     KdCheckSync (pDrawable->pScreen);
     fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -57,6 +60,7 @@
{
     KdCheckSync (pDrawable->pScreen);
     fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
+    kaaPixmapDirty (pDrawable);
}

RegionPtr
@@ -64,6 +68,7 @@
		 int srcx, int srcy, int w, int h, int dstx, int dsty)
{
     KdCheckSync (pSrc->pScreen);
+    kaaPixmapDirty (pDst);
     return fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
}

@@ -73,6 +78,7 @@
		  unsigned long bitPlane)
{
     KdCheckSync (pSrc->pScreen);
+    kaaPixmapDirty (pDst);
     return fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
			bitPlane);
}
@@ -82,6 +88,7 @@
		  DDXPointPtr pptInit)
{
     KdCheckSync (pDrawable->pScreen);
+    kaaPixmapDirty (pDrawable);
     fbPolyPoint (pDrawable, pGC, mode, npt, pptInit);
}

@@ -92,6 +99,7 @@

     if (pGC->lineWidth == 0)
	KdCheckSync (pDrawable->pScreen);
+    kaaPixmapDirty (pDrawable);
     fbPolyLine (pDrawable, pGC, mode, npt, ppt);
}

@@ -101,6 +109,7 @@
{
     if (pGC->lineWidth == 0)
	KdCheckSync(pDrawable->pScreen);
+    kaaPixmapDirty (pDrawable);
     fbPolySegment (pDrawable, pGC, nsegInit, pSegInit);
}

@@ -110,6 +119,7 @@
{
     if (pGC->lineWidth == 0)
	KdCheckSync(pDrawable->pScreen);
+    kaaPixmapDirty (pDrawable);
     fbPolyRectangle (pDrawable, pGC, nrects, prect);
}

@@ -124,6 +134,7 @@
     }
     else
	miPolyArc (pDrawable, pGC, narcs, pArcs);
+    kaaPixmapDirty (pDrawable);
}

#if 0
@@ -133,6 +144,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbFillPolygon (pDrawable, pGC, mode, count, pPts);
+    kaaPixmapDirty (pDrawable);
}
#endif

@@ -142,6 +154,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbPolyFillRect (pDrawable, pGC, nrect, prect);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -150,6 +163,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbPolyFillArc (pDrawable, pGC, narcs, pArcs);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -159,6 +173,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -168,6 +183,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -177,6 +193,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -187,6 +204,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbGetImage (pDrawable, x, y, w, h, format, planeMask, d);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -199,6 +217,7 @@
{
     KdCheckSync(pDrawable->pScreen);
     fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -210,6 +229,7 @@
{
     KdCheckSync(pWin->drawable.pScreen);
     fbSaveAreas (pPixmap, prgnSave, xorg, yorg, pWin);
+    kaaPixmapDirty ((DrawablePtr)pWin);
}

void
@@ -221,6 +241,7 @@
{
     KdCheckSync(pWin->drawable.pScreen);
     fbRestoreAreas (pPixmap, prgnSave, xorg, yorg, pWin);
+    kaaPixmapDirty ((DrawablePtr)pWin);
}

void
@@ -228,6 +249,7 @@
{
     KdCheckSync (pWin->drawable.pScreen);
     fbPaintWindow (pWin, pRegion, what);
+    kaaPixmapDirty ((DrawablePtr)pWin);
}

void
@@ -235,6 +257,7 @@
{
     KdCheckSync (pWin->drawable.pScreen);
     fbCopyWindow (pWin, ptOldOrg, prgnSrc);
+    kaaPixmapDirty ((DrawablePtr)pWin);
}

#if KD_MAX_FB > 1
@@ -246,6 +269,7 @@
{
     KdCheckSync (pDrawable->pScreen);
     fbOverlayPaintKey (pDrawable,  pRegion, pixel, layer);
+    kaaPixmapDirty (pDrawable);
}

void
@@ -253,6 +277,7 @@
{
     KdCheckSync (pWin->drawable.pScreen);
     fbOverlayCopyWindow (pWin, ptOldOrg, prgnSrc);
+    kaaPixmapDirty ((DrawablePtr)pWin);
}
#endif

Index: kdrive.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kdrive.h,v
retrieving revision 1.49
diff -u -r1.49 kdrive.h
--- kdrive.h	8 Jan 2004 08:16:24 -0000	1.49
+++ kdrive.h	6 Feb 2004 23:25:33 -0000
@@ -124,12 +124,13 @@
     int			save_offset;
     int			size;
     pointer		privData;
-
+    int			score;
+
     KdOffscreenSaveProc save;

     KdOffscreenState	state;
-
-   KdOffscreenArea	*next;
+
+    KdOffscreenArea	*next;
};

#define RR_Rotate_All	(RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270)
@@ -888,6 +889,9 @@
void
KdOffscreenFini (ScreenPtr pScreen);

+void
+KdOffscreenMarkUsed (PixmapPtr pPixmap);
+
/* function prototypes to be implemented by the drivers */
void
InitCard (char *name);
Index: koffscreen.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/koffscreen.c,v
retrieving revision 1.14
diff -u -r1.14 koffscreen.c
--- koffscreen.c	3 Jan 2004 11:17:44 -0000	1.14
+++ koffscreen.c	19 Feb 2004 22:48:02 -0000
@@ -26,6 +26,7 @@
#include <config.h>
#endif
#include "kdrive.h"
+#include "kaa.h"

#define DEBUG_OFFSCREEN 0
#if DEBUG_OFFSCREEN
@@ -69,9 +70,9 @@
		  KdOffscreenSaveProc save,
		  pointer privData)
{
-    KdOffscreenArea *area, **prev;
+    KdOffscreenArea *area, *begin, *best;
     KdScreenPriv (pScreen);
-    int tmp, real_size = 0;
+    int tmp, real_size = 0, best_score;

     KdOffscreenValidate (pScreen);
     if (!align)
@@ -90,7 +91,7 @@
	return NULL;
     }

-    /* Go through the areas */
+    /* Try to find a free space that'll fit. */
     for (area = pScreenPriv->off_screen_areas; area; area = area->next)
     {
	/* skip allocated areas */
@@ -117,38 +118,43 @@
	 */

	/* prev points at the first object to boot */
-	prev = (KdOffscreenArea **) &pScreenPriv->off_screen_areas;
-	while ((area = *prev))
+	best = NULL;
+	best_score = MAXINT;
+	for (begin = pScreenPriv->off_screen_areas; begin != NULL;
+	     begin = begin->next)
	{
-	    int avail;
-	    KdOffscreenArea *scan, **nprev;
-
+	    int avail, score;
+	    KdOffscreenArea *scan;
+
+	    if (begin->state == KdOffscreenLocked)
+		continue;
+
	    /* adjust size to match alignment requirement */
	    real_size = size;
-	    tmp = area->offset % align;
+	    tmp = begin->offset % align;
	    if (tmp)
		real_size += (align - tmp);

	    avail = 0;
-	    /* now see if we can make room here */
-	    for (nprev = prev; (scan = *nprev); nprev = &scan->next)
+	    score = 0;
+	    /* now see if we can make room here, and how costly it'll be. */
+	    for (scan = begin; scan != NULL; scan = scan->next)
	    {
		if (scan->state == KdOffscreenLocked)
		    break;
+		if (scan->state == KdOffscreenRemovable)
+		    score += scan->score;
		avail += scan->size;
		if (avail >= real_size)
		    break;
	    }
-	    /* space? */
-	    if (avail >= real_size)
-		break;
-
-	    /* nope, try the next area */
-	    prev = nprev;
-	    /* skip to next unlocked area */
-	    while ((area = *prev) && area->state == KdOffscreenLocked)
-		prev = &area->next;
+	    /* Is it the best option we've found so far? */
+	    if (avail >= real_size && score < best_score) {
+		best = begin;
+		best_score = score;
+	    }
	}
+	area = best;
	if (!area)
	{
	    DBG_OFFSCREEN (("Alloc 0x%x -> NOSPACE\n", size));
@@ -157,6 +163,12 @@
	    return NULL;
	}

+	/* adjust size to match alignment requirement */
+	real_size = size;
+	tmp = begin->offset % align;
+	if (tmp)
+	    real_size += (align - tmp);
+
	/*
	 * Kick out first area if in use
	 */
@@ -183,6 +195,7 @@
	new_area->state = KdOffscreenAvail;
	new_area->save = 0;
	new_area->next = area->next;
+	new_area->score = 0;
	area->next = new_area;
	area->size = real_size;
     }
@@ -195,6 +208,7 @@
	area->state = KdOffscreenRemovable;
     area->privData = privData;
     area->save = save;
+    area->score = 0;

     area->save_offset = area->offset;
     area->offset = (area->offset + align - 1) & ~(align - 1);
@@ -264,6 +278,7 @@
     area->state = KdOffscreenAvail;
     area->save = 0;
     area->offset = area->save_offset;
+    area->score = 0;

     /*
      * Find previous area
@@ -286,6 +301,29 @@
     KdOffscreenValidate (pScreen);
}

+void
+KdOffscreenMarkUsed (PixmapPtr pPixmap)
+{
+    KaaPixmapPriv (pPixmap);
+    KdScreenPriv (pPixmap->drawable.pScreen);
+    static int iter = 0;
+
+    if (!pKaaPixmap->area)
+	return;
+
+    /* The numbers here are arbitrary.  We may want to tune these. */
+    pKaaPixmap->area->score += 100;
+    if (++iter == 10) {
+	KdOffscreenArea *area;
+	for (area = pScreenPriv->off_screen_areas; area != NULL;
+	     area = area->next)
+	{
+	    if (area->state == KdOffscreenRemovable)
+		area->score = (area->score * 7) / 8;
+	}
+    }
+}
+
Bool
KdOffscreenInit (ScreenPtr pScreen)
{
@@ -303,6 +341,7 @@
     area->size = pScreenPriv->screen->memory_size - area->offset;
     area->save = 0;
     area->next = NULL;
+    area->score = 0;

     /* Add it to the free areas */
     pScreenPriv->off_screen_areas = area;
Index: kpict.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kpict.c,v
retrieving revision 1.6
diff -u -r1.6 kpict.c
--- kpict.c	14 Oct 2003 05:07:39 -0000	1.6
+++ kpict.c	6 Feb 2004 23:30:31 -0000
@@ -26,6 +26,7 @@
#include <config.h>
#endif
#include "kdrive.h"
+#include "kaa.h"
#include <picturestr.h>
#include <mipict.h>
#include <fbpict.h>
@@ -57,6 +58,7 @@
		 yDst,
		 width,
		 height);
+    kaaPixmapDirty(pDst->pDrawable);
}

void


------=_NextPart_000_1976_6e84_1015
Content-Type: application/x-gzip-compressed; name="xserver-trident-5.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="xserver-trident-5.tar.gz"

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
E/XSl22uHFpVXxMP/roafnOq60/DV/whtrVddTe+W20xMvRql33VDhsZVjez
qp97i21mK2Lp1fXH87W4ogattqHRfSUHE8Juf5tJ5IUTB4Oq66P5Y9J0tXp/
mi6VHkbT/f7yNF0oPD1NVyr3p2mQCa24cWk6n384Tb9582NoOggeRNPF4v1o
+uzsQTS9tfVoNB3zut797Yi6jkQdQ6PC9jF9fpv6OXj9c5BC76uvzyYTtILs
tYyruWnlfisjYOBrga3I2sObwQizvRhcsKZKa65avwIVMlbFPQPbV4Mzwlul
MtQoHSboVkcppc02Wwow0R7FH7ALL/gmg+tB205EX4wQ6N740puB/O5G4XnD
+tVfKghxo3nwfiBk7QGLz6YV0TgtBrd0lmowiBC/vQC9bHNpRYrTWgCP21ii
OKKt1q0Y56PeF7jj/aFWw53D3U6jcdRt758e1trgmMNEg/EZHML12/mgNhp+
AYc0pXBYezjvg8vjmHTE6eEnloZkHtIosElYXnPZUcTE3SmoYGWUgYU6tnIM
HdGspRKKxmkXRckJty5RflwjLyoTlzzsTb/i/WTDSHX8e8ksFQ++6b+aDFny
1kdEZJ4ht6YfYiQ6spfCncvonOHX3nC+H7CmyCgDtxox6MF3P2zv27v/u+IL
YAvu/5ZyxaKy/1mm/d9Ccv/rSZ5k/zfZ/032f5P93+ew/2va/0S1eZ8RUBFg
iAHmjAshttEWZ4GSZqLeRW+CEgP9JIcTvdFVNoViYGpyIX6df7HtqqjlC/qN
vMlT7Fv+96bA3wtRBQFuq5fjeNrHHMX73oxsx6WCG/73VhUSl8aioN7iYfLo
HG/aP6WI7NcnntRsfip/8W/X9OcPb2pyNSHb1wvBTH0IQ+rxdZG9InpgD8n1
0pIdZK2CHqd/xNppJd1jrPVC297pHI/xH05ciQWg/5NHyP+6iZBV57HI/n+x
pMn/RbD/Xyom8v/TPIn8n8j/ifyfyP/PQf5/Rvof3HxoqL7Hthehzo6ZcIW+
4BkbAckQ/95uC9vxZEo8dTaad/sXgUzLr3SiuYgEu7qF0tlkotll7TTYqN2t
nTTSUzSVtaa5DeBmsmC7MubGN3hyzFcyLPp/1slbeTo9Rb+eTfZk8Gpzhbvx
ll+3AUyHH/fOtMryTPFMN3Yw5W2RFPv0fYc7Dq9mvJ9ZoeT3O1kI3SnCotWi
8MXG+oWce+oneHw3WPkuBXvz2+trAdr55d7CGcA2VG+Z2OAOjkWqMppMl75k
ttGn6dVsNBhM0uhqbg0amFcmzeNtuPY5yK9pqGtRrPa7wXyvx8JuJwNrfZUV
A/NFwAHk2o0POlZQecAxu8YDlTREA+O+vWvY9DfPItFHXx/cg1bfshrIRMHv
Ot54hnoJr6uIy1d8QLr97IALpfBUtSILt9VG3GLBF1dco9bhjMp6V6M5wB1H
Gul/QhY/B+AfgWb+Abpk5v7Jo9oG+9Q8NfIe0YR1IhmqtRei5kLVc/7BUFqJ
4p9183HBFqJd7sIDf09gEGRhzSo/w2/+WbRurOOUn8KGKNVsQ47IEO+0mCd3
VH91yZoaRJEq+8xae5blTjaMwL+uesH1eBqQ7zRZHTgkpGYafPswZDLb65TV
bJ6DQjHeoHAqpRc7qeI2Jc3zB3bKmXtG5gKN3Juz7mD99iriuJ/8u2OrZVip
4LQz5OjPtLmgeiL1nZJPqzIy3mnf/wf2rsos3QfDkAL2Qo5+ke2JvsaD1Wnf
aDN6D2kzp9G0tHirralRZTabyMhqtqXaLazhTMMQZsNRy6lyhrScKjabkfxE
vdJdSZfIKZaXztfXlLiAW1LaO+2fYc+wMPLlTT6tdWfZGT8jnIx6l4OL3uyr
xQszGS+BE/uS9cMh5RK2nH5n0DA06+44c3BIVzbfZWlLMAzQabWzluDG2vh3
r2fp++37Cr+ocqAj1dzk5RC/KYifd8Kp9NsUOBX6N/KkcOom82TZVPo2r0Sy
m3xEbaXJMohU0CIVvJF0c0/aG9zFFEzEZ9aIJajZ7BFvZF8nEzn2V7jRGn/a
Y9IACuiMwQTgLJjEdHi79dDK09IGVhincd+M9xhj+v670dDifDHDGk8fO9oQ
iBon5ojqNuuiZUzSgYJJ4oESyZdrRUi8m3jPgqWl1He2XuF9C+9aYi93Utep
V6m8TFD/ALWHD39oCPMDzHyv/qACsF/XKDnyhvi+Y5iG4mULI08y4JYVa8II
Spb2DbM4G31StAw1ihERWADFfMn6TlvSUYukrjMx+Ajkjs0ho0PzxWRAFNPK
nZqfcvcNT+t8w9Um8hxAIehHb7E+60fs/2/2v4GPt/F0sPo8Fuj/sMDyP3Jb
W2Uw/l8oFdH+f66c7P8/xSP9Pgwv18XvdVA9nq1vjoZns/VTtgAFY/Psz+ao
t/5iczROKOrv89j6f2S9f7V5LKD/4lZFO//L5VD/r1hJ6P8pnuT8Lzn/S87/
kvO/v9v539fR8PLqBg/4+Omaz1OmmPXo4+y334XWFNz4gM3wtHLRi6tcr7tN
vF5Dfv9q8zkb7+wfWMDC2E/jlRwrn+3UMHj1L+QBfEMVvrx8SQtTWFP/CadC
uK6kM58DqE1zeBm0+8M0RCYHw1lMiJwLZ1N/vnyZTW1A7uTUWrkirAVBeoMv
k9D/IcfJyyF3Wr1bV/PJlbgsRy72JuqF77pMvzA2Qo3zgr1847suWnwjDuER
uG1ktn8J2EVJEmoDW+FwzDikqAR++TC4PRsLN49a+kFw83E2OJx9Sakjvg8B
fYJbFx4/m+AlSgPQULvDw1xIrj0d9xlnqk2/IGf3l5taaEjbf5dz2HjZxh0q
X4a4/ZOe4iY3ZG7lkEqrlmPpgndr4fFzjSJ9COxCmTG0rR8siLUeFvKf5jJq
5TLGAv2vUqVUUfZ/CiD/FSvlxP/bkzyJ/JfIf4n8l8h//9P+f56V6tjrF6mF
2mNQbDrvg1+2S2yONA9y/DppCzXOVqNaxr5nU1y/zKtelsYzGqk8pjS0HqZA
JpMl9TCV7OOriLmXVbg8lxoq2Z5Vj+xLM/kdTwLZ31evuBgP5bcVwkxDpxnW
BGnXtqnUNvDYM2Ut51ov9UWQFkvNGNw+aQZbNYfLBKHqdMeP3CgE6yAO4OfD
iwFw5rdpOLf0KlCYNdMXFh4dJmjc56CHppmsjqGMptuvjqGOZiXu0UnzHBYT
5IoJOjN1SrxQe82ym/28FdjwWtbz1F+DVbemw0av99Jjs0d4HDW2x1AU2w7X
jiPduIdov7FZuxpDAy5SgWzlKl5Cd+wemmm8PjG004SawSL+vqO0Q0BZROep
9V6AOkxsdcRogU2vTLqew9phc3NTcFkhEQzmkJG0OSEMeoQyYbTVnw1zxMBm
hJz3pD40OugWL4ylbEtnDS24iCjKTHTWVDkMj/JZRogujWkqPYuG687P4f/l
qo5sFdQbBOUuFZu0A7l6g1IcRBGIKFgOreUSRmcRIg2/kxGv1s8qr9sCf26e
1YGdoK2qQ9BxYpPzWfNqNIIXjy4iAm1NRAelEyVX49O1r2RuqH6l3u6rf8Uq
CAmRcbSQVACjxf+3V4FLTW2LdBuX6Wvup2S5AdJptdmwsxcfXBssPB2pNhmt
MBb7avVyOpCRjEL6DIun9+hxJAaqR7cFUN7SFyI39EUTI2zzPBFcBnS2lIsP
IWtLPxr8A7mg0MkVnU64mk6ei9yk6PT499NjULMpCShSlrP7DokPqQ1Go6R7
5ycmChRbcJPpOLjqw4bddHo1ge0lSVyR+pmPxxA89LykPuYjEvMyip0PszIg
VrxKtzP+UFe+Ux6sy6mpbmLUSAlE5xJSy9EkeU2XHzUOJflHp6wxEUg34ype
xudfUgPSXzKhCxmjZBZ7g3QzrlKmrpVqeK3ZNswWxm5Zv+LpUu23kn6x29Wv
krpU6y3RK3f3nTGUlm8I/09UWJMneZIneZIneZIneZIneZIneZIneZJnZc9/
Afro1G0A8AAA


------=_NextPart_000_1976_6e84_1015
Content-Type: text/plain; name="xserver-ati-r128pitch.diff"; format=flowed
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="xserver-ati-r128pitch.diff"

Index: ati_drawtmp.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_drawtmp.h,v
retrieving revision 1.4
diff -u -r1.4 ati_drawtmp.h
--- ati_drawtmp.h	30 Dec 2003 08:45:53 -0000	1.4
+++ ati_drawtmp.h	19 Feb 2004 22:56:28 -0000
@@ -54,8 +54,18 @@
	dst_pitch = pDst->devKind;
	dst_offset = ((CARD8 *)pDst->devPrivate.ptr -
	    pScreenPriv->screen->memory_base);
-	if ((dst_pitch & (atis->kaa.offscreenPitch - 1)) != 0)
-		ATI_FALLBACK(("Bad dst pitch 0x%x\n", dst_pitch));
+	/* On the R128, depending on the bpp the screen can be set up so that it
+	 * doesn't meet the offscreenPitch requirement but can still be
+	 * accelerated, so we check the specific pitch requirement of alignment
+	 * to 8 pixels.
+	 */
+	if (!atic->is_radeon) {
+		if (dst_pitch % pDst->drawable.bitsPerPixel != 0)
+			ATI_FALLBACK(("Bad dst pitch 0x%x\n", dst_pitch));
+	} else {
+		if (dst_pitch % atis->kaa.offscreenPitch != 0)
+			ATI_FALLBACK(("Bad dst pitch 0x%x\n", dst_pitch));
+	}
	if ((dst_offset & (atis->kaa.offscreenByteAlign - 1)) != 0)
		ATI_FALLBACK(("Bad dst offset 0x%x\n", dst_offset));

@@ -63,8 +73,15 @@
		src_pitch = pSrc->devKind;
		src_offset = ((CARD8 *)pSrc->devPrivate.ptr -
		    pScreenPriv->screen->memory_base);
-		if ((src_pitch & (atis->kaa.offscreenPitch - 1)) != 0)
-			ATI_FALLBACK(("Bad src pitch 0x%x\n", src_pitch));
+		if (!atic->is_radeon) {
+			if (src_pitch % pSrc->drawable.bitsPerPixel != 0)
+				ATI_FALLBACK(("Bad src pitch 0x%x\n",
+				    src_pitch));
+		} else {
+			if (src_pitch % atis->kaa.offscreenPitch != 0)
+				ATI_FALLBACK(("Bad src pitch 0x%x\n",
+				    src_pitch));
+		}
		if ((src_offset & (atis->kaa.offscreenByteAlign - 1)) != 0)
			ATI_FALLBACK(("Bad src offset 0x%x\n", src_offset));
	}


------=_NextPart_000_1976_6e84_1015
Content-Type: text/plain; name="xserver-fb-satfix.diff"; format=flowed
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="xserver-fb-satfix.diff"

Index: fbcompose.c
===================================================================
RCS file: /cvs/xserver/xserver/fb/fbcompose.c,v
retrieving revision 1.19
diff -u -r1.19 fbcompose.c
--- fbcompose.c	28 Dec 2003 12:58:00 -0000	1.19
+++ fbcompose.c	18 Feb 2004 18:52:32 -0000
@@ -759,93 +759,6 @@
     }
}

-void
-fbCombineSaturateU (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst)
-{
-    CARD32  s = fbCombineMaskU (src, msk), d;
-#if 0
-    CARD16  sa, da;
-    CARD16  ad, as;
-    CARD16  t;
-    CARD32  m,n,o,p;
-
-    d = (*dst->fetch) (dst);
-    sa = s >> 24;
-    da = ~d >> 24;
-    if (sa <= da)
-    {
-	m = FbAdd(s,d,0,t);
-	n = FbAdd(s,d,8,t);
-	o = FbAdd(s,d,16,t);
-	p = FbAdd(s,d,24,t);
-    }
-    else
-    {
-	as = (da << 8) / sa;
-	ad = 0xff;
-	m = FbGen(s,d,0,as,ad,t,u,v);
-	n = FbGen(s,d,8,as,ad,t,u,v);
-	o = FbGen(s,d,16,as,ad,t,u,v);
-	p = FbGen(s,d,24,as,ad,t,u,v);
-    }
-    (*dst->store) (dst, m|n|o|p);
-#else
-    if ((s >> 24) == 0xff)
-	(*dst->store) (dst, s);
-    else
-    {
-	d = (*dst->fetch) (dst);
-	if ((s >> 24) > (d >> 24))
-	    (*dst->store) (dst, s);
-    }
-#endif
-}
-
-void
-fbCombineSaturateC (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst)
-{
-    FbCompSrc	cs;
-    CARD32  s, d;
-    CARD16  sa, sr, sg, sb, da;
-    CARD16  t, u, v;
-    CARD32  m,n,o,p;
-
-    cs = fbCombineMaskC (src, msk);
-    d = (*dst->fetch) (dst);
-    s = cs.value;
-    sa = (cs.alpha >> 24) & 0xff;
-    sr = (cs.alpha >> 16) & 0xff;
-    sg = (cs.alpha >>  8) & 0xff;
-    sb = (cs.alpha      ) & 0xff;
-    da = ~d >> 24;
-
-    if (sb <= da)
-	m = FbAdd(s,d,0,t);
-    else
-	m = FbGen (s, d, 0, (da << 8) / sb, 0xff, t, u, v);
-
-    if (sg <= da)
-	n = FbAdd(s,d,8,t);
-    else
-	n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t, u, v);
-
-    if (sr < da)
-	o = FbAdd(s,d,16,t);
-    else
-	o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t, u, v);
-
-    if (sa <= da)
-	p = FbAdd(s,d,24,t);
-    else
-	p = FbGen (s, d, 24, (da << 8) / sa, 0xff, t, u, v);
-
-    (*dst->store) (dst, m|n|o|p);
-}
-
/*
  * All of the disjoint composing functions

@@ -1521,7 +1434,7 @@
     fbCombineAtopReverseU,
     fbCombineXorU,
     fbCombineAddU,
-    fbCombineDisjointOverU, /* Saturate */
+    fbCombineDisjointOverReverseU, /* Saturate */
     0,
     0,
     fbCombineClear,
@@ -1568,7 +1481,7 @@
     fbCombineAtopReverseC,
     fbCombineXorC,
     fbCombineAddC,
-    fbCombineDisjointOverC, /* Saturate */
+    fbCombineDisjointOverReverseC, /* Saturate */
     0,
     0,
     fbCombineClear,	    /* 0x10 */
Index: fbpict.h
===================================================================
RCS file: /cvs/xserver/xserver/fb/fbpict.h,v
retrieving revision 1.16
diff -u -r1.16 fbpict.h
--- fbpict.h	15 Jan 2004 09:09:29 -0000	1.16
+++ fbpict.h	18 Feb 2004 18:52:15 -0000
@@ -295,15 +295,8 @@
	       FbCompositeOperand    *msk,
	       FbCompositeOperand    *dst);

-void
-fbCombineSaturateU (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst);
-
-void
-fbCombineSaturateC (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst);
+#define fbCombineSaturateU fbCombineDisjointOverReverseU
+#define fbCombineSaturateC fbCombineDisjointOverReverseC

CARD8
fbCombineDisjointOutPart (CARD8 a, CARD8 b);


------=_NextPart_000_1976_6e84_1015--