[Intel-gfx] [PATCH] Xv: free tearing on textured video

Xiang, Haihao haihao.xiang at intel.com
Wed Feb 25 08:35:09 CET 2009


Synchronize the screen update to vblank and add an option
XvTexturedVsync to control it.
---
 man/intel.man     |    5 +++++
 src/i810_reg.h    |    4 ++++
 src/i830.h        |    1 +
 src/i830_driver.c |    3 +++
 src/i830_video.c  |   53 ++++++++++++++++++++++++++++++++++++++---------------
 5 files changed, 51 insertions(+), 15 deletions(-)

diff --git a/man/intel.man b/man/intel.man
index c7a3c61..2738ef6 100644
--- a/man/intel.man
+++ b/man/intel.man
@@ -202,6 +202,11 @@ information.
 Enable XvMC driver. Current support MPEG2 MC on 915/945 and G33 series.
 User should provide absolute path to libIntelXvMC.so in XvMCConfig file.
 Default: Disabled.
+.TP
+.BI "Option \*qXvTexturedVsync\*q \*q" boolean \*q
+This option controls whether textured adapter synchronizes the screen update to 
+the vblank.
+Default: disabled.
 
 .SH OUTPUT CONFIGURATION
 On 830M and better chipsets, the driver supports runtime configuration of
diff --git a/src/i810_reg.h b/src/i810_reg.h
index e2ffba1..b6aa769 100644
--- a/src/i810_reg.h
+++ b/src/i810_reg.h
@@ -2432,7 +2432,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 /* Wait for Events */
 #define MI_WAIT_FOR_EVENT		(0x03<<23)
+#define MI_WAIT_FOR_PIPEB_SVBLANK       (1<<18)
+#define MI_WAIT_FOR_PIPEA_SVBLANK       (1<<17)
 #define MI_WAIT_FOR_OVERLAY_FLIP	(1<<16)
+#define MI_WAIT_FOR_PIPEB_VBLANK	(1<<7)
+#define MI_WAIT_FOR_PIPEA_VBLANK	(1<<3)
 
 /* Flush */
 #define MI_FLUSH			(0x04<<23)
diff --git a/src/i830.h b/src/i830.h
index 7904b9f..735b0c1 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -555,6 +555,7 @@ typedef struct _I830Rec {
    Bool XvDisabled;			/* Xv disabled in PreInit. */
    Bool XvEnabled;			/* Xv enabled for this generation. */
    Bool XvPreferOverlay;
+   Bool XvTexturedVsync;
 
 #ifdef I830_XV
    int colorKey;
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 0a8a9c6..5d7285c 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -318,6 +318,7 @@ typedef enum {
    OPTION_XVMC,
 #endif
    OPTION_PREFER_OVERLAY,
+   OPTION_TEXTURED_VSYNC,
 } I830Opts;
 
 static OptionInfoRec I830Options[] = {
@@ -343,6 +344,7 @@ static OptionInfoRec I830Options[] = {
    {OPTION_XVMC,	"XvMC",		OPTV_BOOLEAN,	{0},	TRUE},
 #endif
    {OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, FALSE},
+   {OPTION_TEXTURED_VSYNC, "XvTexturedVsync", OPTV_BOOLEAN, {0}, FALSE},
    {-1,			NULL,		OPTV_NONE,	{0},	FALSE}
 };
 /* *INDENT-ON* */
@@ -1777,6 +1779,7 @@ I830XvInit(ScrnInfoPtr pScrn)
 	!xf86ReturnOptValBool(pI830->Options, OPTION_XVIDEO, TRUE);
 
    pI830->XvPreferOverlay = xf86ReturnOptValBool(pI830->Options, OPTION_PREFER_OVERLAY, FALSE);
+   pI830->XvTexturedVsync = xf86ReturnOptValBool(pI830->Options, OPTION_TEXTURED_VSYNC, FALSE);
 
 #ifdef I830_XV
     if (xf86GetOptValInteger(pI830->Options, OPTION_VIDEO_KEY,
diff --git a/src/i830_video.c b/src/i830_video.c
index c9a0181..eea6a5b 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -2303,7 +2303,7 @@ I830PutImage(ScrnInfoPtr pScrn,
     dstBox.y2 = drw_y + drw_h;
 
     if (!i830_clip_video_helper(pScrn, 
-				pPriv->textured ? NULL : &crtc,
+				&crtc,
 				&dstBox, &x1, &x2, &y1, &y2, clipBoxes,
 				width, height))
 	return Success;
@@ -2528,22 +2528,45 @@ I830PutImage(ScrnInfoPtr pScrn,
 	    REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
 	    i830_fill_colorkey (pScreen, pPriv->colorKey, clipBoxes);
 	}
-    } else if (IS_I965G(pI830)) {
-
+    } else {
+        if (pI830->XvTexturedVsync) {
+            I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
+            int event;
+
+            if (IS_I965G(pI830)) {
+                if (intel_crtc->pipe == 0)
+                    event = MI_WAIT_FOR_PIPEA_SVBLANK;
+                else
+                    event = MI_WAIT_FOR_PIPEB_SVBLANK;
+            } else {
+                if (intel_crtc->pipe == 0)
+                    event = MI_WAIT_FOR_PIPEA_VBLANK;
+                else
+                    event = MI_WAIT_FOR_PIPEB_VBLANK;
+            }
+
+            BEGIN_BATCH(2);
+            OUT_BATCH(MI_WAIT_FOR_EVENT | event);
+            OUT_BATCH(MI_NOOP);
+            ADVANCE_BATCH();
+        }
+
+        if (IS_I965G(pI830)) {
 #ifdef INTEL_XVMC
-	if (id == FOURCC_XVMC && pPriv->rotation == RR_Rotate_0) {
-	    pPriv->YBuf0offset = buf -  pI830->FbBase;
-	    pPriv->UBuf0offset = pPriv->YBuf0offset + height*width; 
-	    pPriv->VBuf0offset = pPriv->UBuf0offset + height*width/4; 
-	}
+            if (id == FOURCC_XVMC && pPriv->rotation == RR_Rotate_0) {
+                pPriv->YBuf0offset = buf -  pI830->FbBase;
+                pPriv->UBuf0offset = pPriv->YBuf0offset + height*width; 
+                pPriv->VBuf0offset = pPriv->UBuf0offset + height*width/4; 
+            }
 #endif
-	I965DisplayVideoTextured(pScrn, pPriv, destId, clipBoxes, width, height,
-				 dstPitch, x1, y1, x2, y2,
-				 src_w, src_h, drw_w, drw_h, pPixmap);
-    } else {
-	I915DisplayVideoTextured(pScrn, pPriv, destId, clipBoxes, width, height,
-				 dstPitch, dstPitch2, x1, y1, x2, y2,
-				 src_w, src_h, drw_w, drw_h, pPixmap);
+            I965DisplayVideoTextured(pScrn, pPriv, destId, clipBoxes, width, height,
+                                     dstPitch, x1, y1, x2, y2,
+                                     src_w, src_h, drw_w, drw_h, pPixmap);
+        } else {
+            I915DisplayVideoTextured(pScrn, pPriv, destId, clipBoxes, width, height,
+                                     dstPitch, dstPitch2, x1, y1, x2, y2,
+                                     src_w, src_h, drw_w, drw_h, pPixmap);
+        }
     }
     if (pPriv->textured) {
 	DamageDamageRegion(pDraw, clipBoxes);
-- 
1.5.6.3




More information about the Intel-gfx mailing list