[Nouveau] [PATCH] nv/exa: fix 15/16 bits solid fill

Marcin Slusarz marcin.slusarz at gmail.com
Sat Oct 31 12:24:52 PDT 2009


From: Marcin Slusarz <marcin.slusarz at gmail.com>

after this change nouveau passes all fill and blend tests of rendercheck
(before: fill - 108/120, blend - 3323868/3569150)
tested on NV34

Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
---
 src/nv04_exa.c        |   19 +++++++++----------
 src/nv_accel_common.c |    5 ++++-
 2 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/src/nv04_exa.c b/src/nv04_exa.c
index 132c9d5..1852f99 100644
--- a/src/nv04_exa.c
+++ b/src/nv04_exa.c
@@ -81,7 +81,7 @@ NV04EXAPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
 	struct nouveau_grobj *rect = pNv->NvRectangle;
 	struct nouveau_bo *bo = nouveau_pixmap_bo(pPixmap);
 	unsigned delta = nouveau_pixmap_offset(pPixmap);
-	unsigned int fmt, pitch, color;
+	unsigned int fmt, pitch, fmt2 = NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT_A8R8G8B8;
 
 	WAIT_RING(chan, 64);
 
@@ -102,13 +102,12 @@ NV04EXAPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
 	pitch = exaGetPixmapPitch(pPixmap);
 
 	if (pPixmap->drawable.bitsPerPixel == 16) {
-		/* convert to 32bpp */
-		uint32_t r =  (fg&0x1F)          * 255 / 31;
-		uint32_t g = ((fg&0x7E0) >> 5)   * 255 / 63;
-		uint32_t b = ((fg&0xF100) >> 11) * 255 / 31;
-		color = b<<16 | g<<8 | r;
-	} else 
-		color = fg;
+		if (pPixmap->drawable.depth == 16) {
+			fmt2 = NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT_A16R5G6B5;
+		} else if (pPixmap->drawable.depth == 15) {
+			fmt2 = NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT_X16A1R5G5B5;
+		}
+	}
 
 	/* When SURFACE_FORMAT_A8R8G8B8 is used with GDI_RECTANGLE_TEXT, the 
 	 * alpha channel gets forced to 0xFF for some reason.  We're using 
@@ -124,9 +123,9 @@ NV04EXAPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
 	OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
 
 	BEGIN_RING(chan, rect, NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT, 1);
-	OUT_RING  (chan, NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT_A8R8G8B8);
+	OUT_RING  (chan, fmt2);
 	BEGIN_RING(chan, rect, NV04_GDI_RECTANGLE_TEXT_COLOR1_A, 1);
-	OUT_RING (chan, color);
+	OUT_RING (chan, fg);
 
 	pNv->pdpix = pPixmap;
 	pNv->alu = alu;
diff --git a/src/nv_accel_common.c b/src/nv_accel_common.c
index fa77cc3..3c8911e 100644
--- a/src/nv_accel_common.c
+++ b/src/nv_accel_common.c
@@ -117,7 +117,10 @@ NVAccelGetCtxSurf2DFormatFromPixmap(PixmapPtr pPix, int *fmt_ret)
 		*fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_X8R8G8B8_Z8R8G8B8;
 		break;
 	case 16:
-		*fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_R5G6B5;
+		if (pPix->drawable.depth == 16)
+			*fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_R5G6B5;
+		else
+			*fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_X1R5G5B5_Z1R5G5B5;
 		break;
 	case 8:
 		*fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_Y8;
-- 
1.6.4.4



More information about the Nouveau mailing list