[PATCH video-ati] video: Refill color key when there is expose

Pauli ext-pauli.nieminen at nokia.com
Tue Jan 18 08:15:38 PST 2011


From: Pauli Nieminen <ext-pauli.nieminen at nokia.com>

XResizeWindow causes background painting if bit gravity is forget. In
that case clipBoxes didn't change but color key would still have to be
filled.

xf86XVGetPortFillArea can be used to fill color key to areas that were
exposed since last PutImage or PutVideo.

Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
---

This is example how drivers would have to be changed to use
xf86XVGetPortFillArea. I didn't actually test the patch as I don't have any hw
here.

 configure.ac       |    5 ++++
 src/radeon_video.c |   58 +++++++++++++++++++++++++++++++++++++--------------
 src/radeon_video.h |    3 ++
 3 files changed, 50 insertions(+), 16 deletions(-)

diff --git a/configure.ac b/configure.ac
index 5dbf65a..8521b80 100644
--- a/configure.ac
+++ b/configure.ac
@@ -198,6 +198,11 @@ if test "x$have_exa_h" = xyes; then
         fi
 fi
 
+AC_CHECK_DECL(xf86XVGetPortFillArea,
+	      [AC_DEFINE(HAVE_XV_GET_PORT_FILL_AREA, 1, [Have xf86XVGetPortFillArea prototype])],
+	      [],
+	      [#include <xf86xv.h>])
+
 AC_CHECK_DECL(xf86XVFillKeyHelperDrawable,
 	      [AC_DEFINE(HAVE_XV_DRAWABLE_HELPER, 1, [Have xf86XVFillKeyHelperDrawable prototype])],
 	      [],
diff --git a/src/radeon_video.c b/src/radeon_video.c
index 0bb5ab3..4b5659c 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -1627,7 +1627,11 @@ RADEONSetupImageVideo(ScreenPtr pScreen)
     adapt->QueryImageAttributes = RADEONQueryImageAttributes;
 
     pPriv = (RADEONPortPrivPtr)(adapt->pPortPrivates[0].ptr);
+#ifdef HAVE_XV_GET_PORT_FILL_AREA
+    pPriv->colorKeyChanged = TRUE;
+#else
     REGION_NULL(pScreen, &(pPriv->clip));
+#endif
 
     pPriv->textured = FALSE;
 
@@ -1662,7 +1666,9 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
       return;
   }
 
+#ifndef HAVE_XV_GET_PORT_FILL_AREA
   REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
+#endif
 
   if(cleanup) {
      if(pPriv->videoStatus & CLIENT_VIDEO_ON) {
@@ -1794,7 +1800,11 @@ RADEONSetPortAttribute(ScrnInfoPtr  pScrn,
     {
 	pPriv->colorKey = value;
 	RADEONSetColorKey (pScrn, pPriv->colorKey);
+#ifdef HAVE_XV_GET_PORT_FILL_AREA
+	pPriv->colorKeyChanged = TRUE;
+#else
 	REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
+#endif
     } 
     else if(attribute == xvCRTC) 
     {
@@ -2823,6 +2833,32 @@ RADEONFillKeyHelper(DrawablePtr pDraw, uint32_t colorKey, RegionPtr clipBoxes)
 #endif
 }
 
+static void RADEONFillKey(DrawablePtr pDraw, RADEONPortPrivPtr pPriv, RegionPtr clipBoxes)
+{
+#ifdef HAVE_XV_GET_PORT_FILL_AREA
+   RegionRec fillBoxes;
+
+    REGION_NULL(pDraw->pScreen, &fillBoxes);
+    if(xf86XVGetPortFillArea(pDraw, pPriv, clipBoxes, &fillBoxes) ||
+	    pPriv->colorKeyChanged) {
+	RegionPtr fill = !pPriv->colorKeyChanged ? &fillBoxes : clipBoxes;
+	pPriv->colorKeyChanged = FALSE;
+        /* draw these */
+        if(pPriv->autopaint_colorkey)
+	    RADEONFillKeyHelper(pDraw, pPriv->colorKey, fill);
+    }
+    REGION_UNINIT(pDraw->pScreen, &fillBoxes);
+#else
+    /* update cliplist */
+    if(!REGION_EQUAL(pDraw->pScreen, &pPriv->clip, clipBoxes)) {
+	REGION_COPY(pDraw->pScreen, &pPriv->clip, clipBoxes);
+        /* draw these */
+        if(pPriv->autopaint_colorkey)
+	    RADEONFillKeyHelper(pDraw, pPriv->colorKey, clipBoxes);
+    }
+#endif
+}
+
 
 static int
 RADEONPutImage(
@@ -3057,14 +3093,7 @@ RADEONPutImage(
     	break;
     }
 
-    /* update cliplist */
-    if(!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes))
-    {
-	REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
-	/* draw these */
-	if(pPriv->autopaint_colorkey)
-	    RADEONFillKeyHelper(pDraw, pPriv->colorKey, clipBoxes);
-    }
+    RADEONFillKey(pDraw, pPriv, clipBoxes);
 
     /* FIXME: someone should look at these offsets, I don't think it makes sense how
               they are handled throughout the source. */
@@ -3349,7 +3378,11 @@ RADEONDisplaySurface(
     pPriv->isOn = TRUE;
     /* we've prempted the XvImage stream so set its free timer */
     if (portPriv->videoStatus & CLIENT_VIDEO_ON) {
+#ifdef HAVE_XV_GET_PORT_FILL_AREA
+	portPriv->colorKeyChanged = TRUE;
+#else
 	REGION_EMPTY(pScrn->pScreen, &portPriv->clip);
+#endif
 	UpdateCurrentTime();
 	portPriv->videoStatus = FREE_TIMER;
 	portPriv->freeTime = currentTime.milliseconds + FREE_DELAY;
@@ -3620,14 +3653,7 @@ RADEONPutVideo(
       if(pPriv->i2c != NULL)RADEON_board_setmisc(pPriv);
    }
 
-   
-   /* update cliplist */
-   if(!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) {
-        REGION_COPY(pScreen, &pPriv->clip, clipBoxes);
-        /* draw these */
-        if(pPriv->autopaint_colorkey)
-	    RADEONFillKeyHelper(pDraw, pPriv->colorKey, clipBoxes);
-   }
+   RADEONFillKey(pDraw, pPriv, clipBoxes);
 
    RADEONDisplayVideo(pScrn, crtc, pPriv, id, pPriv->video_offset,
 		      offset1+top*srcPitch, offset2+top*srcPitch,
diff --git a/src/radeon_video.h b/src/radeon_video.h
index ab0c433..d9e98e0 100644
--- a/src/radeon_video.h
+++ b/src/radeon_video.h
@@ -77,6 +77,9 @@ typedef struct {
 
    Bool          doubleBuffer;
    unsigned char currentBuffer;
+#ifdef HAVE_XV_GET_PORT_FILL_AREA
+   Bool          colorKeyChanged;
+#endif
    RegionRec     clip;
    uint32_t      colorKey;
    uint32_t      videoStatus;
-- 
1.7.0.4



More information about the xorg-driver-ati mailing list