[xserver-commit] xserver/hw/kdrive/src kaa.c,1.21,1.21.2.1 kdrive.h,1.45,1.45.2.1

Eric Anholt xserver-commit@pdx.freedesktop.org
Tue, 23 Dec 2003 14:29:40 -0800


Committed by: anholt

Update of /cvs/xserver/xserver/hw/kdrive/src
In directory pdx:/home/anholt/xserver-dri/hw/kdrive/src

Modified Files:
      Tag: dri-0-1-branch
	kaa.c kdrive.h 
Log Message:
- Implement acceleration of Composite on R128 when there is no mask,
  no transformation, no repeat, and only certain ops are used.
- Add debugging output for software fallbacks for Composite.
- Allow pixmaps in offscreen that don't match root depth.
- Clean up some mess in ati_reg.h.

Many thanks to andersca for a lot of this code.


Index: kaa.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kaa.c,v
retrieving revision 1.21
retrieving revision 1.21.2.1
diff -u -d -r1.21 -r1.21.2.1
--- kaa.c	20 Nov 2003 07:49:46 -0000	1.21
+++ kaa.c	23 Dec 2003 22:29:38 -0000	1.21.2.1
@@ -153,7 +153,6 @@
     unsigned char *dst, *src;
     int i;
 
-    return;
     KdCheckSync (pPixmap->drawable.pScreen);
     
     DBG_MIGRATE (("-> 0x%08x (0x%x) (%dx%d)\n",
@@ -271,6 +270,7 @@
 		break;
 	    }
     }
+
     pPixmap = fbCreatePixmapBpp (pScreen, w, h, depth, bpp);
     if (!pPixmap)
 	return NULL;
@@ -278,8 +278,7 @@
     pKaaPixmap->score = 0;
     pKaaPixmap->area = NULL;
     
-    if (depth == pScreen->rootDepth &&
-	(pPixmap->devKind * h) >= MIN_OFFPIX_SIZE)
+    if ((pPixmap->devKind * h) >= MIN_OFFPIX_SIZE)
 	kaaPixmapAllocArea (pPixmap);
     return pPixmap;
 }
@@ -939,6 +938,76 @@
 #ifdef RENDER
 #include "mipict.h"
 
