[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-nouveau: Changes to 'ubuntu'



 debian/changelog      |   11 
 debian/control        |    2 
 src/drmmode_display.c |  567 ++++++++++++--------
 src/nouveau_dri2.c    |   68 --
 src/nouveau_exa.c     |  110 ++-
 src/nouveau_hw.h      |   17 
 src/nouveau_wfb.c     |   22 
 src/nouveau_xv.c      |   40 +
 src/nv04_exa.c        |   86 ++-
 src/nv04_xv_blit.c    |   26 
 src/nv10_exa.c        | 1376 ++++++++++++++++++++++----------------------------
 src/nv30_exa.c        |   75 ++
 src/nv30_shaders.c    |   27 
 src/nv30_shaders.h    |    4 
 src/nv30_xv_tex.c     |   77 +-
 src/nv40_exa.c        |   71 +-
 src/nv40_xv_tex.c     |   66 +-
 src/nv50_accel.c      |  177 +++---
 src/nv50_crtc.c       |   40 -
 src/nv50_exa.c        |  144 +++--
 src/nv50_xv.c         |  104 ++-
 src/nv_accel_common.c |    5 
 src/nv_crtc.c         |   34 -
 src/nv_cursor.c       |   79 +-
 src/nv_driver.c       |   31 -
 src/nv_proto.h        |    6 
 src/nv_type.h         |    4 
 27 files changed, 1777 insertions(+), 1492 deletions(-)

New commits:
commit 3fbc682795264d8081d615abfbe7fc0647ad889b
Author: Christopher James Halse Rogers <raof@cooperteam.net>
Date:   Fri Dec 4 15:41:34 2009 +1100

    Update snapshot

diff --git a/debian/changelog b/debian/changelog
index b78af5c..80668a2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+xserver-xorg-video-nouveau (1:0.0.10~git+20091204+95fc663-0ubuntu1) lucid; urgency=low
+
+  * New upstream snapshot, up to commit 
+    95fc663d5fb653fc0a50aa4d589bbf3b9c79e928.
+    + Too many commits to usefully list in the changelog.
+  * debian/control:
+    + Bump versioned Build-Dep on libdrm-dev to >= 2.4.16~ to pick up nouveau
+      #define updates.
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Fri, 04 Dec 2009 12:31:58 +1100
+
 xserver-xorg-video-nouveau (1:0.0.10~git+20090823+569a17a-0ubuntu1) karmic; urgency=low
 
   * Merge package from Debian experimental.  Remaining Ubuntu changes:
diff --git a/debian/control b/debian/control
index dce50cf..da41dc3 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
 XSBC-Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
 Uploaders: Chris Lamb <lamby@debian.org>, Matthew Johnson <mjj29@debian.org>
-Build-Depends: debhelper (>= 7), pkg-config, xserver-xorg-dev (>= 2:1.2.99.902), x11proto-video-dev, x11proto-core-dev, x11proto-fonts-dev, x11proto-randr-dev (>= 1.2), x11proto-render-dev, x11proto-xext-dev, libdrm-dev (>= 2.4.12+git20090801.45078630), x11proto-xf86dri-dev, x11proto-gl-dev, mesa-common-dev, automake, libtool, xutils-dev, xserver-xorg-dev, quilt
+Build-Depends: debhelper (>= 7), pkg-config, xserver-xorg-dev (>= 2:1.2.99.902), x11proto-video-dev, x11proto-core-dev, x11proto-fonts-dev, x11proto-randr-dev (>= 1.2), x11proto-render-dev, x11proto-xext-dev, libdrm-dev (>= 2.4.16~), x11proto-xf86dri-dev, x11proto-gl-dev, mesa-common-dev, automake, libtool, xutils-dev, xserver-xorg-dev, quilt
 Standards-Version: 3.8.2
 Homepage: http://nouveau.freedesktop.org/wiki/
 Vcs-Git: git://git.debian.org/git/pkg-xorg/driver/xserver-xorg-video-nouveau

commit 95fc663d5fb653fc0a50aa4d589bbf3b9c79e928
Author: Ben Skeggs <bskeggs@redhat.com>
Date:   Thu Nov 26 13:10:45 2009 +1000

    shadowfb: fix segv on fb resize
    
    Signed-off-by: Ben Skeggs <bskeggs@redhat.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index e8099b4..efc2826 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1120,7 +1120,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 	screen->ModifyPixmapHeader(ppix, width, height, -1, -1, pitch,
 				   (!pNv->NoAccel || pNv->ShadowPtr) ?
 				   pNv->ShadowPtr : pNv->scanout->map);
-
+	scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr;
 	nouveau_bo_unmap(pNv->scanout);
 
 	for (i = 0; i < xf86_config->num_crtc; i++) {
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 4595940..a0656af 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -637,6 +637,7 @@ nouveau_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 	screen->ModifyPixmapHeader(ppix, width, height, -1, -1, pitch,
 				   (!pNv->NoAccel || pNv->ShadowFB) ?
 				   pNv->ShadowPtr : pNv->scanout->map);
+	scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr;
 	nouveau_bo_unmap(pNv->scanout);
 
 	for (i = 0; i < xf86_config->num_crtc; i++) {

commit 1cf0cfa926dd78698ff8b8c2d776bcdaa6a867bd
Author: Ben Skeggs <bskeggs@redhat.com>
Date:   Thu Nov 26 10:04:43 2009 +1000

    kms: zfill fb if we have no accel to do copy, better than random garbage

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index d1e3ec3..e8099b4 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -171,8 +171,13 @@ drmmode_fbcon_copy(ScrnInfoPtr pScrn)
 	unsigned w = pScrn->virtualX, h = pScrn->virtualY;
 	int i, ret, fbcon_id = 0;
 
-	if (!pNv->exa_driver_pixmaps)
+	if (!pNv->exa_driver_pixmaps) {
+		if (nouveau_bo_map(pNv->scanout, NOUVEAU_BO_WR))
+			return;
+		memset(pNv->scanout->map, 0x00, pNv->scanout->size);
+		nouveau_bo_unmap(pNv->scanout);
 		return;
+	}
 
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		drmmode_crtc_private_ptr drmmode_crtc =

commit 92578fb4db0feb549bea82d0874ba0e39a2b1ae2
Author: Francisco Jerez <currojerez@riseup.net>
Date:   Thu Nov 5 18:30:28 2009 +0100

    nv10/exa: Rename VIEWPORT_SCALE to VIEWPORT_TRANSLATE.
    
    Signed-off-by: Francisco Jerez <currojerez@riseup.net>

diff --git a/src/nv10_exa.c b/src/nv10_exa.c
index 70f2fbc..9ccca8f 100644
--- a/src/nv10_exa.c
+++ b/src/nv10_exa.c
@@ -930,7 +930,7 @@ NVAccelInitNV10TCL(ScrnInfoPtr pScrn)
 	OUT_RING  (chan, 0);
 	OUT_RINGf (chan, 65536.0);
 
-	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_SCALE_X, 4);
+	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_TRANSLATE_X, 4);
 	OUT_RINGf (chan, -2048.0);
 	OUT_RINGf (chan, -2048.0);
 	OUT_RINGf (chan, 0);

commit 9de0d97bd2fc2ee8800d48b5340a3d495525ad3e
Author: Francisco Jerez <currojerez@riseup.net>
Date:   Thu Nov 5 13:29:09 2009 +0100

    nv04-nv40/exa: Match the blob behavior more closely on PrepareCopy.
    
    Fix a somewhat indeterministic corruption problem on nv17 when there
    is stuff going on the other fifos (e.g. gallium but I've also
    reproduced it with an app just SIFM-ing memory around): in some cases
    it made the blits the X server had scheduled fail corrupting the
    nearby screen areas.
    
    Signed-off-by: Francisco Jerez <currojerez@riseup.net>
    Reviewed-by: Ben Skeggs <bskeggs@redhat.com>

diff --git a/src/nv04_exa.c b/src/nv04_exa.c
index 71a4ac2..f4966a4 100644
--- a/src/nv04_exa.c
+++ b/src/nv04_exa.c
@@ -209,10 +209,16 @@ NV04EXAPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int dx, int dy,
 			MARK_UNDO(chan);
 			return FALSE;
 		}
