From: Pauli Nieminen <[email protected]>

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 <[email protected]>
---

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

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to