xserver/hw/kdrive/ati r128_composite.c,1.1,1.2

Eric Anholt <xserver-commit-u7BhqnqprCWvj1b/[email protected]>
Newsgroups gmane.comp.freedesktop.xserver.cvs
Message-ID <[email protected]>
Committed by: anholt

Update of /cvs/xserver/xserver/hw/kdrive/ati
In directory pdx:/tmp/cvs-serv19661/hw/kdrive/ati

Modified Files:
	r128_composite.c 
Log Message:
Clean up Rage 128 composite code.  Now it composites more operations
correctly and is simpler.


Index: r128_composite.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/r128_composite.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- r128_composite.c	17 May 2004 20:18:02 -0000	1.1
+++ r128_composite.c	3 Jul 2004 10:23:03 -0000	1.2
@@ -238,10 +238,6 @@
 
 	if (op >= sizeof(R128BlendOp)/sizeof(R128BlendOp[0]))
 		ATI_FALLBACK(("Unsupported op 0x%x\n", op));
-	if (op == PictOpIn || op == PictOpOut || op == PictOpAtopReverse ||
-	    op == PictOpXor)
-	if (op != PictOpOver)
-		ATI_FALLBACK(("Something's wacky with these ops\n"));
 	if (pSrcPicture->transform)
 		ATI_FALLBACK(("Source transform unsupported.\n"));
 	if (pMaskPicture && pMaskPicture->transform)
@@ -288,27 +284,23 @@
 		 * as necessary using the combiners.
 		 */
 		*tex_cntl_c = R128_DATATYPE_RGB8 << R128_TEX_DATATYPE_SHIFT;
-		bytepp = 1;
 		break;
 	case PICT_a1r5g5b5:
 		*tex_cntl_c = R128_DATATYPE_ARGB1555 << R128_TEX_DATATYPE_SHIFT;
-		bytepp = 2;
 		break;
 	case PICT_a4r4g4b4:
 		*tex_cntl_c = R128_DATATYPE_ARGB4444 << R128_TEX_DATATYPE_SHIFT;
-		bytepp = 2;
 		break;
 	case PICT_r5g6b5:
 		*tex_cntl_c = R128_DATATYPE_RGB565 << R128_TEX_DATATYPE_SHIFT;
-		bytepp = 2;
 		break;
 	case PICT_a8r8g8b8:
 		*tex_cntl_c = R128_DATATYPE_ARGB8888 << R128_TEX_DATATYPE_SHIFT;
-		bytepp = 4;
 		break;
 	default:
 		return FALSE;
 	}
+	bytepp = PICT_FORMAT_BPP(pPict->format) / 8;
 
 	*tex_cntl_c |= R128_MIP_MAP_DISABLE;
 
@@ -319,14 +311,9 @@
 		*tex_cntl_c |= R128_SEC_SELECT_SEC_ST;
 	}
 
-	if (w == 1)
-		l2w = 0;
-	else
-		l2w = ATILog2(w - 1) + 1;
-	if (h == 1)
-		l2h = 0;
-	else
-		l2h = ATILog2(h - 1) + 1;
+	/* ATILog2 returns -1 for value of 0 */
+	l2w = ATILog2(w - 1) + 1;
+	l2h = ATILog2(h - 1) + 1;
 	l2p = ATILog2(pPix->devKind / bytepp);
 
 	if (pPict->repeat && w == 1 && h == 1)
@@ -351,7 +338,7 @@
 	KdScreenPriv(pDst->drawable.pScreen);
 	ATIScreenInfo(pScreenPriv);
 	CARD32 txsize = 0, prim_tex_cntl_c, sec_tex_cntl_c = 0, dstDatatype;
-	CARD32 dst_pitch_offset, color_factor, in_color_factor;
+	CARD32 dst_pitch_offset, color_factor, in_color_factor, alpha_comb;
 	int i;
 	RING_LOCALS;
 
@@ -429,12 +416,17 @@
 	else
 		color_factor = R128_COLOR_FACTOR_TEX;
 
+	if (PICT_FORMAT_A(pSrcPicture->format) == 0)
+		alpha_comb = R128_COMB_ALPHA_COPY_INP;
+	else
+		alpha_comb = R128_COMB_ALPHA_DIS;
+
 	OUT_RING(R128_COMB_COPY |
 	    color_factor |
 	    R128_INPUT_FACTOR_INT_COLOR |
-	    R128_COMB_ALPHA_DIS |
+	    alpha_comb |
 	    R128_ALPHA_FACTOR_TEX_ALPHA |
-	    R128_INP_FACTOR_A_INT_ALPHA);
+	    R128_INP_FACTOR_A_CONST_ALPHA);
 	OUT_RING(txsize);
 	/* We could save some output by only writing the offset register that
 	 * will actually be used.  On the other hand, this is easy.
@@ -453,10 +445,6 @@
 		OUT_RING(DMA_PACKET0(R128_REG_SEC_TEX_CNTL_C, 13));
 		OUT_RING(sec_tex_cntl_c);
 
-		/* XXX: Need to check with keithp to see if component alpha a8
-		 * masks should act as non-CA, or if they should expand the RGB
-		 * channels as 0.
-		 */
 		if (pDstPicture->format == PICT_a8) {
 			color_factor = R128_COLOR_FACTOR_ALPHA;
 			in_color_factor = R128_INPUT_FACTOR_PREV_ALPHA;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.