+
+		BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_SURFACE, 1);
+		OUT_RING  (chan, pNv->NvContextSurfaces->handle);
 		BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
 		OUT_RING  (chan, 1); /* ROP_AND */
+
 		NV04EXASetROP(pScrn, alu, planemask);
 	} else {
+		BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_SURFACE, 1);
+		OUT_RING  (chan, pNv->NvContextSurfaces->handle);
 		BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
 		OUT_RING  (chan, 3); /* SRCCOPY */
 	}

commit 16ef9ff7e394a693fc74764d8bc2630e784947f3
Author: Francisco Jerez <currojerez@riseup.net>
Date:   Thu Nov 5 03:28:00 2009 +0100

    nv10/exa: Spring-cleaning
    
    * Kill the A8+A8 hack. Recent enough X servers (>=1.7) fall back to
      ARGB glyphs for drivers not supporting A8 render targets.
    
    * Kill all the global state. It doesn't matter a lot yet but it might
      if we get multicard working at some point.
    
    * Other random clean-ups with no functional changes.
    
    Some numbers from x11perf -aa10text -aa24text -comppixwin10 -comppixwin500:
    
    * Before, with A glyphs:
       12000000 trep @   0.0025 msec (394000.0/sec): Char in 80-char aa line (Charter 10)
        3200000 trep @   0.0119 msec ( 84300.0/sec): Char in 30-char aa line (Charter 24)
        8000000 trep @   0.0036 msec (280000.0/sec): Composite 10x10 from pixmap to window
          60000 trep @   0.4813 msec (  2080.0/sec): Composite 500x500 from pixmap to window
    
    * After, ARGB glyphs:
       20000000 trep @   0.0015 msec (649000.0/sec): Char in 80-char aa line (Charter 10)
        4800000 trep @   0.0057 msec (175000.0/sec): Char in 30-char aa line (Charter 24)
        8000000 trep @   0.0036 msec (280000.0/sec): Composite 10x10 from pixmap to window
          60000 trep @   0.4813 msec (  2080.0/sec): Composite 500x500 from pixmap to window
    
    Signed-off-by: Francisco Jerez <currojerez@riseup.net>
    Tested-by: Pekka Paalanen <pq@iki.fi>

diff --git a/src/nv10_exa.c b/src/nv10_exa.c
index fe86fd7..70f2fbc 100644
--- a/src/nv10_exa.c
+++ b/src/nv10_exa.c
@@ -2,6 +2,7 @@
  * Copyright 2007 Stephane Marchesin
  * Copyright 2007 Arthur Huillet
  * Copyright 2007 Peter Winters
+ * Copyright 2009 Francisco Jerez
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -28,24 +29,83 @@
 
 #include "nv_include.h"
 