+#define KAA_DEBUG_FALLBACKS 0
+
+#if KAA_DEBUG_FALLBACKS
+static void
+kaaPrintCompositeFallback(CARD8 op,
+			  PicturePtr pSrc,
+			  PicturePtr pMask,
+			  PicturePtr pDst)
+{
+    char sop[20], ssfmt[20], smfmt[20], sdfmt[20];
+    char sloc, mloc, dloc;
+    int temp;
+
+    switch(op)
+    {
+    case PictOpSrc:
+	sprintf(sop, "Src");
+	break;
+    case PictOpOver:
+	sprintf(sop, "Over");
+	break;
+    default:
+	sprintf(sop, "0x%x", (int)op);
+	break;
+    }
+    switch(pSrc->format)
+    {
+    case PICT_a8r8g8b8:
+	sprintf(ssfmt, "ARGB8888");
+	break;
+    default:
+	sprintf(ssfmt, "0x%x", (int)pSrc->format);
+	break;
+    }
+    sprintf(smfmt, "(none)");
+    if (pMask) {
+	switch(pMask->format)
+	{
+	case PICT_a8:
+	    sprintf(smfmt, "A8");
+	    break;
+	default:
+	    sprintf(smfmt, "0x%x", (int)pMask->format);
+	    break;
+	}
+    }
+    switch(pDst->format)
+    {
+    case PICT_r5g6b5:
+	sprintf(sdfmt, "RGB565");
+	break;
+    default:
+	sprintf(sdfmt, "0x%x", (int)pDst->format);
+	break;
+    }
+    strcpy (smfmt, ("None"));
+    pMask = 0x0;
+
+    sloc = kaaGetOffscreenPixmap(pSrc->pDrawable, &temp, &temp) ? 's' : 'm';
+    mloc = (pMask && kaaGetOffscreenPixmap(pMask->pDrawable, &temp, &temp)) ?
+	    's' : 'm';
+    dloc = kaaGetOffscreenPixmap(pDst->pDrawable, &temp, &temp) ? 's' : 'm';
+
+    ErrorF("Composite fallback: op %s, src 0x%x (%c), mask 0x%x (%c), "
+	   "dst 0x%x (%c)\n"
+	   "                    srcfmt %s, maskfmt %s, dstfmt %s\n",
+	   sop, pSrc, sloc, pMask, mloc, pDst, dloc, ssfmt, smfmt, sdfmt);
+}
+#endif
+
 static void
 kaaComposite(CARD8	op,
 	     PicturePtr pSrc,
@@ -953,42 +1022,111 @@
 	     CARD16	width,
 	     CARD16	height)
 {
-    if (op == PictOpSrc && !pMask)
+    KdScreenPriv (pDst->pDrawable->pScreen);
+    KaaScreenPriv (pDst->pDrawable->pScreen);
+    
+    if (!pMask)
     {
-	/*
-	 * Check for two special cases -- solid fill and copy area
-	 */
-	if (pSrc->pDrawable->width == 1 && pSrc->pDrawable->height == 1 &&
-	    pSrc->repeat)
+	if (op == PictOpSrc)
 	{
-	    ;
+	    /*
+	     * Check for two special cases -- solid fill and copy area
+	     */
+	    if (pSrc->pDrawable->width == 1 && pSrc->pDrawable->height == 1 &&
+		pSrc->repeat)
+	    {
+		;
+	    }
+	    else if (!pSrc->repeat && pSrc->format == pDst->format)
+	    {
+		RegionRec	region;
+		
+		xDst += pDst->pDrawable->x;
+		yDst += pDst->pDrawable->y;
+		xSrc += pSrc->pDrawable->x;
+		ySrc += pSrc->pDrawable->y;
+
+		if (!miComputeCompositeRegion (&region, pSrc, pMask, pDst,
+					       xSrc, ySrc, xMask, yMask, xDst, yDst,
+					       width, height))
+		    return;
+		
+		
+		kaaCopyNtoN (pSrc->pDrawable, pDst->pDrawable, 0,
+			     REGION_RECTS(&region), REGION_NUM_RECTS(&region),
+			     xSrc - xDst, ySrc - yDst,
+			     FALSE, FALSE, 0, 0);
+		return;
+	    }
 	}
-	else if (!pSrc->repeat && pSrc->format == pDst->format)
+
+	if (pScreenPriv->enabled && pKaaScr->info->PrepareBlend)
 	{
-	    RegionRec	region;
-	    
+	    RegionRec region;
+	    BoxPtr pbox;
+	    int nbox;
+	    int src_off_x, src_off_y;
+	    int dst_off_x, dst_off_y;
+	    PixmapPtr pSrcPix, pDstPix;
+
 	    xDst += pDst->pDrawable->x;
 	    yDst += pDst->pDrawable->y;
+
 	    xSrc += pSrc->pDrawable->x;
 	    ySrc += pSrc->pDrawable->y;
-	    if (pMask)
-	    {
-		xMask += pMask->pDrawable->x;
-		yMask += pMask->pDrawable->y;
-	    }
+
 	    if (!miComputeCompositeRegion (&region, pSrc, pMask, pDst,
 					   xSrc, ySrc, xMask, yMask, xDst, yDst,
 					   width, height))
 		return;
 
-				      
-	    kaaCopyNtoN (pSrc->pDrawable, pDst->pDrawable, 0,
-			 REGION_RECTS(&region), REGION_NUM_RECTS(&region),
-			 xSrc - xDst, ySrc - yDst,
-			 FALSE, FALSE, 0, 0);
+
+	    /* Migrate pixmaps to same place as destination */
+	    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);
+	    if (!pSrcPix || !pDstPix ||
+		!(*pKaaScr->info->PrepareBlend) (op, pSrc, pDst, pSrcPix,
+						 pDstPix))
+	    {
+		goto software;
+	    }
+	    
+	    nbox = REGION_NUM_RECTS(&region);
+	    pbox = REGION_RECTS(&region);
+
+	    xSrc -= xDst;
+	    ySrc -= yDst;
+	
+	    while (nbox--)
+	    {
+		(*pKaaScr->info->Blend) (pbox->x1 + xSrc + src_off_x,
+					 pbox->y1 + ySrc + src_off_y,
+					 pbox->x1 + dst_off_x,
+					 pbox->y1 + dst_off_y,
+					 pbox->x2 - pbox->x1,
+					 pbox->y2 - pbox->y1);
+		pbox++;
+	    }
+	    
+	    (*pKaaScr->info->DoneBlend) ();
+	    KdMarkSync(pDst->pDrawable->pScreen);
+
 	    return;
 	}
     }
+
+software:
+#if KAA_DEBUG_FALLBACKS
+    kaaPrintCompositeFallback (op, pSrc, pMask, pDst);
+#endif
+
     if (pSrc->pDrawable->type == DRAWABLE_PIXMAP)
 	kaaPixmapUseMemory ((PixmapPtr) pSrc->pDrawable);
     if (pMask && pMask->pDrawable->type == DRAWABLE_PIXMAP)

Index: kdrive.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kdrive.h,v
retrieving revision 1.45
retrieving revision 1.45.2.1
diff -u -d -r1.45 -r1.45.2.1
--- kdrive.h	1 Dec 2003 04:33:36 -0000	1.45
+++ kdrive.h	23 Dec 2003 22:29:38 -0000	1.45.2.1
@@ -332,6 +332,19 @@
     int	        offscreenByteAlign;
     int         offscreenPitch;
     int		flags;
+
+    Bool        (*PrepareBlend) (int		op,
+				 PicturePtr	pSrcPicture,
+				 PicturePtr	pDstPicture,
+				 PixmapPtr	pSrc,
+				 PixmapPtr	pDst);
+    void        (*Blend) (int	srcX,
+			  int	srcY,
+			  int	dstX,
+			  int	dstY,
+			  int	width,
+			  int	height);
+    void	(*DoneBlend) (void);
 } KaaScreenInfoRec, *KaaScreenInfoPtr;
 
 #define KAA_OFFSCREEN_PIXMAPS (1 << 0)