Module Name:    xsrc
Committed By:   macallan
Date:           Sat Apr 11 20:43:04 UTC 2009

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

Log Message:
clip MTE-drawn rectangles by hand, now pwm looks right again


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 xsrc/external/mit/xf86-video-crime/dist/src/crime.h
cvs rdiff -u -r1.8 -r1.9 \
    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.h
diff -u xsrc/external/mit/xf86-video-crime/dist/src/crime.h:1.4 xsrc/external/mit/xf86-video-crime/dist/src/crime.h:1.5
--- xsrc/external/mit/xf86-video-crime/dist/src/crime.h:1.4	Tue Mar 31 15:57:34 2009
+++ xsrc/external/mit/xf86-video-crime/dist/src/crime.h	Sat Apr 11 20:43:04 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: crime.h,v 1.4 2009/03/31 15:57:34 macallan Exp $ */
+/* $NetBSD: crime.h,v 1.5 2009/04/11 20:43:04 macallan Exp $ */
 /*
  * Copyright (c) 2008 Michael Lorenz
  * All rights reserved.
@@ -91,6 +91,7 @@
 	int			start, xdir, ydir;
 	int			format;
 	int			use_mte;
+	int			cxa, cxe, cya, cye;
 	uint32_t		expand[2048];
 	uint32_t		pattern[8];
 	uint32_t		alpha_color;

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.8 xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c:1.9
--- xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c:1.8	Tue Apr  7 23:11:44 2009
+++ xsrc/external/mit/xf86-video-crime/dist/src/crime_accel.c	Sat Apr 11 20:43:04 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: crime_accel.c,v 1.8 2009/04/07 23:11:44 macallan Exp $ */
+/* $NetBSD: crime_accel.c,v 1.9 2009/04/11 20:43:04 macallan Exp $ */
 /*
  * Copyright (c) 2008 Michael Lorenz
  * All rights reserved.
@@ -64,6 +64,9 @@
 #define MAKE_ROOM(x) do {} while ((16 - \
 				   CRIME_PIPE_LEVEL(*CRIMEREG(0x4000))) < x);
 
+#define MAX(a, b) (a > b ? a : b)
+#define MIN(a, b) (a < b ? a : b)
+
 CARD32 CrimeAlphaTextureFormats[] = {PICT_a8, 0};
 CARD32 CrimeTextureFormats[] = {PICT_a8b8g8r8, PICT_a8r8g8b8, 0};
 
@@ -264,13 +267,25 @@
 )
 {
 	CrimePtr fPtr = CRIMEPTR(pScrn);
+	int xa, xe, ya, ye;
 
 	LOG(CRIME_DEBUG_RECTFILL);
 	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));
+		
+		/*
+		 * the MTE doesn't support clipping so we have to do it
+		 * ourselves - luckily it's trivial with rectangles
+		 */
+		xa = MAX(fPtr->cxa, x);
+		ya = MAX(fPtr->cya, y);
+		xe = MIN(fPtr->cxe, x + w);
+		ye = MIN(fPtr->cye, y + h);
+		if ((xa < xe) && (ya < ye)) {
+			MAKE_ROOM(2);
+			WRITE4(CRIME_MTE_DST0, (xa << 18) | (ya & 0xffff));
+			WRITE4ST(CRIME_MTE_DST1,
+		 	   (((xe << 2) - 1 ) << 16) | ((ye - 1) & 0xffff));
+		}
 	} else {
 		MAKE_ROOM(2);
 		WRITE4(CRIME_DE_X_VERTEX_0, (x << 16) | (y & 0xffff));
@@ -644,6 +659,10 @@
 	MAKE_ROOM(2);
 	WRITE4(CRIME_DE_SCISSOR, (left << 16) | top);
 	WRITE4(CRIME_DE_SCISSOR + 4, ((right + 1) << 16) | (bottom + 1));
+	fPtr->cxa = left;
+	fPtr->cxe = right;
+	fPtr->cya = top;
+	fPtr->cye = bottom;
 	SYNC;
 	DONE(CRIME_DEBUG_CLIPPING);
 }
@@ -657,6 +676,10 @@
 	MAKE_ROOM(2);
 	WRITE4(CRIME_DE_SCISSOR, 0);
 	WRITE4(CRIME_DE_SCISSOR + 4, 0x3fff3fff);
+	fPtr->cxa = 0;
+	fPtr->cxe = 2047;
+	fPtr->cya = 0;
+	fPtr->cye = 2047;
 	SYNC;
 	DONE(CRIME_DEBUG_CLIPPING);
 }
@@ -2000,7 +2023,8 @@
 
 	/* clipping */
 	pXAAInfo->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY |
-		HARDWARE_CLIP_SOLID_FILL | HARDWARE_CLIP_SOLID_LINE |
+		HARDWARE_CLIP_SOLID_FILL | 
+		HARDWARE_CLIP_SOLID_LINE |
 		HARDWARE_CLIP_MONO_8x8_FILL | HARDWARE_CLIP_DASHED_LINE;
 	pXAAInfo->SetClippingRectangle = CrimeSetClippingRectangle;
 	pXAAInfo->DisableClipping = CrimeDisableClipping;

Reply via email to