-typedef struct nv10_exa_state {
-	Bool have_mask;
-	Bool is_a8_plus_a8;
-	struct {
-		PictTransformPtr transform;
-		float width;
-		float height;
-	} unit[2];
-} nv10_exa_state_t;
-static nv10_exa_state_t state;
+/* Texture/Render target formats. */
+static struct pict_format {
+	int exa;
+	int hw;
+} nv10_tex_format_pot[] = {
+	{ PICT_a8,       0x80  },
+	{ PICT_r5g6b5,	 0x280 },
+	{ PICT_x8r8g8b8, 0x300 },
+	{ PICT_a8r8g8b8, 0x300 },
+	{},
+
+}, nv10_tex_format_rect[] = {
+	{ PICT_a8,       0x980 },
+	{ PICT_r5g6b5,   0x880 },
+	{ PICT_x8r8g8b8, 0x900 },
+	{ PICT_a8r8g8b8, 0x900 },
+	{},
+
+}, nv20_tex_format_rect[] = {
+	{ PICT_a8,	 0xd80 },
+	{ PICT_r5g6b5,   0x880 },
+	{ PICT_x8r8g8b8, 0x900 },
+	{ PICT_a8r8g8b8, 0x900 },
+	{},
+
+}, nv10_rt_format[] = {
+	{ PICT_r5g6b5,	 0x103 },
+	{ PICT_x8r8g8b8, 0x108 },
+	{ PICT_a8r8g8b8, 0x108 },
+	{},
+};
+
+static int
+get_tex_format(PicturePtr pict)
+{
+	ScrnInfoPtr pScrn = xf86Screens[pict->pDrawable->pScreen->myNum];
+	NVPtr pNv = NVPTR(pScrn);
+
+	/* If repeat is set we're always handling a 1x1 texture with
+	 * ARGB/XRGB destination, in that case we change the format to
+	 * use the POT (swizzled) matching format.
+	 */
+	struct pict_format *format =
+		pict->repeat != RepeatNone ? nv10_tex_format_pot :
+		pNv->Architecture == NV_ARCH_20 ? nv20_tex_format_rect :
+		nv10_tex_format_rect;
+
+	for (; format->hw; format++) {
+		if (format->exa == pict->format)
+			return format->hw;
+	}
+
+	return 0;
+}
+
+static int
+get_rt_format(PicturePtr pict)
+{
+	struct pict_format *format = nv10_rt_format;
+
+	for (; format->hw; format++) {
+		if (format->exa == pict->format)
+			return format->hw;
+	}
+
+	return 0;
+}
 
+/* Blending functions. */
 #define SF(x) NV10TCL_BLEND_FUNC_SRC_##x
 #define DF(x) NV10TCL_BLEND_FUNC_DST_##x
 
