Module Name:    xsrc
Committed By:   macallan
Date:           Tue Apr  7 23:11:44 UTC 2009

Modified Files:
        xsrc/external/mit/xf86-video-crime/dist/src: crime_accel.c

Log Message:
use MTE for simple copy and rectangle operations whenever possible
The speedup is measurable but somewhat erratic because of the MTE's funny
alignment requirements when doing copy operations. Filling rectangles is
much faster this way.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 \
    xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c
diff -u xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c:1.7 xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c:1.8
--- xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c:1.7	Wed Apr  1 14:58:03 2009
+++ xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c	Tue Apr  7 23:11:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: crime_accel.c,v 1.7 2009/04/01 14:58:03 macallan Exp $ */
+/* $NetBSD: crime_accel.c,v 1.8 2009/04/07 23:11:44 macallan Exp $ */
 /*
  * Copyright (c) 2008 Michael Lorenz
  * All rights reserved.
@@ -94,7 +94,6 @@
 
 	LOG(CRIME_DEBUG_BITBLT);
 	MAKE_ROOM(9);
-#if 0
 	if ((rop == GXcopy) && (planemask == 0xffffffff) && (xdir > 0)) {
 		/* use the MTE */
 		WRITE4(CRIME_MTE_MODE, MTE_MODE_DST_ECC |
@@ -111,7 +110,6 @@
 			WRITE4(CRIME_MTE_SRC_Y_STEP, -1);
 		}		
 	} else
-#endif
 		fPtr->use_mte = 0;
 
 	WRITE4(CRIME_DE_XFER_STEP_X, 1);
@@ -144,7 +142,6 @@
 {
 	CrimePtr fPtr = CRIMEPTR(pScrn);
 	uint32_t prim = DE_PRIM_RECTANGLE;
-	volatile uint32_t reg, oreg;
 	uint32_t rxa, rya, rxe, rye, rxs, rys, rxd, ryd, rxde, ryde;
 
 	LOG(CRIME_DEBUG_BITBLT);
@@ -152,8 +149,8 @@
 	xf86Msg(X_ERROR, "%s: %d, %d; %d x %d -> %d %d\n", __func__,
 	    xSrc, ySrc, w, h, xDst, yDst);
 #endif
-
-	if ((fPtr->use_mte) && (w > 64) && ((w & 3) == 0) && ((xSrc & 3) == 0) && ((xDst & 3) == 0)) {
+	if ((fPtr->use_mte) && (w > 64) && /*((w & 3) == 0) &&*/
+	   ((xSrc & 15) == (xDst & 15))) {
 		if (fPtr->ydir == -1) {
 			/* bottom to top */
 			rye = ySrc;
@@ -171,13 +168,12 @@
 		rxe = ((xSrc + w) << 2) - 1;
 		rxd = xDst << 2;
 		rxde = ((xDst + w) << 2) - 1;
-		oreg = *CRIMEREG(0x4000);
 		MAKE_ROOM(4);
 		WRITE4(CRIME_MTE_SRC0, (rxa << 16) | rya);
 		WRITE4(CRIME_MTE_SRC1, (rxe << 16) | rye);
 		WRITE4(CRIME_MTE_DST0, (rxd << 16) | ryd);
 		WRITE4ST(CRIME_MTE_DST1, (rxde << 16) | ryde);
-		reg = *CRIMEREG(0x4000);
+		//xf86Msg(X_ERROR, "MTE");
 
 #ifdef CRIME_DEBUG_LOUD
 		xf86Msg(X_ERROR, "reg: %08x %08x\n", oreg, reg);
@@ -228,18 +224,32 @@
 	int i;
 
 	LOG(CRIME_DEBUG_RECTFILL);
-	MAKE_ROOM(7);
-	WRITE4(CRIME_DE_PLANEMASK, planemask);
-	WRITE4(CRIME_DE_ROP, rop);
-	WRITE4(CRIME_DE_FG, colour << 8);
-	WRITE4(CRIME_DE_DRAWMODE,
-	    DE_DRAWMODE_PLANEMASK | DE_DRAWMODE_BYTEMASK | DE_DRAWMODE_ROP |
-	    DE_DRAWMODE_SCISSOR_EN);
-	WRITE4(CRIME_DE_PRIMITIVE,
-		DE_PRIM_RECTANGLE | DE_PRIM_LR | DE_PRIM_TB);
-	WRITE4(CRIME_DE_MODE_DST, DE_MODE_TLB_A | DE_MODE_BUFDEPTH_32 |
-			    DE_MODE_TYPE_RGBA | DE_MODE_PIXDEPTH_32);
-	SYNC;
+	if (rop == GXcopy) {
+		fPtr->use_mte = 1;
+		MAKE_ROOM(3);
+		WRITE4(CRIME_MTE_MODE, MTE_MODE_DST_ECC |
+		    MTE_TLB_A << MTE_DST_TLB_SHIFT |
+		    MTE_TLB_A << MTE_SRC_TLB_SHIFT |
+		    MTE_DEPTH_32 << MTE_DEPTH_SHIFT);
+		WRITE4(CRIME_MTE_DST_Y_STEP, 1);
+		WRITE4(CRIME_MTE_BG, colour << 8);
+		SYNCMTE;
+	} else {
+		fPtr->use_mte = 0;
+		MAKE_ROOM(7);
+		WRITE4(CRIME_DE_PLANEMASK, planemask);
+		WRITE4(CRIME_DE_ROP, rop);
+		WRITE4(CRIME_DE_FG, colour << 8);
+		WRITE4(CRIME_DE_DRAWMODE,
+		    DE_DRAWMODE_PLANEMASK | DE_DRAWMODE_BYTEMASK | 	
+		    DE_DRAWMODE_ROP |\
+		    DE_DRAWMODE_SCISSOR_EN);
+		WRITE4(CRIME_DE_PRIMITIVE,
+		    DE_PRIM_RECTANGLE | DE_PRIM_LR | DE_PRIM_TB);
+		WRITE4(CRIME_DE_MODE_DST, DE_MODE_TLB_A | DE_MODE_BUFDEPTH_32 |
+		    DE_MODE_TYPE_RGBA | DE_MODE_PIXDEPTH_32);
+		SYNC;
+	}
 	DONE(CRIME_DEBUG_RECTFILL);
 }
 
@@ -256,10 +266,17 @@
 	CrimePtr fPtr = CRIMEPTR(pScrn);
 
 	LOG(CRIME_DEBUG_RECTFILL);
-	MAKE_ROOM(2);
-	WRITE4(CRIME_DE_X_VERTEX_0, (x << 16) | (y & 0xffff));
-	WRITE4ST(CRIME_DE_X_VERTEX_1,
-	    ((x + w - 1) << 16) | ((y + h - 1) & 0xffff));
+	if (fPtr->use_mte) {
+		MAKE_ROOM(2);
+		WRITE4(CRIME_MTE_DST0, (x << 18) | (y & 0xffff));
+		WRITE4ST(CRIME_MTE_DST1,
+	 	   ((((x + w) << 2) - 1 ) << 16) | ((y + h - 1) & 0xffff));
+	} else {
+		MAKE_ROOM(2);
+		WRITE4(CRIME_DE_X_VERTEX_0, (x << 16) | (y & 0xffff));
+		WRITE4ST(CRIME_DE_X_VERTEX_1,
+		    ((x + w - 1) << 16) | ((y + h - 1) & 0xffff));
+	}
 	DONE(CRIME_DEBUG_RECTFILL);
 }
 

Reply via email to