Hey,

There's one relevant patch in the F13 DDX package that hasn't been
pushed into git still.

The patch simply switches off the bicubic filtering if we're scaling the
image by less than 200% in either direction in order to prevent some
excessive blurriness in the image (very noticable with the gstreamer
xvideo test).

The patch has been in the Fedora package since F11 as a user reported
the issue as a bug, and the radeon driver has similar code, but I
thought I'd ask for opinions before I pushed this to git.

Ben.
>From 9e1f2ff45e5b22406f3575298113f1168b3bde5a Mon Sep 17 00:00:00 2001
From: Ben Skeggs <[email protected]>
Date: Mon, 4 May 2009 17:04:34 +1000
Subject: [PATCH 1/2] xv: only use bicubic filtering when scaling >=2x

---
 src/nv30_xv_tex.c |    7 +++++--
 src/nv40_xv_tex.c |    8 ++++++--
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/nv30_xv_tex.c b/src/nv30_xv_tex.c
index 617e63b..f4bc1da 100644
--- a/src/nv30_xv_tex.c
+++ b/src/nv30_xv_tex.c
@@ -258,7 +258,7 @@ NV30PutTextureImage(ScrnInfoPtr pScrn, struct nouveau_bo *src, int src_offset,
 	struct nouveau_channel *chan = pNv->chan;
 	struct nouveau_grobj *rankine = pNv->Nv3D;
 	struct nouveau_bo *bo = nouveau_pixmap_bo(ppix);
-	Bool redirected = FALSE;
+	Bool redirected = FALSE, bicubic = pPriv->bicubic;
 	float X1, X2, Y1, Y2;
 	BoxPtr pbox;
 	int nbox;
@@ -342,7 +342,10 @@ NV30PutTextureImage(ScrnInfoPtr pScrn, struct nouveau_bo *src, int src_offset,
 	BEGIN_RING(chan, rankine, NV34TCL_TX_ENABLE(3), 1);
 	OUT_RING  (chan, 0x0);
 
-	if (!NV30_LoadFragProg(pScrn, pPriv->bicubic ?
+	if (drw_w / 2 < src_w || drw_h / 2 < src_h)
+		bicubic = FALSE;
+
+	if (!NV30_LoadFragProg(pScrn, bicubic ?
 			       &nv30_fp_yv12_bicubic :
 			       &nv30_fp_yv12_bilinear)) {
 		MARK_UNDO(chan);
diff --git a/src/nv40_xv_tex.c b/src/nv40_xv_tex.c
index 3a5d439..a46f1e3 100644
--- a/src/nv40_xv_tex.c
+++ b/src/nv40_xv_tex.c
@@ -262,7 +262,7 @@ NV40PutTextureImage(ScrnInfoPtr pScrn,
 	struct nouveau_channel *chan = pNv->chan;
 	struct nouveau_grobj *curie = pNv->Nv3D;
 	struct nouveau_bo *bo = nouveau_pixmap_bo(ppix);
-	Bool redirected = FALSE;
+	Bool redirected = FALSE, bicubic = pPriv->bicubic;
 	float X1, X2, Y1, Y2;
 	BoxPtr pbox;
 	int nbox;
@@ -322,7 +322,11 @@ NV40PutTextureImage(ScrnInfoPtr pScrn,
 	}
 
 	NV40_LoadVtxProg(pScrn, &nv40_vp_video);
-	if (!NV40_LoadFragProg(pScrn, pPriv->bicubic ?
+
+	if (drw_w / 2 < src_w || drw_h / 2 < src_h)
+		bicubic = FALSE;
+
+	if (!NV40_LoadFragProg(pScrn, bicubic ?
 			       &nv40_fp_yv12_bicubic :
 			       &nv30_fp_yv12_bilinear)) {
 		MARK_UNDO(chan);
-- 
1.7.0.1

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to