-static struct nv10_pictop {
+static struct pict_op {
 	int src;
 	int dst;
-} NV10PictOp [] = {
+
+} nv10_pict_op[] = {
 	{ SF(ZERO),		   DF(ZERO) },		      /* Clear */
 	{ SF(ONE),		   DF(ZERO) },		      /* Src */
 	{ SF(ZERO),		   DF(ONE) },		      /* Dst */
@@ -61,131 +121,91 @@ static struct nv10_pictop {
 	{ SF(ONE),		   DF(ONE) },		      /* Add */
 };
 
-static inline bool needs_src_alpha(int op)
+static inline Bool
+needs_src_alpha(int op)
 {
-	return NV10PictOp[op].dst == DF(ONE_MINUS_SRC_ALPHA)
-		|| NV10PictOp[op].dst == DF(SRC_ALPHA);
+	return nv10_pict_op[op].dst == DF(ONE_MINUS_SRC_ALPHA)
+		|| nv10_pict_op[op].dst == DF(SRC_ALPHA);
 }
 
-static inline bool needs_src(int op)
+static inline Bool
+needs_src(int op)
 {
-	return NV10PictOp[op].src != DF(ZERO);
+	return nv10_pict_op[op].src != DF(ZERO);
 }
 
-static inline bool effective_component_alpha(PicturePtr mask)
+static inline Bool
+effective_component_alpha(PicturePtr mask)
 {
 	return mask && mask->componentAlpha && PICT_FORMAT_RGB(mask->format);
 }
 
-static int NV10TexFormat(int ExaFormat)
-{
-	struct {int exa;int hw;} tex_format[] =
-	{
-		{PICT_a8r8g8b8,	0x900},
-		{PICT_x8r8g8b8,	0x900},
-		{PICT_r5g6b5, 0x880}, /*this one was only tested with rendercheck*/
-		/*{PICT_a1r5g5b5,	NV10TCL_TX_FORMAT_FORMAT_R5G5B5A1},
-		{PICT_a4r4g4b4,	NV10TCL_TX_FORMAT_FORMAT_R4G4B4A4},*/
-		{PICT_a8,	0x980}, /*this is a NV1x only format, corresponding NV2x is 0xD80, we hack it in below*/
-	};
-
-	int i;
-	for (i = 0; i < sizeof(tex_format) / sizeof(tex_format[0]); i++) {
-		if (tex_format[i].exa == ExaFormat)
-			return tex_format[i].hw;
-	}
-
-	return 0;
-}
-
-static int NV10DstFormat(int ExaFormat)
-{
-	struct {int exa;int hw;} dst_format[] =
-	{
-		{PICT_a8r8g8b8,	0x108},
-		{PICT_x8r8g8b8, 0x108},
-		{PICT_r5g6b5,	0x103}
-	};
-
-	int i;
-	for (i = 0; i < sizeof(dst_format) / sizeof(dst_format[0]); i++) {
-		if (dst_format[i].exa == ExaFormat)
-			return dst_format[i].hw;
-	}
-
-	return 0;
-}
-
-static Bool NV10CheckTexture(PicturePtr Picture)
+static Bool
+check_texture(PicturePtr pict)
 {
 	int w, h;
 
-	if (!Picture->pDrawable)
+	if (!pict->pDrawable)
 		NOUVEAU_FALLBACK("Solid and gradient pictures unsupported\n");
 
-	w = Picture->pDrawable->width;
-	h = Picture->pDrawable->height;
+	w = pict->pDrawable->width;
+	h = pict->pDrawable->height;
 
-	if ((w > 2046) || (h > 2046))
+	if (w > 2046 || h > 2046)
 		NOUVEAU_FALLBACK("picture too large, %dx%d\n", w, h);
 
-	if (!NV10TexFormat(Picture->format))
+	if (!get_tex_format(pict))
 		return FALSE;
-	if (Picture->filter != PictFilterNearest && Picture->filter != PictFilterBilinear)
+
+	if (pict->filter != PictFilterNearest &&
+	    pict->filter != PictFilterBilinear)
 		return FALSE;
-	/* we cannot repeat on NV10 because NPOT textures do not support this. unfortunately. */
-	if (Picture->repeat != RepeatNone)
+
+	/* We cannot repeat on NV10 because NPOT textures do not
+	 * support this. unfortunately. */
+	if (pict->repeat != RepeatNone)
 		/* we can repeat 1x1 textures */
 		if (!(w == 1 && h == 1))
 			return FALSE;
+
 	return TRUE;
 }
 
-static Bool NV10CheckBuffer(PicturePtr Picture)
+static Bool
+check_render_target(PicturePtr pict)
 {
-	int w = Picture->pDrawable->width;
-	int h = Picture->pDrawable->height;
+	int w = pict->pDrawable->width;
+	int h = pict->pDrawable->height;
 
-	if ((w > 4096) || (h > 4096))
-		return FALSE;
-	if (!NV10DstFormat(Picture->format))
+	if (w > 4096 || h > 4096)
 		return FALSE;
-	return TRUE;
-}
 
-static Bool NV10CheckPictOp(int op)
-{
-	if (op >= PictOpSaturate) {
-		/*we do no saturate, disjoint, conjoint, though we could do e.g. DisjointClear which really is Clear */
+	if (!get_rt_format(pict))
 		return FALSE;
-	}
+
 	return TRUE;
 }
 
-/* Check if the current operation is a doable A8 + A8 */
-/* A8 destination is a special case, because we do it by having the card think 
-it's ARGB. For now we support PictOpAdd which is the only important op for this dst format, 
-and without transformation or funny things.*/
-static Bool NV10Check_A8plusA8_Feasability(PicturePtr src, PicturePtr msk, PicturePtr dst, int op)
+static Bool
+check_pict_op(int op)
 {
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-	return FALSE;
-#endif
-	if ((!msk) && (src->format == PICT_a8) && (dst->format == PICT_a8) && (!src->transform) &&
-	    (op == PictOpAdd) && (src->repeat == RepeatNone)) {
-		return TRUE;
-	}
-	return FALSE;
+	/* We do no saturate, disjoint, conjoint, though we
+	 * could do e.g. DisjointClear which really is
+	 * Clear. */
+	return op < PictOpSaturate;
 }
 
 #if 0
-static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
-				PicturePtr pMaskPicture, PicturePtr pDstPicture)
+static void
+print_fallback_info(char *reason, int op, PicturePtr src, PicturePtr mask,
+		    PicturePtr dst)
 {
 	char out2[4096];
 	char *out = out2;
+
 	sprintf(out, "%s  ", reason);
-	out = out + strlen(out);
+	out += strlen(out);
+
 	switch (op) {
 	case PictOpClear:
 		sprintf(out, "PictOpClear ");
@@ -208,8 +228,9 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
 	default:
 		sprintf(out, "PictOp%d ", op);
 	}
-	out = out + strlen(out);
-	switch (pSrcPicture->format) {
+	out += strlen(out);
+
+	switch (src->format) {
 	case PICT_a8r8g8b8:
 		sprintf(out, "A8R8G8B8 ");
 		break;
@@ -229,16 +250,18 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
 		sprintf(out, "A1 ");
 		break;
 	default:
-		sprintf(out, "%x ", pSrcPicture->format);
+		sprintf(out, "%x ", src->format);
 	}
 	out += strlen(out);
-	sprintf(out, "(%dx%d) ", pSrcPicture->pDrawable->width, pSrcPicture->pDrawable->height);
-	if (pSrcPicture->repeat != RepeatNone)
+
+	sprintf(out, "(%dx%d) ", src->pDrawable->width,
+		src->pDrawable->height);
+	if (src->repeat != RepeatNone)
 		strcat(out, "R ");
 	strcat(out, "-> ");
 	out += strlen(out);
 
-	switch (pDstPicture->format) {
+	switch (dst->format) {
 	case PICT_a8r8g8b8:
 		sprintf(out, "A8R8G8B8 ");
 		break;
@@ -258,17 +281,20 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
 		sprintf(out, "A1  ");
 		break;
 	default:
-		sprintf(out, "%x  ", pDstPicture->format);
+		sprintf(out, "%x  ", dst->format);
 	}
 	out += strlen(out);
-	sprintf(out, "(%dx%d) ", pDstPicture->pDrawable->width, pDstPicture->pDrawable->height);
-	if (pDstPicture->repeat != RepeatNone)
+
+	sprintf(out, "(%dx%d) ", dst->pDrawable->width,
+		dst->pDrawable->height);
+	if (dst->repeat != RepeatNone)
 		strcat(out, "R ");
 	out += strlen(out);
-	if (!pMaskPicture)
+
+	if (!mask)
 		sprintf(out, "& NONE");
 	else {
-		switch (pMaskPicture->format) {
+		switch (mask->format) {
 		case PICT_a8r8g8b8:
 			sprintf(out, "& A8R8G8B8 ");
 			break;
@@ -285,116 +311,98 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
 			sprintf(out, "& A1  ");
 			break;
 		default:
-			sprintf(out, "& %x  ", pMaskPicture->format);
+			sprintf(out, "& %x  ", mask->format);
 		}
 		out += strlen(out);
-		sprintf(out, "(%dx%d) ", pMaskPicture->pDrawable->width, pMaskPicture->pDrawable->height);
-		if (pMaskPicture->repeat != RepeatNone)
+
+		sprintf(out, "(%dx%d) ", mask->pDrawable->width,
+			mask->pDrawable->height);
+		if (mask->repeat != RepeatNone)
 			strcat(out, "R ");
-		if (pMaskPicture->componentAlpha)
+		if (mask->componentAlpha)
 			strcat(out, "C ");
 		out += strlen(out);
 	}
 	strcat(out, "\n");
+
 	xf86DrvMsg(0, X_INFO, "%s", out2);
 }
 #else
-#define NV10EXAFallbackInfo(X,Y,Z,S,T) do { ; } while (0)
+#define print_fallback_info(...)
 #endif
 
-Bool NV10EXACheckComposite(int op,
-			PicturePtr pSrcPicture,
-			PicturePtr pMaskPicture,
-			PicturePtr pDstPicture)
+Bool
+NV10EXACheckComposite(int op, PicturePtr src, PicturePtr mask, PicturePtr dst)
 {
-
-	if (NV10Check_A8plusA8_Feasability(pSrcPicture, pMaskPicture, pDstPicture, op)) {
-		NV10EXAFallbackInfo("Hackelerating", op, pSrcPicture, pMaskPicture, pDstPicture);
-		return TRUE;
-	}
-
-	if (!NV10CheckPictOp(op)) {
-		NV10EXAFallbackInfo("pictop", op, pSrcPicture, pMaskPicture, pDstPicture);
+	if (!check_pict_op(op)) {
+		print_fallback_info("pictop", op, src, mask, dst);
 		return FALSE;
 	}
-	if (!NV10CheckBuffer(pDstPicture)) {
-		NV10EXAFallbackInfo("dst", op, pSrcPicture, pMaskPicture, pDstPicture);
+
+	if (!check_render_target(dst)) {
+		print_fallback_info("dst", op, src, mask, dst);
 		return FALSE;
 	}
 
-	if (!NV10CheckTexture(pSrcPicture)) {
-		NV10EXAFallbackInfo("src", op, pSrcPicture, pMaskPicture, pDstPicture);
+	if (!check_texture(src)) {
+		print_fallback_info("src", op, src, mask, dst);
 		return FALSE;
 	}
 
-	if (pMaskPicture) {
-		if (!NV10CheckTexture(pMaskPicture)) {
-			NV10EXAFallbackInfo("mask", op, pSrcPicture,
-					    pMaskPicture, pDstPicture);
+	if (mask) {
+		if (!check_texture(mask)) {
+			print_fallback_info("mask", op, src,
+					    mask, dst);
 			return FALSE;
 		}
 
-		if (effective_component_alpha(pMaskPicture) &&
+		if (effective_component_alpha(mask) &&
 		    needs_src(op) && needs_src_alpha(op)) {
-			NV10EXAFallbackInfo("ca-mask", op, pSrcPicture,
-					    pMaskPicture, pDstPicture);
+			print_fallback_info("ca-mask", op, src,
+					    mask, dst);
 			return FALSE;
 		}
 	}
 
-	NV10EXAFallbackInfo("Accelerating", op, pSrcPicture, pMaskPicture, pDstPicture);
+	print_fallback_info("Accelerating", op, src, mask, dst);
 	return TRUE;
 }
 
-static Bool NV10SetTexture(NVPtr pNv, int unit, PicturePtr Pict, PixmapPtr pixmap)
+static Bool
+setup_texture(NVPtr pNv, int unit, PicturePtr pict, PixmapPtr pixmap)
 {
 	struct nouveau_channel *chan = pNv->chan;
 	struct nouveau_grobj *celsius = pNv->Nv3D;
 	struct nouveau_bo *bo = nouveau_pixmap_bo(pixmap);
 	unsigned delta = nouveau_pixmap_offset(pixmap);
-	int log2w = log2i(Pict->pDrawable->width);
-	int log2h = log2i(Pict->pDrawable->height);
-	int w;
+	long w = pict->pDrawable->width,
+	     h = pict->pDrawable->height;
 	unsigned int txfmt =
-			(NV10TCL_TX_FORMAT_WRAP_T_CLAMP_TO_EDGE) |
-			(NV10TCL_TX_FORMAT_WRAP_S_CLAMP_TO_EDGE) |
-			(log2w<<20) |
-			(log2h<<16) |
-			(1<<12) | /* lod == 1 */
-			0x51 /* UNK */;
+		NV10TCL_TX_FORMAT_WRAP_T_CLAMP_TO_EDGE |
+		NV10TCL_TX_FORMAT_WRAP_S_CLAMP_TO_EDGE |
+		log2i(w) << 20 | log2i(h) << 16 |
+		1 << 12 | /* lod == 1 */
+		get_tex_format(pict) |
+		0x51 /* UNK */;
 
 	BEGIN_RING(chan, celsius, NV10TCL_TX_OFFSET(unit), 1);
 	if (OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD))
 		return FALSE;
 
-	/* if repeat is set we're always handling a 1x1 texture with ARGB/XRGB destination, 
-	in that case we change the format	to use the POT (swizzled) matching format */
-	if (Pict->repeat != RepeatNone)
-	{
-		if (Pict->format == PICT_a8)
-			txfmt |= 0x80; /* A8 */
-		else if (Pict->format == PICT_r5g6b5 )
-			txfmt |= 0x280; /* R5G6B5 */
-		else
-			txfmt |= 0x300; /* ARGB format */
-	} else {
-		if (pNv->Architecture == NV_ARCH_20 && Pict->format == PICT_a8)
-			txfmt |= 0xd80;
-		else
-			txfmt |= NV10TexFormat(Pict->format);
-		w = Pict->pDrawable->width;
-		/* NPOT_SIZE expects an even number for width, we can round up uneven
-		* numbers here because EXA always gives 64 byte aligned pixmaps
-		* and for all formats we support 64 bytes represents an even number
-		* of pixels
-		*/
+	if (pict->repeat == RepeatNone) {
+		/* NPOT_SIZE expects an even number for width, we can
+		 * round up uneven numbers here because EXA always
+		 * gives 64 byte aligned pixmaps and for all formats
+		 * we support 64 bytes represents an even number of
+		 * pixels
+		 */
 		w = (w + 1) &~ 1;
 
 		BEGIN_RING(chan, celsius, NV10TCL_TX_NPOT_PITCH(unit), 1);
 		OUT_RING  (chan, exaGetPixmapPitch(pixmap) << 16);
 
 		BEGIN_RING(chan, celsius, NV10TCL_TX_NPOT_SIZE(unit), 1);
-		OUT_RING  (chan, (w<<16) | Pict->pDrawable->height);
+		OUT_RING  (chan, w << 16 | h);
 	}
 
 	BEGIN_RING(chan, celsius, NV10TCL_TX_FORMAT(unit), 1 );
@@ -404,218 +412,135 @@ static Bool NV10SetTexture(NVPtr pNv, int unit, PicturePtr Pict, PixmapPtr pixma
 	OUT_RING  (chan, NV10TCL_TX_ENABLE_ENABLE);
 
 	BEGIN_RING(chan, celsius, NV10TCL_TX_FILTER(unit), 1);
-	if (Pict->filter == PictFilterNearest)
-		OUT_RING  (chan, (NV10TCL_TX_FILTER_MAGNIFY_NEAREST) |
-				(NV10TCL_TX_FILTER_MINIFY_NEAREST));
+	if (pict->filter == PictFilterNearest)
+		OUT_RING(chan, (NV10TCL_TX_FILTER_MAGNIFY_NEAREST |
+				NV10TCL_TX_FILTER_MINIFY_NEAREST));
 	else
-		OUT_RING  (chan, (NV10TCL_TX_FILTER_MAGNIFY_LINEAR) |
-				(NV10TCL_TX_FILTER_MINIFY_LINEAR));
+		OUT_RING(chan, (NV10TCL_TX_FILTER_MAGNIFY_LINEAR |
+				NV10TCL_TX_FILTER_MINIFY_LINEAR));
 
-	state.unit[unit].width		= (float)pixmap->drawable.width;
-	state.unit[unit].height		= (float)pixmap->drawable.height;
-	state.unit[unit].transform	= Pict->transform;
 	return TRUE;
 }
 
-static Bool NV10SetBuffer(NVPtr pNv, PicturePtr Pict, PixmapPtr pixmap)
+static Bool
+setup_render_target(NVPtr pNv, PicturePtr pict, PixmapPtr pixmap)
 {
 	struct nouveau_channel *chan = pNv->chan;
 	struct nouveau_grobj *celsius = pNv->Nv3D;
 	struct nouveau_bo *bo = nouveau_pixmap_bo(pixmap);
 	unsigned delta = nouveau_pixmap_offset(pixmap);
-	int i;
-	int x = 0;
-	int y = 0;
-	int w = 2048;
-	int h = 2048;
-
-	BEGIN_RING(chan, celsius, NV10TCL_RT_FORMAT, 4);
-	if (state.is_a8_plus_a8) {
-		/*A8 + A8 hack */
-		OUT_RING  (chan, NV10DstFormat(PICT_a8r8g8b8));
-	} else {
-		OUT_RING  (chan, NV10DstFormat(Pict->format));
-	}
 
-	OUT_RING  (chan, ((uint32_t)exaGetPixmapPitch(pixmap) << 16) |(uint32_t)exaGetPixmapPitch(pixmap));
+	BEGIN_RING(chan, celsius, NV10TCL_RT_FORMAT, 2);
+	OUT_RING  (chan, get_rt_format(pict));
+	OUT_RING  (chan, (exaGetPixmapPitch(pixmap) << 16 |
+			  exaGetPixmapPitch(pixmap)));
+
+	BEGIN_RING(chan, celsius, NV10TCL_COLOR_OFFSET, 1);
 	if (OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR))
 		return FALSE;
-	OUT_RING  (chan, 0);
 
-	BEGIN_RING(chan, celsius, NV10TCL_RT_HORIZ, 2);
-	OUT_RING  (chan, (w<<16)|x);
-	OUT_RING  (chan, (h<<16)|y);
-	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_MODE, 1); /* clip_mode */
-	OUT_RING  (chan, 0);
-	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
-	OUT_RING  (chan, ((w-1+x)<<16)|x|0x08000800);
-	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
-	OUT_RING  (chan, ((h-1+y)<<16)|y|0x08000800);
+	return TRUE;
+}
 
-	BEGIN_RING(chan, celsius, NV10TCL_PROJECTION_MATRIX(0), 16);
-	for(i=0;i<16;i++)
-		if (i/4==i%4)
-			OUT_RINGf (chan, 1.0f);
-		else
-			OUT_RINGf (chan, 0.0f);
+/*
+ * This can be a bit difficult to understand at first glance.  Reg
+ * combiners are described here:
+ * http://icps.u-strasbg.fr/~marchesin/perso/extensions/NV/register_combiners.html
+ *
+ * Single texturing setup, without honoring vertex colors (non default
+ * setup) is: Alpha RC 0 : a_0 * 1 + 0 * 0 RGB RC 0 : rgb_0 * 1 + 0 *
+ * 0 RC 1s are unused Final combiner uses default setup
+ *
+ * Default setup uses vertex rgb/alpha in place of 1s above, but we
+ * don't need that in 2D.
+ *
+ * Multi texturing setup, where we do TEX0 in TEX1 (masking) is:
+ * Alpha RC 0 : a_0 * a_1 + 0 * 0
+ * RGB RC0 : rgb_0 * a_1 + 0 * 0
+ * RC 1s are unused
+ * Final combiner uses default setup
+ */
 
-	BEGIN_RING(chan, celsius, NV10TCL_DEPTH_RANGE_NEAR, 2);
-	OUT_RING  (chan, 0);
-#if SCREEN_BPP == 32
-	OUT_RINGf (chan, 16777216.0);
-#else
-	OUT_RINGf (chan, 65536.0);
-#endif
-	BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_SCALE_X, 4);
-	OUT_RINGf (chan, -2048.0);
-	OUT_RINGf (chan, -2048.0);
-	OUT_RINGf (chan, 0);
-	OUT_RING  (chan, 0);
+/* Bind the combiner variable <input> to a constant 1. */
+#define RC_IN_ONE(input)						\
+	(NV10TCL_RC_IN_RGB_##input##_INPUT_ZERO |			\
+	 NV10TCL_RC_IN_RGB_##input##_COMPONENT_USAGE_ALPHA |		\
+	 NV10TCL_RC_IN_RGB_##input##_MAPPING_UNSIGNED_INVERT_NV)
 
-	return TRUE;
-}
+/* Bind the combiner variable <input> to the specified channel from
+ * the texture unit <unit>. */
+#define RC_IN_TEX(input, chan, unit)					\
+	(NV10TCL_RC_IN_RGB_##input##_INPUT_TEXTURE##unit##_ARB |	\
+	 NV10TCL_RC_IN_RGB_##input##_COMPONENT_USAGE_##chan)
 
-#define RC_IN_ONE(chan, input)						\
-	(NV10TCL_RC_IN_##chan##_##input##_INPUT_ZERO			\
-	 | NV10TCL_RC_IN_##chan##_##input##_COMPONENT_USAGE_##chan	\
-	 | NV10TCL_RC_IN_##chan##_##input##_MAPPING_UNSIGNED_INVERT_NV)
+/* Bind the combiner variable <input> to the specified channel from
+ * the constant color <unit>. */
+#define RC_IN_COLOR(input, chan, unit)					\
+	(NV10TCL_RC_IN_RGB_##input##_INPUT_CONSTANT_COLOR##unit##_NV | \
+	 NV10TCL_RC_IN_RGB_##input##_COMPONENT_USAGE_##chan)
 
-static void NV10SetRegCombs(NVPtr pNv, PicturePtr src, PicturePtr mask)
+static void
+setup_combiners(NVPtr pNv, PicturePtr src, PicturePtr mask)
 {
 	struct nouveau_channel *chan = pNv->chan;
 	struct nouveau_grobj *celsius = pNv->Nv3D;
-	unsigned int rc0_in_alpha = 0, rc0_in_rgb = 0;
-
-/*This can be a bit difficult to understand at first glance.
-Reg combiners are described here:
-http://icps.u-strasbg.fr/~marchesin/perso/extensions/NV/register_combiners.html
-	
-Single texturing setup, without honoring vertex colors (non default setup) is:
-Alpha RC 0 : a_0  * 1 + 0 * 0
-RGB RC 0 : rgb_0 * 1 + 0 * 0
-RC 1s are unused
-Final combiner uses default setup
-	
-Default setup uses vertex rgb/alpha in place of 1s above, but we don't need that in 2D.
-	
-Multi texturing setup, where we do TEX0 in TEX1 (masking) is:
-Alpha RC 0 : a_0 * a_1 + 0 * 0
-RGB RC0 : rgb_0 * a_1 + 0 * 0
-RC 1s are unused
-Final combiner uses default setup
-	
-*/
+	uint32_t rc_in_alpha = 0, rc_in_rgb = 0;
+
 	if (PICT_FORMAT_A(src->format))
-		rc0_in_alpha |= NV10TCL_RC_IN_ALPHA_A_INPUT_TEXTURE0_ARB
-			| NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA;
+		rc_in_alpha |= RC_IN_TEX(A, ALPHA, 0);
 	else
-		rc0_in_alpha |= RC_IN_ONE(ALPHA, A);
+		rc_in_alpha |= RC_IN_ONE(A);
 
 	if (mask && PICT_FORMAT_A(mask->format))
-		rc0_in_alpha |= NV10TCL_RC_IN_RGB_B_INPUT_TEXTURE1_ARB
-			| NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_ALPHA;
+		rc_in_alpha |= RC_IN_TEX(B, ALPHA, 1);
 	else
-		rc0_in_alpha |= RC_IN_ONE(ALPHA, B);
+		rc_in_alpha |= RC_IN_ONE(B);
 
 	if (effective_component_alpha(mask)) {
-		rc0_in_rgb |= NV10TCL_RC_IN_RGB_B_INPUT_TEXTURE1_ARB
-			| NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_RGB;
-
 		if (!needs_src_alpha(pNv->alu)) {
-			/*
-			 * The alpha channels won't be used for blending. Drop
+			/* The alpha channels won't be used for blending. Drop
 			 * them, as our pixels only have 4 components...
 			 * output_i = src_i * mask_i
 			 */
 			if (PICT_FORMAT_RGB(src->format))
-				rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
-					| NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_RGB;
-
+				rc_in_rgb |= RC_IN_TEX(A, RGB, 0);
 		} else {
-			/*
-			 * The RGB channels won't be used for blending. Drop
+			/* The RGB channels won't be used for blending. Drop
 			 * them.
 			 * output_i = src_alpha * mask_i
 			 */
 			if (PICT_FORMAT_A(src->format))
-				rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
-					| NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA;
+				rc_in_rgb |= RC_IN_TEX(A, ALPHA, 0);
 			else
-				rc0_in_rgb |= RC_IN_ONE(RGB, A);
+				rc_in_rgb |= RC_IN_ONE(A);
 		}
 
+		rc_in_rgb |= RC_IN_TEX(B, RGB, 1);
+
 	} else {
 		if (PICT_FORMAT_RGB(src->format))
-			rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
-				| NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_RGB;
+			rc_in_rgb |= RC_IN_TEX(A, RGB, 0);
 
 		if (mask && PICT_FORMAT_A(mask->format))
-			rc0_in_rgb |= NV10TCL_RC_IN_RGB_B_INPUT_TEXTURE1_ARB
-				| NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_ALPHA;
+			rc_in_rgb |= RC_IN_TEX(B, ALPHA, 1);
 		else
-			rc0_in_rgb |= RC_IN_ONE(RGB, B);
+			rc_in_rgb |= RC_IN_ONE(B);
 	}
 
 	BEGIN_RING(chan, celsius, NV10TCL_RC_IN_ALPHA(0), 1);
-	OUT_RING  (chan, rc0_in_alpha);
+	OUT_RING  (chan, rc_in_alpha);
 	BEGIN_RING(chan, celsius, NV10TCL_RC_IN_RGB(0), 1);
-	OUT_RING  (chan, rc0_in_rgb);
+	OUT_RING  (chan, rc_in_rgb);
 }
 
-static void NV10SetRegCombs_A8plusA8(NVPtr pNv, int pass, int mask_out_bytes)
-{
-	struct nouveau_channel *chan = pNv->chan;
-	struct nouveau_grobj *celsius = pNv->Nv3D;
-	unsigned int rc0_in_alpha = 0, rc0_in_rgb = 0;
-	unsigned int color0 = 0, color1 = 0;
-
-	if (pass == 1) {
-		if (~mask_out_bytes & 1)
-			rc0_in_alpha |= NV10TCL_RC_IN_ALPHA_A_INPUT_TEXTURE1_ARB
-				| NV10TCL_RC_IN_ALPHA_A_COMPONENT_USAGE_ALPHA
-				| RC_IN_ONE(ALPHA, B);
-
-		if (~mask_out_bytes & 2)
-			rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
-				| NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA
-				| NV10TCL_RC_IN_RGB_B_INPUT_CONSTANT_COLOR0_NV
-				| NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_RGB;
-
-		color0 = 0x00ff0000; /*R = 1 G = 0 B = 0*/
-	} else {
-		if (~mask_out_bytes & 8)
-			rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
-				| NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA
-				| NV10TCL_RC_IN_RGB_B_INPUT_CONSTANT_COLOR0_NV
-				| NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_RGB;
-
-		color0 = 0x000000ff;
-
-		if (~mask_out_bytes & 4)
-			rc0_in_rgb |= NV10TCL_RC_IN_RGB_C_INPUT_TEXTURE1_ARB
-				| NV10TCL_RC_IN_RGB_C_COMPONENT_USAGE_ALPHA
-				| NV10TCL_RC_IN_RGB_D_INPUT_CONSTANT_COLOR1_NV
-				| NV10TCL_RC_IN_RGB_D_COMPONENT_USAGE_RGB;
-
-		color1 = 0x0000ff00; /*R = 0, G = 1, B = 0*/
-	}
-
-	BEGIN_RING(chan, celsius, NV10TCL_RC_IN_ALPHA(0), 1);
-	OUT_RING  (chan, rc0_in_alpha);
-	BEGIN_RING(chan, celsius, NV10TCL_RC_IN_RGB(0), 1);
-	OUT_RING  (chan, rc0_in_rgb);
-	BEGIN_RING(chan, celsius, NV10TCL_RC_COLOR(0), 2);
-	OUT_RING  (chan, color0);
-	OUT_RING  (chan, color1);
-}
-


Reply to: