[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
- Previous message: [xserver-commit] xserver/hw/kdrive/ati r128_blendtmp.h,NONE,1.1.2.1 Makefile.am,1.2.2.1,1.2.2.2 ati_draw.c,1.5.2.2,1.5.2.3 ati_drawtmp.h,1.1.2.1,1.1.2.2 ati_reg.h,1.2.2.1,1.2.2.2
- Next message: [xserver-commit] xserver ChangeLog,3.74.2.2,3.74.2.3
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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 (®ion, pSrc, pMask, pDst,
+ xSrc, ySrc, xMask, yMask, xDst, yDst,
+ width, height))
+ return;
+
+
+ kaaCopyNtoN (pSrc->pDrawable, pDst->pDrawable, 0,
+ REGION_RECTS(®ion), REGION_NUM_RECTS(®ion),
+ 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 (®ion, pSrc, pMask, pDst,
xSrc, ySrc, xMask, yMask, xDst, yDst,
width, height))
return;
-
- kaaCopyNtoN (pSrc->pDrawable, pDst->pDrawable, 0,
- REGION_RECTS(®ion), REGION_NUM_RECTS(®ion),
- 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(®ion);
+ pbox = REGION_RECTS(®ion);
+
+ 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)
- Previous message: [xserver-commit] xserver/hw/kdrive/ati r128_blendtmp.h,NONE,1.1.2.1 Makefile.am,1.2.2.1,1.2.2.2 ati_draw.c,1.5.2.2,1.5.2.3 ati_drawtmp.h,1.1.2.1,1.1.2.2 ati_reg.h,1.2.2.1,1.2.2.2
- Next message: [xserver-commit] xserver ChangeLog,3.74.2.2,3.74.2.3
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]