[Nouveau] [PATCH] nv30/exa : cleanup from nv40 exa

Xavier Chantry chantry.xavier at gmail.com
Tue Apr 20 04:58:45 PDT 2010


This has two purposes :
- cleaner code
- reduce the diff between nv30 and nv40 exa for a possible nvfx_exa merge ?

The main differences seem to be that nv30 uses rect texture format (and does
not support repeat on that).  Then there are some minor changes in TX_FORMAT
RT_FORMAT and TEX_FILTER usage.  And NVAccelInitNVx0TCL look complete
different.

Tested with:
./rendercheck -t fill,dcoords,scoords,mcoords,tscoords,tmcoords,triangles,bug7366
./rendercheck -f a8r8g8b8,x8r8g8b8,r5g6b5,a8,a8b8g8r8,x8b8g8r8,x1r5g5b5
              -o Clear,Src,Dst,Over,OverReverse,In,InReverse,Out,OutReverse,Atop
              -t blend
(restricted blend test to supported formats and operation. exluded
composite,cacomposite,gradients,repeat tests which seem to take forever)

Signed-off-by: Xavier Chantry <chantry.xavier at gmail.com>
---
 src/nv30_exa.c |  393 ++++++++++++++++++++++++--------------------------------
 src/nv40_exa.c |    2 +-
 2 files changed, 166 insertions(+), 229 deletions(-)

diff --git a/src/nv30_exa.c b/src/nv30_exa.c
index b736fb3..2cd7d32 100644
--- a/src/nv30_exa.c
+++ b/src/nv30_exa.c
@@ -56,26 +56,28 @@ typedef struct nv30_exa_state {
 static nv30_exa_state_t exa_state;
 #define NV30EXA_STATE nv30_exa_state_t *state = &exa_state
 
+#define NV34TCL_RT_FORMAT_COLOR_X1R5G5B5 0x00000002
 static nv_pict_surface_format_t
 NV30SurfaceFormat[] = {
-	{ PICT_a8r8g8b8	, 0x148 },
-	{ PICT_a8b8g8r8	, 0x150 },
-	{ PICT_x8r8g8b8	, 0x145 },
-	{ PICT_x8b8g8r8	, 0x14f },
-	{ PICT_r5g6b5	, 0x143 },
-	{ PICT_a8       , 0x149 },
-	{ PICT_x1r5g5b5	, 0x142 },
+	{ PICT_a8r8g8b8	, NV34TCL_RT_FORMAT_COLOR_A8R8G8B8 },
+	{ PICT_x8r8g8b8	, NV34TCL_RT_FORMAT_COLOR_X8R8G8B8 },
+	{ PICT_r5g6b5	, NV34TCL_RT_FORMAT_COLOR_R5G6B5   },
+	{ PICT_a8       , NV34TCL_RT_FORMAT_COLOR_B8       },
+	{ PICT_a8b8g8r8	, NV34TCL_RT_FORMAT_COLOR_A8B8G8R8 },
+	{ PICT_x8b8g8r8	, NV34TCL_RT_FORMAT_COLOR_X8B8G8R8 },
+	{ PICT_x1r5g5b5	, NV34TCL_RT_FORMAT_COLOR_X1R5G5B5 },
+	{ -1, ~0 }
 };
 
 static nv_pict_surface_format_t *
 NV30_GetPictSurfaceFormat(int format)
 {
-	int i;
+	int i = 0;
 
-	for(i=0;i<sizeof(NV30SurfaceFormat)/sizeof(NV30SurfaceFormat[0]);i++)
-	{
+	while (NV30SurfaceFormat[i].pict_fmt != -1) {
 		if (NV30SurfaceFormat[i].pict_fmt == format)
 			return &NV30SurfaceFormat[i];
+		i++;
 	}
 
 	return NULL;
@@ -123,106 +125,72 @@ NV30EXAHackupA8Shaders(ScrnInfoPtr pScrn)
 	}
 }
 
-/* should be in nouveau_reg.h at some point.. */
-#define NV34TCL_TX_SWIZZLE_UNIT_S0_X_ZERO	 0
-#define NV34TCL_TX_SWIZZLE_UNIT_S0_X_ONE	 1
-#define NV34TCL_TX_SWIZZLE_UNIT_S0_X_S1		 2
-
-#define NV34TCL_TX_SWIZZLE_UNIT_S0_X_SHIFT	14
-#define NV34TCL_TX_SWIZZLE_UNIT_S0_Y_SHIFT	12
-#define NV34TCL_TX_SWIZZLE_UNIT_S0_Z_SHIFT	10
-#define NV34TCL_TX_SWIZZLE_UNIT_S0_W_SHIFT	 8
-
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_X_X		 3
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_X_Y		 2
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_X_Z		 1
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_X_W		 0
-
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_X_SHIFT	 6
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_Y_SHIFT	 4
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_Z_SHIFT	 2
-#define NV34TCL_TX_SWIZZLE_UNIT_S1_W_SHIFT	 0
-
-#define _(r,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w)                       \
-  {                                                                           \
-  PICT_##r,                                                                   \
-  (tf),                                                                       \
-  (NV34TCL_TX_SWIZZLE_UNIT_S0_X_##ts0x << NV34TCL_TX_SWIZZLE_UNIT_S0_X_SHIFT)|\
-  (NV34TCL_TX_SWIZZLE_UNIT_S0_X_##ts0y << NV34TCL_TX_SWIZZLE_UNIT_S0_Y_SHIFT)|\
-  (NV34TCL_TX_SWIZZLE_UNIT_S0_X_##ts0z << NV34TCL_TX_SWIZZLE_UNIT_S0_Z_SHIFT)|\
-  (NV34TCL_TX_SWIZZLE_UNIT_S0_X_##ts0w << NV34TCL_TX_SWIZZLE_UNIT_S0_W_SHIFT)|\
-  (NV34TCL_TX_SWIZZLE_UNIT_S1_X_##ts1x << NV34TCL_TX_SWIZZLE_UNIT_S1_X_SHIFT)|\
-  (NV34TCL_TX_SWIZZLE_UNIT_S1_X_##ts1y << NV34TCL_TX_SWIZZLE_UNIT_S1_Y_SHIFT)|\
-  (NV34TCL_TX_SWIZZLE_UNIT_S1_X_##ts1z << NV34TCL_TX_SWIZZLE_UNIT_S1_Z_SHIFT)|\
-  (NV34TCL_TX_SWIZZLE_UNIT_S1_X_##ts1w << NV34TCL_TX_SWIZZLE_UNIT_S1_W_SHIFT)\
+#define _(r,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w)             \
+  {                                                                 \
+  PICT_##r, NV34TCL_TX_FORMAT_FORMAT_##tf,                          \
+  NV34TCL_TX_SWIZZLE_S0_X_##ts0x | NV34TCL_TX_SWIZZLE_S0_Y_##ts0y | \
+  NV34TCL_TX_SWIZZLE_S0_Z_##ts0z | NV34TCL_TX_SWIZZLE_S0_W_##ts0w | \
+  NV34TCL_TX_SWIZZLE_S1_X_##ts1x | NV34TCL_TX_SWIZZLE_S1_Y_##ts1y | \
+  NV34TCL_TX_SWIZZLE_S1_Z_##ts1z | NV34TCL_TX_SWIZZLE_S1_W_##ts1w,  \
   }
 
 static nv_pict_texture_format_t
 NV30TextureFormat[] = {
-	_(a8r8g8b8, 0x12,   S1,   S1,   S1,   S1, X, Y, Z, W),
-	_(a8b8g8r8, 0x12,   S1,   S1,   S1,   S1, Z, Y, X, W),
-	_(x8r8g8b8, 0x12,   S1,   S1,   S1,  ONE, X, Y, Z, W),
-	_(x8b8g8r8, 0x12,   S1,   S1,   S1,  ONE, Z, Y, X, W),
+	_(a8r8g8b8, A8R8G8B8_RECT,   S1,   S1,   S1,   S1, X, Y, Z, W),
+	_(a8b8g8r8, A8R8G8B8_RECT,   S1,   S1,   S1,   S1, Z, Y, X, W),
+	_(x8r8g8b8, A8R8G8B8_RECT,   S1,   S1,   S1,  ONE, X, Y, Z, W),
+	_(x8b8g8r8, A8R8G8B8_RECT,   S1,   S1,   S1,  ONE, Z, Y, X, W),
 
-	_(a1r5g5b5, 0x10,   S1,   S1,   S1,   S1, X, Y, Z, W),
-	_(x1r5g5b5, 0x10,   S1,   S1,   S1,  ONE, X, Y, Z, W),
-	_(a1b5g5r5, 0x10,   S1,   S1,   S1,   S1, Z, Y, X, W),
-	_(x1b5g5r5, 0x10,   S1,   S1,   S1,  ONE, Z, Y, X, W),
+	_(a1r5g5b5, A1R5G5B5_RECT,   S1,   S1,   S1,   S1, X, Y, Z, W),
+	_(x1r5g5b5, A1R5G5B5_RECT,   S1,   S1,   S1,  ONE, X, Y, Z, W),
+	_(a1b5g5r5, A1R5G5B5_RECT,   S1,   S1,   S1,   S1, Z, Y, X, W),
+	_(x1b5g5r5, A1R5G5B5_RECT,   S1,   S1,   S1,  ONE, Z, Y, X, W),
 
-	_(x4r4g4b4, 0x1d,   S1,   S1,   S1,  ONE, X, Y, Z, W),
-	_(a4r4g4b4, 0x1d,   S1,   S1,   S1,   S1, X, Y, Z, W),
-	_(x4b4g4r4, 0x1d,   S1,   S1,   S1,  ONE, Z, Y, X, W),
-	_(a4b4g4r4, 0x1d,   S1,   S1,   S1,   S1, Z, Y, X, W),
+	_(x4r4g4b4, A4R4G4B4_RECT,   S1,   S1,   S1,  ONE, X, Y, Z, W),
+	_(a4r4g4b4, A4R4G4B4_RECT,   S1,   S1,   S1,   S1, X, Y, Z, W),
+	_(x4b4g4r4, A4R4G4B4_RECT,   S1,   S1,   S1,  ONE, Z, Y, X, W),
+	_(a4b4g4r4, A4R4G4B4_RECT,   S1,   S1,   S1,   S1, Z, Y, X, W),
 
-	_(      a8, 0x1b, ZERO, ZERO, ZERO,   S1, X, X, X, X),
+	_(      a8,       A8_RECT, ZERO, ZERO, ZERO,   S1, X, X, X, X),
 
-	_(  r5g6b5, 0x11,   S1,   S1,   S1,  ONE, X, Y, Z, W),
-	_(  b5g6r5, 0x11,   S1,   S1,   S1,  ONE, Z, Y, X, W),
+	_(  r5g6b5,   R5G6B5_RECT,   S1,   S1,   S1,  ONE, X, Y, Z, W),
+	_(  b5g6r5,   R5G6B5_RECT,   S1,   S1,   S1,  ONE, Z, Y, X, W),
 };
-
+#undef _
 
 static nv_pict_texture_format_t *
 NV30_GetPictTextureFormat(int format)
 {
-	int i;
+	int i = 0;
 
-	for(i=0;i<sizeof(NV30TextureFormat)/sizeof(NV30TextureFormat[0]);i++)
-	{
+	while (NV30TextureFormat[i].pict_fmt != -1) {
 		if (NV30TextureFormat[i].pict_fmt == format)
 			return &NV30TextureFormat[i];
+		i++;
 	}
 
 	return NULL;
 }
 
-#define NV34TCL_BF_ZERO                                     0x0000
-#define NV34TCL_BF_ONE                                      0x0001
-#define NV34TCL_BF_SRC_COLOR                                0x0300
-#define NV34TCL_BF_ONE_MINUS_SRC_COLOR                      0x0301
-#define NV34TCL_BF_SRC_ALPHA                                0x0302
-#define NV34TCL_BF_ONE_MINUS_SRC_ALPHA                      0x0303
-#define NV34TCL_BF_DST_ALPHA                                0x0304
-#define NV34TCL_BF_ONE_MINUS_DST_ALPHA                      0x0305
-#define NV34TCL_BF_DST_COLOR                                0x0306
-#define NV34TCL_BF_ONE_MINUS_DST_COLOR                      0x0307
-#define NV34TCL_BF_ALPHA_SATURATE                           0x0308
-#define BF(bf) NV34TCL_BF_##bf
-
+#define SF(bf) (NV34TCL_BLEND_FUNC_SRC_RGB_##bf |                              \
+		NV34TCL_BLEND_FUNC_SRC_ALPHA_##bf)
+#define DF(bf) (NV34TCL_BLEND_FUNC_DST_RGB_##bf |                              \
+		NV34TCL_BLEND_FUNC_DST_ALPHA_##bf)
 static nv_pict_op_t 
 NV30PictOp[] = {
-/* Clear       */ { 0, 0, BF(               ZERO), BF(               ZERO) },
-/* Src         */ { 0, 0, BF(                ONE), BF(               ZERO) },
-/* Dst         */ { 0, 0, BF(               ZERO), BF(                ONE) },
-/* Over        */ { 1, 0, BF(                ONE), BF(ONE_MINUS_SRC_ALPHA) },
-/* OverReverse */ { 0, 1, BF(ONE_MINUS_DST_ALPHA), BF(                ONE) },
-/* In          */ { 0, 1, BF(          DST_ALPHA), BF(               ZERO) },
-/* InReverse   */ { 1, 0, BF(               ZERO), BF(          SRC_ALPHA) },
-/* Out         */ { 0, 1, BF(ONE_MINUS_DST_ALPHA), BF(               ZERO) },
-/* OutReverse  */ { 1, 0, BF(               ZERO), BF(ONE_MINUS_SRC_ALPHA) },
-/* Atop        */ { 1, 1, BF(          DST_ALPHA), BF(ONE_MINUS_SRC_ALPHA) },
-/* AtopReverse */ { 1, 1, BF(ONE_MINUS_DST_ALPHA), BF(          SRC_ALPHA) },
-/* Xor         */ { 1, 1, BF(ONE_MINUS_DST_ALPHA), BF(ONE_MINUS_SRC_ALPHA) },
-/* Add         */ { 0, 0, BF(                ONE), BF(                ONE) }
+/* Clear       */ { 0, 0, SF(               ZERO), DF(               ZERO) },
+/* Src         */ { 0, 0, SF(                ONE), DF(               ZERO) },
+/* Dst         */ { 0, 0, SF(               ZERO), DF(                ONE) },
+/* Over        */ { 1, 0, SF(                ONE), DF(ONE_MINUS_SRC_ALPHA) },
+/* OverReverse */ { 0, 1, SF(ONE_MINUS_DST_ALPHA), DF(                ONE) },
+/* In          */ { 0, 1, SF(          DST_ALPHA), DF(               ZERO) },
+/* InReverse   */ { 1, 0, SF(               ZERO), DF(          SRC_ALPHA) },
+/* Out         */ { 0, 1, SF(ONE_MINUS_DST_ALPHA), DF(               ZERO) },
+/* OutReverse  */ { 1, 0, SF(               ZERO), DF(ONE_MINUS_SRC_ALPHA) },
+/* Atop        */ { 1, 1, SF(          DST_ALPHA), DF(ONE_MINUS_SRC_ALPHA) },
+/* AtopReverse */ { 1, 1, SF(ONE_MINUS_DST_ALPHA), DF(          SRC_ALPHA) },
+/* Xor         */ { 1, 1, SF(ONE_MINUS_DST_ALPHA), DF(ONE_MINUS_SRC_ALPHA) },
+/* Add         */ { 0, 0, SF(                ONE), DF(                ONE) }
 };
 
 static nv_pict_op_t *
@@ -230,24 +198,6 @@ NV30_GetPictOpRec(int op)
 {
 	if (op >= PictOpSaturate)
 		return NULL;
-#if 0
-	switch(op)
-	{
-		case 0:ErrorF("Op Clear\n");break;
-		case 1:ErrorF("Op Src\n");break;
-		case 2:ErrorF("Op Dst\n");break;
-		case 3:ErrorF("Op Over\n");break;
-		case 4:ErrorF("Op OverReverse\n");break;
-		case 5:ErrorF("Op In\n");break;
-		case 6:ErrorF("Op InReverse\n");break;
-		case 7:ErrorF("Op Out\n");break;
-		case 8:ErrorF("Op OutReverse\n");break;
-		case 9:ErrorF("Op Atop\n");break;
-		case 10:ErrorF("Op AtopReverse\n");break;
-		case 11:ErrorF("Op Xor\n");break;
-		case 12:ErrorF("Op Add\n");break;
-	}
-#endif
 	return &NV30PictOp[op];
 }
 
@@ -265,36 +215,36 @@ NV30_SetupBlend(ScrnInfoPtr pScrn, nv_pict_op_t *blend,
 
 	if (blend->dst_alpha) {
 		if (!PICT_FORMAT_A(dest_format)) {
-			if (sblend == BF(DST_ALPHA)) {
-				sblend = BF(ONE);
-			} else if (sblend == BF(ONE_MINUS_DST_ALPHA)) {
-				sblend = BF(ZERO);
+			if (sblend == SF(DST_ALPHA)) {
+				sblend = SF(ONE);
+			} else if (sblend == SF(ONE_MINUS_DST_ALPHA)) {
+				sblend = SF(ZERO);
 			}
 		} else if (dest_format == PICT_a8) {
-			if (sblend == BF(DST_ALPHA)) {
-				sblend = BF(DST_COLOR);
-			} else if (sblend == BF(ONE_MINUS_DST_ALPHA)) {
-				sblend = BF(ONE_MINUS_DST_COLOR);
+			if (sblend == SF(DST_ALPHA)) {
+				sblend = SF(DST_COLOR);
+			} else if (sblend == SF(ONE_MINUS_DST_ALPHA)) {
+				sblend = SF(ONE_MINUS_DST_COLOR);
 			}
 		}
 	}
 
 	if (blend->src_alpha && (component_alpha || dest_format == PICT_a8)) {
-		if (dblend == BF(SRC_ALPHA)) {
-			dblend = BF(SRC_COLOR);
-		} else if (dblend == BF(ONE_MINUS_SRC_ALPHA)) {
-			dblend = BF(ONE_MINUS_SRC_COLOR);
+		if (dblend == DF(SRC_ALPHA)) {
+			dblend = DF(SRC_COLOR);
+		} else if (dblend == DF(ONE_MINUS_SRC_ALPHA)) {
+			dblend = DF(ONE_MINUS_SRC_COLOR);
 		}
 	}
 
-	if (sblend == BF(ONE) && dblend == BF(ZERO)) {
+	if (sblend == SF(ONE) && dblend == DF(ZERO)) {
 		BEGIN_RING(chan, rankine, NV34TCL_BLEND_FUNC_ENABLE, 1);
 		OUT_RING  (chan, 0);
 	} else {
 		BEGIN_RING(chan, rankine, NV34TCL_BLEND_FUNC_ENABLE, 3);
 		OUT_RING  (chan, 1);
-		OUT_RING  (chan, (sblend << 16) | sblend);
-		OUT_RING  (chan, (dblend << 16) | dblend);
+		OUT_RING  (chan, sblend);
+		OUT_RING  (chan, dblend);
 	}
 }
 
@@ -305,43 +255,47 @@ NV30EXATexture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit)
 	struct nouveau_channel *chan = pNv->chan;
 	struct nouveau_grobj *rankine = pNv->Nv3D;
 	struct nouveau_bo *bo = nouveau_pixmap_bo(pPix);
-	nv_pict_texture_format_t *fmt;
-	uint32_t card_filter, card_repeat;
 	uint32_t tex_reloc = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD;
+	uint32_t pitch;
+	nv_pict_texture_format_t *fmt;
 	NV30EXA_STATE;
 
 	fmt = NV30_GetPictTextureFormat(pPict->format);
 	if (!fmt)
 		return FALSE;
 
-	card_repeat = 3; /* repeatNone */
-
-	if (pPict->filter == PictFilterBilinear)
-		card_filter = 2;
-	else
-		card_filter = 1;
-
 	BEGIN_RING(chan, rankine, NV34TCL_TX_OFFSET(unit), 8);
 	if (OUT_RELOCl(chan, bo, 0, tex_reloc) ||
-	    OUT_RELOCd(chan, bo, NV34TCL_TX_FORMAT_DIMS_2D | (1 << 16) | 8 |
-		       (fmt->card_fmt << NV34TCL_TX_FORMAT_FORMAT_SHIFT) |
+	    OUT_RELOCd(chan, bo, fmt->card_fmt |
+		       NV34TCL_TX_FORMAT_DIMS_2D | (1 << 16) |
+		       NV34TCL_TX_FORMAT_NO_BORDER |
 		       (log2i(pPix->drawable.width) <<
-			NV34TCL_TX_FORMAT_BASE_SIZE_U_SHIFT) |
+		        NV34TCL_TX_FORMAT_BASE_SIZE_U_SHIFT) |
 		       (log2i(pPix->drawable.height) <<
-			NV34TCL_TX_FORMAT_BASE_SIZE_V_SHIFT),
+		        NV34TCL_TX_FORMAT_BASE_SIZE_V_SHIFT),
 		       tex_reloc | NOUVEAU_BO_OR,
 		       NV34TCL_TX_FORMAT_DMA0, NV34TCL_TX_FORMAT_DMA1))
 		return FALSE;
-	OUT_RING  (chan, (card_repeat << NV34TCL_TX_WRAP_S_SHIFT) |
-			(card_repeat << NV34TCL_TX_WRAP_T_SHIFT) |
-			(card_repeat << NV34TCL_TX_WRAP_R_SHIFT));
+
+	/* repeatNone */
+	OUT_RING (chan, NV34TCL_TX_WRAP_S_CLAMP_TO_EDGE |
+			NV34TCL_TX_WRAP_T_CLAMP_TO_EDGE |
+			NV34TCL_TX_WRAP_R_CLAMP_TO_EDGE);
+
 	OUT_RING  (chan, NV34TCL_TX_ENABLE_ENABLE);
-	OUT_RING  (chan, (((uint32_t)exaGetPixmapPitch(pPix)) << NV34TCL_TX_SWIZZLE_RECT_PITCH_SHIFT ) | 
-			fmt->card_swz);
+	pitch = exaGetPixmapPitch(pPix);
+	OUT_RING  (chan, (pitch << NV34TCL_TX_SWIZZLE_RECT_PITCH_SHIFT) |
+			 fmt->card_swz);
+
+	/* 0x2000 = engine lock */
+	if (pPict->filter == PictFilterBilinear) {
+		OUT_RING  (chan, NV34TCL_TX_FILTER_MINIFY_LINEAR |
+				 NV34TCL_TX_FILTER_MAGNIFY_LINEAR | 0x2000);
+	} else {
+		OUT_RING  (chan, NV34TCL_TX_FILTER_MINIFY_NEAREST |
+				 NV34TCL_TX_FILTER_MAGNIFY_NEAREST | 0x2000);
+	}
 
-	OUT_RING  (chan, (card_filter << NV34TCL_TX_FILTER_MINIFY_SHIFT) /* min */ |
-			(card_filter << NV34TCL_TX_FILTER_MAGNIFY_SHIFT) /* mag */ |
-			0x2000 /* engine lock */);
 	OUT_RING  (chan, (pPix->drawable.width << NV34TCL_TX_NPOT_SIZE_W_SHIFT) | pPix->drawable.height);
 	OUT_RING  (chan, 0); /* border ARGB */
 
@@ -353,7 +307,7 @@ NV30EXATexture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit)
 }
 
 static Bool
-NV30_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict)
+NV30_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PictFormatShort format)
 {
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_channel *chan = pNv->chan;
@@ -361,7 +315,7 @@ NV30_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict)
 	struct nouveau_bo *bo = nouveau_pixmap_bo(pPix);
 	nv_pict_surface_format_t *fmt;
 
-	fmt = NV30_GetPictSurfaceFormat(pPict->format);
+	fmt = NV30_GetPictSurfaceFormat(format);
 	if (!fmt) {
 		ErrorF("AIII no format\n");
 		return FALSE;
@@ -370,8 +324,10 @@ NV30_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict)
 	uint32_t pitch = (uint32_t)exaGetPixmapPitch(pPix);
 
 	BEGIN_RING(chan, rankine, NV34TCL_RT_FORMAT, 3);
-	OUT_RING  (chan, fmt->card_fmt); /* format */
-	OUT_RING  (chan, pitch << 16 | pitch);
+	OUT_RING  (chan, NV34TCL_RT_FORMAT_TYPE_LINEAR |
+		   NV34TCL_RT_FORMAT_ZETA_Z24S8 |
+		   fmt->card_fmt);
+	OUT_RING  (chan, pitch << NV34TCL_COLOR0_PITCH_ZETA_SHIFT | pitch);
 	if (OUT_RELOCl(chan, bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR))
 		return FALSE;
 
@@ -399,7 +355,7 @@ NV30EXACheckCompositeTexture(PicturePtr pPict, PicturePtr pdPict, int op)
 				pPict->format);
 
 	if (pPict->filter != PictFilterNearest &&
-			pPict->filter != PictFilterBilinear)
+	    pPict->filter != PictFilterBilinear)
 		NOUVEAU_FALLBACK("filter 0x%x not supported\n", pPict->filter);
 
 	if (!(w==1 && h==1) && pPict->repeat && pPict->repeatType != RepeatNone)
@@ -421,8 +377,8 @@ NV30EXACheckCompositeTexture(PicturePtr pPict, PicturePtr pdPict, int op)
 
 Bool
 NV30EXACheckComposite(int op, PicturePtr psPict,
-		PicturePtr pmPict,
-		PicturePtr pdPict)
+			      PicturePtr pmPict,
+			      PicturePtr pdPict)
 {
 	nv_pict_surface_format_t *fmt;
 	nv_pict_op_t *opr;
@@ -440,8 +396,8 @@ NV30EXACheckComposite(int op, PicturePtr psPict,
 		NOUVEAU_FALLBACK("src picture\n");
 	if (pmPict) {
 		if (pmPict->componentAlpha &&
-				PICT_FORMAT_RGB(pmPict->format) &&
-				opr->src_alpha && opr->src_card_op != BF(ZERO))
+		    PICT_FORMAT_RGB(pmPict->format) &&
+		    opr->src_alpha && opr->src_card_op != SF(ZERO))
 			NOUVEAU_FALLBACK("mask CA + SA\n");
 		if (!NV30EXACheckCompositeTexture(pmPict, pdPict, op))
 			NOUVEAU_FALLBACK("mask picture\n");
@@ -462,11 +418,11 @@ NV30EXAStateCompositeReemit(struct nouveau_channel *chan)
 
 Bool
 NV30EXAPrepareComposite(int op, PicturePtr psPict,
-		PicturePtr pmPict,
-		PicturePtr pdPict,
-		PixmapPtr  psPix,
-		PixmapPtr  pmPix,
-		PixmapPtr  pdPix)
+				PicturePtr pmPict,
+				PicturePtr pdPict,
+				PixmapPtr  psPix,
+				PixmapPtr  pmPix,
+				PixmapPtr  pdPix)
 {
 	ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum];
 	NVPtr pNv = NVPTR(pScrn);
@@ -485,26 +441,12 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict,
 			(pmPict && pmPict->componentAlpha &&
 			 PICT_FORMAT_RGB(pmPict->format)));
 
-	if (!NV30_SetupSurface(pScrn, pdPix, pdPict) ||
+	if (!NV30_SetupSurface(pScrn, pdPix, pdPict->format) ||
 	    !NV30EXATexture(pScrn, psPix, psPict, 0)) {
 		MARK_UNDO(chan);
 		return FALSE;
 	}
 
-#if 0
-#define printformat(f) ErrorF("(%xh %s %dbpp A%dR%dG%dB%d)",f,(f>>16)&0xf==2?"ARGB":"ABGR",(f>>24),(f&0xf000)>>12,(f&0xf00)>>8,(f&0xf0)>>4,f&0xf)
-	ErrorF("Preparecomposite src(%dx%d)",psPict->pDrawable->width,psPict->pDrawable->height);
-	printformat((psPict->format));
-	ErrorF(" dst(%dx%d)",pdPict->pDrawable->width,pdPict->pDrawable->height);
-	printformat((pdPict->format));
-	if (pmPict)
-	{
-		ErrorF(" mask(%dx%d)",pmPict->pDrawable->width,pmPict->pDrawable->height);
-		printformat((pmPict->format));
-	}
-	ErrorF("\n");
-#endif
-
 	if (pmPict) {
 		if (!NV30EXATexture(pScrn, pmPix, pmPict, 1)) {
 			MARK_UNDO(chan);
@@ -533,7 +475,7 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict,
 		return FALSE;
 	}
 
-	BEGIN_RING(chan, rankine, 0x23c, 1);
+	BEGIN_RING(chan, rankine, NV34TCL_TX_UNITS_ENABLE, 1);
 	OUT_RING  (chan, pmPict?3:1);
 
 	pNv->alu = op;
@@ -550,13 +492,12 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict,
 #define xFixedToFloat(v) \
 	((float)xFixedToInt((v)) + ((float)xFixedFrac(v) / 65536.0))
 
-static void
+static inline void
 NV30EXATransformCoord(PictTransformPtr t, int x, int y, float sx, float sy,
 					  float *x_ret, float *y_ret)
 {
-	PictVector v;
-
 	if (t) {
+		PictVector v;
 		v.vector[0] = IntToxFixed(x);
 		v.vector[1] = IntToxFixed(y);
 		v.vector[2] = xFixed1;
@@ -600,7 +541,9 @@ NV30EXAComposite(PixmapPtr pdPix, int srcX , int srcY,
 	WAIT_RING(chan, 64);
 
 	/* We're drawing a triangle, we need to scissor it to a quad. */
-	/* The scissors are here for a good reason, we don't get the full image, but just a part. */
+	/* The scissors are here for a good reason, we don't get the full
+	 * image, but just a part.
+	 */
 	/* Handling the cliprects is done for us already. */
 	BEGIN_RING(chan, rankine, NV34TCL_SCISSOR_HORIZ, 2);
 	OUT_RING  (chan, (width << 16) | dstX);
@@ -608,47 +551,42 @@ NV30EXAComposite(PixmapPtr pdPix, int srcX , int srcY,
 	BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
 	OUT_RING  (chan, NV34TCL_VERTEX_BEGIN_END_TRIANGLES);
 
-#if 0
-	ErrorF("Composite [%dx%d] (%d,%d)IN(%d,%d)OP(%d,%d)\n",width,height,srcX,srcY,maskX,maskY,dstX,dstY);
-#endif
-	NV30EXATransformCoord(state->unit[0].transform, 
-				srcX, srcY - height,
-				state->unit[0].width,
-				state->unit[0].height, &sX0, &sY0);
+	NV30EXATransformCoord(state->unit[0].transform, srcX, srcY - height,
+			      state->unit[0].width, state->unit[0].height,
+			      &sX0, &sY0);
+	NV30EXATransformCoord(state->unit[0].transform, srcX, srcY + height,
+			      state->unit[0].width, state->unit[0].height,
+			      &sX1, &sY1);
 	NV30EXATransformCoord(state->unit[0].transform,
-				srcX, srcY + height,
-				state->unit[0].width,
-				state->unit[0].height, &sX1, &sY1);
-	NV30EXATransformCoord(state->unit[0].transform,
-				srcX + 2*width, srcY + height,
-				state->unit[0].width,
-				state->unit[0].height, &sX2, &sY2);
+			      srcX + 2*width, srcY + height,
+			      state->unit[0].width,
+			      state->unit[0].height, &sX2, &sY2);
 
 	if (state->have_mask) {
-		NV30EXATransformCoord(state->unit[1].transform, 
-					maskX, maskY - height,
-					state->unit[1].width,
-					state->unit[1].height, &mX0, &mY0);
 		NV30EXATransformCoord(state->unit[1].transform,
-					maskX, maskY + height,
-					state->unit[1].width,
-					state->unit[1].height, &mX1, &mY1);
+				      maskX, maskY - height,
+				      state->unit[1].width,
+				      state->unit[1].height, &mX0, &mY0);
+		NV30EXATransformCoord(state->unit[1].transform,
+				      maskX, maskY + height,
+				      state->unit[1].width,
+				      state->unit[1].height, &mX1, &mY1);
 		NV30EXATransformCoord(state->unit[1].transform,
-					maskX + 2*width, maskY + height,
-					state->unit[1].width,
-					state->unit[1].height, &mX2, &mY2);
+				      maskX + 2*width, maskY + height,
+				      state->unit[1].width,
+				      state->unit[1].height, &mX2, &mY2);
 
-		CV_OUTm(sX0 , sY0 , mX0, mY0, dstX			,	dstY - height);
-		CV_OUTm(sX1 , sY1 , mX1, mY1, dstX			,	dstY + height);
-		CV_OUTm(sX2 , sY2 , mX2, mY2, dstX + 2*width	, 	dstY + height);
+		CV_OUTm(sX0, sY0, mX0, mY0, dstX, dstY - height);
+		CV_OUTm(sX1, sY1, mX1, mY1, dstX, dstY + height);
+		CV_OUTm(sX2, sY2, mX2, mY2, dstX + 2*width, dstY + height);
 	} else {
-		CV_OUT(sX0 , sY0 , dstX			,	dstY - height);
-		CV_OUT(sX1 , sY1 , dstX			,	dstY + height);
-		CV_OUT(sX2 , sY2 , dstX + 2*width	, 	dstY + height);
+		CV_OUT(sX0, sY0, dstX, dstY - height);
+		CV_OUT(sX1, sY1, dstX, dstY + height);
+		CV_OUT(sX2, sY2, dstX + 2*width, dstY + height);
 	}
 
 	BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-	OUT_RING  (chan, 0);
+	OUT_RING  (chan, NV34TCL_VERTEX_BEGIN_END_STOP);
 }
 
 void
@@ -661,6 +599,9 @@ NV30EXADoneComposite(PixmapPtr pdPix)
 	chan->flush_notify = NULL;
 }
 
+#define NV30TCL_CHIPSET_3X_MASK 0x00000003
+#define NV35TCL_CHIPSET_3X_MASK 0x000001e0
+#define NV34TCL_CHIPSET_3X_MASK 0x00000010
 Bool
 NVAccelInitNV30TCL(ScrnInfoPtr pScrn)
 {
@@ -673,27 +614,22 @@ NVAccelInitNV30TCL(ScrnInfoPtr pScrn)
 	if (!nv40_fp_map_a8[0])
 		NV30EXAHackupA8Shaders(pScrn);
 
-#define NV30TCL_CHIPSET_3X_MASK 0x00000003
-#define NV35TCL_CHIPSET_3X_MASK 0x000001e0
-#define NV34TCL_CHIPSET_3X_MASK 0x00000010
-
 	chipset = pNv->dev->chipset;
-	if ((chipset & 0xf0) != NV_ARCH_30)
+	if ((chipset & 0xf0) == NV_ARCH_30) {
+		chipset &= 0xf;
+		if (NV30TCL_CHIPSET_3X_MASK & (1<<chipset))
+			class = NV30TCL;
+		else if (NV35TCL_CHIPSET_3X_MASK & (1<<chipset))
+			class = NV35TCL;
+		else if (NV34TCL_CHIPSET_3X_MASK & (1<<chipset))
+			class = NV34TCL;
+		else {
+			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+					"NV30EXA: Unknown chipset NV3%1x\n", chipset);
+			return FALSE;
+		}
+	} else
 		return TRUE;
-	chipset &= 0xf;
-
-	if (NV30TCL_CHIPSET_3X_MASK & (1<<chipset))
-		class = NV30TCL;
-	else if (NV35TCL_CHIPSET_3X_MASK & (1<<chipset))
-		class = NV35TCL;
-	else if (NV34TCL_CHIPSET_3X_MASK & (1<<chipset))
-		class = NV34TCL;
-	else {
-		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-			   "NV30EXA: Unknown chipset NV3%1x\n", chipset);
-		return FALSE;
-	}
-
 
 	if (!pNv->Nv3D) {
 		if (nouveau_grobj_alloc(chan, Nv3D, class, &pNv->Nv3D))
@@ -702,8 +638,9 @@ NVAccelInitNV30TCL(ScrnInfoPtr pScrn)
 	rankine = pNv->Nv3D;
 
 	if (!pNv->shader_mem) {
-		if (nouveau_bo_new(pNv->dev, NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP,
-				   0, 0x1000, &pNv->shader_mem)) {
+		if (nouveau_bo_new(pNv->dev, NOUVEAU_BO_VRAM |
+				   NOUVEAU_BO_MAP, 0, 0x1000,
+				   &pNv->shader_mem)) {
 			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
 				   "Couldn't alloc fragprog buffer!\n");
 			nouveau_grobj_free(&pNv->Nv3D);
@@ -729,7 +666,7 @@ NVAccelInitNV30TCL(ScrnInfoPtr pScrn)
 		OUT_RING  (chan, 0);
 	}
 
-	BEGIN_RING(chan, rankine, 0x220, 1);
+	BEGIN_RING(chan, rankine, NV34TCL_RT_ENABLE, 1);
 	OUT_RING  (chan, 1);
 
 	BEGIN_RING(chan, rankine, 0x03b0, 1);
diff --git a/src/nv40_exa.c b/src/nv40_exa.c
index c2717f7..067ba20 100644
--- a/src/nv40_exa.c
+++ b/src/nv40_exa.c
@@ -628,7 +628,7 @@ NVAccelInitNV40TCL(ScrnInfoPtr pScrn)
 		return TRUE;
 
 	if (!pNv->Nv3D) {
-		if (nouveau_grobj_alloc(pNv->chan, Nv3D, class, &pNv->Nv3D))
+		if (nouveau_grobj_alloc(chan, Nv3D, class, &pNv->Nv3D))
 			return FALSE;
 	}
 	curie = pNv->Nv3D;
-- 
1.7.0.5



More information about the Nouveau mailing list