[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-vmware: Changes to 'upstream-experimental'



 configure.ac       |   12 ++
 src/svga_overlay.h |    9 +-
 src/svga_reg.h     |   83 +++++++++++---------
 src/vmware.c       |  191 +++++++++++++++++++++++++++++++++++------------
 src/vmware.h       |   15 +++
 src/vmwarectrl.c   |    1 
 src/vmwarevideo.c  |  214 +++++++++++++++++++++++++++++++++++------------------
 7 files changed, 362 insertions(+), 163 deletions(-)

New commits:
commit 1bbef3aa7ab15ee93cd4cd47c3d484ac91f0440d
Author: Philip Langdale <philipl@fido2.homeip.net>
Date:   Tue Aug 19 11:23:44 2008 -0700

    Bump version for 10.16.5 release.

diff --git a/configure.ac b/configure.ac
index 7f56e95..cb49532 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,7 +22,7 @@
 
 AC_PREREQ(2.57)
 AC_INIT([xf86-video-vmware],
-        10.16.4,
+        10.16.5,
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         xf86-video-vmware)
 
diff --git a/src/vmware.c b/src/vmware.c
index cff4715..19b63df 100644
--- a/src/vmware.c
+++ b/src/vmware.c
@@ -83,7 +83,7 @@ char rcsId_vmware[] =
 #define VMWARE_DRIVER_NAME "vmware"
 #define VMWARE_MAJOR_VERSION	10
 #define VMWARE_MINOR_VERSION	16
-#define VMWARE_PATCHLEVEL	4
+#define VMWARE_PATCHLEVEL	5
 #define VMWARE_DRIVER_VERSION \
    (VMWARE_MAJOR_VERSION * 65536 + VMWARE_MINOR_VERSION * 256 + VMWARE_PATCHLEVEL)
 #define VMWARE_DRIVER_VERSION_STRING \

commit 6ea8e5000519865dd936cfe82d67efc7d107a28c
Author: Bankim Bhavsar <bbhavsar@vmware.com>
Date:   Tue Aug 19 11:23:02 2008 -0700

    Add RegionEqual function for older XFree86 versions.
    
    Fixes bug : http://bugzilla.eng.vmware.com/show_bug.cgi?id=312853
    
    When we added AUTOPAINT_COLORKEY capability to our VMware video driver,
    region functions were used to keep track of colorkey painting.
    
    REGION_EQUAL was one of them.
    
    Unfortunately REGION_EQUAL was not present in regionstr.h shipped with XFree86 version
    4.3.0.
    This version is used by TurboLinux 10; causing X server to crash while playing videos.
    
    REGION_EQUAL was added in revision 1.8 of regionstr.h and available for xfree86 version
    4.3.99
    onwards.
    Reference:
    http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/include/regionstr.h.diff?r1=1.7&r2=1.8
    
    When I compiled the existing code(without my change), I see a warning was generated
    indicating REGION_EQUAL is not present.
    Too bad we missed it.
    
    This patch includes
    1) Slightly modified version of miRegionEqual from miRegion.c
    2) Some formating cleanup.

diff --git a/src/vmware.c b/src/vmware.c
index c2b72e8..cff4715 100644
--- a/src/vmware.c
+++ b/src/vmware.c
@@ -1447,6 +1447,59 @@ VMWAREAddDisplayMode(ScrnInfoPtr pScrn,
 }
 
 
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * vmwareIsRegionEqual --
+ *
+ *    This function implements REGION_EQUAL because older versions of
+ *    regionstr.h don't define it.
+ *    It is a slightly modified version of miRegionEqual from $Xorg: miregion.c
+ *
+ * Results:
+ *    TRUE if regions are equal; FALSE otherwise
+ *
+ * Side effects:
+ *    None.
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+Bool
+vmwareIsRegionEqual(const RegionPtr reg1,
+                    const RegionPtr reg2)
+{
+    int i, num;
+    BoxPtr rects1, rects2;
+
+    if ((reg1->extents.x1 != reg2->extents.x1) ||
+        (reg1->extents.x2 != reg2->extents.x2) ||
+        (reg1->extents.y1 != reg2->extents.y1) ||
+        (reg1->extents.y2 != reg2->extents.y2)) {
+        return FALSE;
+    }
+
+    num = REGION_NUM_RECTS(reg1);
+    if (num != REGION_NUM_RECTS(reg2)) {
+        return FALSE;
+    }
+
+    rects1 = REGION_RECTS(reg1);
+    rects2 = REGION_RECTS(reg2);
+
+    for (i = 0; i < num; i++) {
+        if ((rects1[i].x1 != rects2[i].x1) ||
+            (rects1[i].x2 != rects2[i].x2) ||
+            (rects1[i].y1 != rects2[i].y1) ||
+            (rects1[i].y2 != rects2[i].y2)) {
+            return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
+
 #if VMWARE_DRIVER_FUNC
 static Bool
 VMWareDriverFunc(ScrnInfoPtr pScrn,
diff --git a/src/vmware.h b/src/vmware.h
index bb1234d..3cad89d 100644
--- a/src/vmware.h
+++ b/src/vmware.h
@@ -243,6 +243,11 @@ DisplayModeRec *VMWAREAddDisplayMode(
     int height
    );
 
+Bool vmwareIsRegionEqual(
+    const RegionPtr reg1,
+    const RegionPtr reg2
+   );
+
 /* vmwarecurs.c */
 Bool vmwareCursorInit(
    ScreenPtr pScr
diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c
index 59c25fe..8522383 100644
--- a/src/vmwarevideo.c
+++ b/src/vmwarevideo.c
@@ -393,7 +393,8 @@ vmwareOffscreenFree(VMWAREOffscreenPtr memptr)
  *-----------------------------------------------------------------------------
  */
 
-Bool vmwareVideoEnabled(VMWAREPtr pVMWARE)
+Bool
+vmwareVideoEnabled(VMWAREPtr pVMWARE)
 {
     return ((pVMWARE->vmwareCapability & SVGA_CAP_EXTENDED_FIFO) &&
             (pVMWARE->vmwareFIFO[SVGA_FIFO_CAPABILITIES] &
@@ -418,7 +419,8 @@ Bool vmwareVideoEnabled(VMWAREPtr pVMWARE)
  *-----------------------------------------------------------------------------
  */
 
-Bool vmwareVideoInit(ScreenPtr pScreen)
+Bool
+vmwareVideoInit(ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = infoFromScreen(pScreen);
     XF86VideoAdaptorPtr *overlayAdaptors, *newAdaptors = NULL;
@@ -486,7 +488,8 @@ Bool vmwareVideoInit(ScreenPtr pScreen)
  *-----------------------------------------------------------------------------
  */
 
-void vmwareVideoEnd(ScreenPtr pScreen)
+void
+vmwareVideoEnd(ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = infoFromScreen(pScreen);
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
@@ -526,7 +529,8 @@ void vmwareVideoEnd(ScreenPtr pScreen)
  *-----------------------------------------------------------------------------
  */
 
-static XF86VideoAdaptorPtr vmwareVideoSetup(ScrnInfoPtr pScrn)
+static XF86VideoAdaptorPtr
+vmwareVideoSetup(ScrnInfoPtr pScrn)
 {
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
     XF86VideoAdaptorPtr adaptor;
@@ -614,12 +618,13 @@ static XF86VideoAdaptorPtr vmwareVideoSetup(ScrnInfoPtr pScrn)
  *-----------------------------------------------------------------------------
  */
 
-static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
-                                 short src_x, short src_y, short drw_x,
-                                 short drw_y, short src_w, short src_h,
-                                 short drw_w, short drw_h, int format,
-                                 unsigned char *buf, short width,
-                                 short height, RegionPtr clipBoxes)
+static int
+vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
+                      short src_x, short src_y, short drw_x,
+                      short drw_y, short src_w, short src_h,
+                      short drw_w, short drw_h, int format,
+                      unsigned char *buf, short width,
+                      short height, RegionPtr clipBoxes)
 {
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
     int i;
@@ -689,9 +694,10 @@ static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
  *-----------------------------------------------------------------------------
  */
 
-static int vmwareVideoInitAttributes(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
-                                     int format, unsigned short width,
-                                     unsigned short height)
+static int
+vmwareVideoInitAttributes(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
+                          int format, unsigned short width,
+                          unsigned short height)
 {
     int size;
     VMWAREVideoFmtData *fmtData;
@@ -732,12 +738,13 @@ static int vmwareVideoInitAttributes(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
  *-----------------------------------------------------------------------------
  */
 
-static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
-                           short src_x, short src_y, short drw_x,
-                           short drw_y, short src_w, short src_h,
-                           short drw_w, short drw_h, int format,
-                           unsigned char *buf, short width,
-                           short height, RegionPtr clipBoxes)
+static int
+vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
+                short src_x, short src_y, short drw_x,
+                short drw_y, short src_w, short src_h,
+                short drw_w, short drw_h, int format,
+                unsigned char *buf, short width,
+                short height, RegionPtr clipBoxes)
 {
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
     uint32 *fifoItem;
@@ -823,10 +830,10 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
         vmwareWriteWordToFIFO(pVMWARE, fifoItem[i]);
     }
 
-    /* 
+    /*
      *  Update the clipList and paint the colorkey, if required.
      */
-    if (!REGION_EQUAL(pScrn->pScreen, &pVid->clipBoxes, clipBoxes)) {
+    if (!vmwareIsRegionEqual(&pVid->clipBoxes, clipBoxes)) {
         REGION_COPY(pScrn->pScreen, &pVid->clipBoxes, clipBoxes);
         if (pVid->isAutoPaintColorkey) {
             xf86XVFillKeyHelper(pScrn->pScreen, pVid->colorKey, clipBoxes);
@@ -858,7 +865,8 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
  *-----------------------------------------------------------------------------
  */
 
-static void vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId)
+static void
+vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId)
 {
     struct PACKED _body {
         uint32 escape;
@@ -904,8 +912,9 @@ static void vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId)
  *-----------------------------------------------------------------------------
  */
 
-static void vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
-                                 uint32 regId, uint32 value)
+static void
+vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
+                     uint32 regId, uint32 value)
 {
     struct PACKED _item {
         uint32 regId;
@@ -960,7 +969,8 @@ static void vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
  *-----------------------------------------------------------------------------
  */
 
-static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
+static void
+vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
 {
     uint32 id, colorKey, flags;
     Bool isAutoPaintColorkey;
@@ -1019,18 +1029,20 @@ static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
  */
 
 #ifdef HAVE_XORG_SERVER_1_0_99_901
-static int vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
-                            short drw_x, short drw_y, short src_w, short src_h,
-                            short drw_w, short drw_h, int format,
-                            unsigned char *buf, short width, short height,
-                            Bool sync, RegionPtr clipBoxes, pointer data,
-                            DrawablePtr dst)
+static int
+vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
+                 short drw_x, short drw_y, short src_w, short src_h,
+                 short drw_w, short drw_h, int format,
+                 unsigned char *buf, short width, short height,
+                 Bool sync, RegionPtr clipBoxes, pointer data,
+                 DrawablePtr dst)
 #else
-static int vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
-                            short drw_x, short drw_y, short src_w, short src_h,
-                            short drw_w, short drw_h, int format,
-                            unsigned char *buf, short width, short height,
-                            Bool sync, RegionPtr clipBoxes, pointer data)
+static int
+vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
+                 short drw_x, short drw_y, short src_w, short src_h,
+                 short drw_w, short drw_h, int format,
+                 unsigned char *buf, short width, short height,
+                 Bool sync, RegionPtr clipBoxes, pointer data)
 #endif
 {
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
@@ -1066,7 +1078,8 @@ static int vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
  *-----------------------------------------------------------------------------
  */
 
-static void vmwareStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
+static void
+vmwareStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
 {
     VMWAREVideoPtr pVid = data;
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
@@ -1107,10 +1120,10 @@ static void vmwareStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
  *-----------------------------------------------------------------------------
  */
 
-static int vmwareQueryImageAttributes(ScrnInfoPtr pScrn, int format,
-                                      unsigned short *width,
-                                      unsigned short *height, int *pitches,
-                                      int *offsets)
+static int
+vmwareQueryImageAttributes(ScrnInfoPtr pScrn, int format,
+                           unsigned short *width, unsigned short *height,
+                           int *pitches, int *offsets)
 {
     INT32 size, tmp;
 
@@ -1184,8 +1197,9 @@ static int vmwareQueryImageAttributes(ScrnInfoPtr pScrn, int format,
  *-----------------------------------------------------------------------------
  */
 
-static int vmwareSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
-                                  INT32 value, pointer data)
+static int
+vmwareSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
+                       INT32 value, pointer data)
 {
     VMWAREVideoPtr pVid = (VMWAREVideoPtr) data;
     Atom xvColorKey = MAKE_ATOM("XV_COLORKEY");
@@ -1223,8 +1237,9 @@ static int vmwareSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
  *-----------------------------------------------------------------------------
  */
 
-static int vmwareGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
-                                  INT32 *value, pointer data)
+static int
+vmwareGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
+                       INT32 *value, pointer data)
 {
     VMWAREVideoPtr pVid = (VMWAREVideoPtr) data;
     Atom xvColorKey = MAKE_ATOM("XV_COLORKEY");
@@ -1267,10 +1282,11 @@ static int vmwareGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
  *-----------------------------------------------------------------------------
  */
 
-static void vmwareQueryBestSize(ScrnInfoPtr pScrn, Bool motion,
-                                short vid_w, short vid_h, short drw_w,
-                                short drw_h, unsigned int *p_w,
-                                unsigned int *p_h, pointer data)
+static void
+vmwareQueryBestSize(ScrnInfoPtr pScrn, Bool motion,
+                    short vid_w, short vid_h, short drw_w,
+                    short drw_h, unsigned int *p_w,
+                    unsigned int *p_h, pointer data)
 {
     *p_w = (drw_w + 1) & ~1;
     *p_h = drw_h;

commit 0576b87c27d3d885cc698a3cc013bcfa4021942c
Author: Philip Langdale <philipl@fido2.homeip.net>
Date:   Mon Jul 21 15:26:01 2008 -0700

    Prepare for 10.16.4 release.

diff --git a/configure.ac b/configure.ac
index 665bbc3..7f56e95 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,7 +22,7 @@
 
 AC_PREREQ(2.57)
 AC_INIT([xf86-video-vmware],
-        10.16.3,
+        10.16.4,
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         xf86-video-vmware)
 
diff --git a/src/vmware.c b/src/vmware.c
index 130351b..c2b72e8 100644
--- a/src/vmware.c
+++ b/src/vmware.c
@@ -83,7 +83,7 @@ char rcsId_vmware[] =
 #define VMWARE_DRIVER_NAME "vmware"
 #define VMWARE_MAJOR_VERSION	10
 #define VMWARE_MINOR_VERSION	16
-#define VMWARE_PATCHLEVEL	3
+#define VMWARE_PATCHLEVEL	4
 #define VMWARE_DRIVER_VERSION \
    (VMWARE_MAJOR_VERSION * 65536 + VMWARE_MINOR_VERSION * 256 + VMWARE_PATCHLEVEL)
 #define VMWARE_DRIVER_VERSION_STRING \

commit ad8f17dec71632d0e606af1bea9432ece0bc97db
Author: Philip Langdale <philipl@fido2.homeip.net>
Date:   Mon Jul 21 15:23:50 2008 -0700

    Video Overlay: Handle clipping correctly with AutoPaint colorkey.
    
    We recently added XV_AUTOPAINT_COLORKEY attribute to the X video driver
    to enable applications like Real player that rely on this attribute to
    display video frames in Linux guest.
    
    When this attribute is SET, we paint the colorkey on 1st frame and from
    there on only when the video is moved.
    
    This introduced a bug 305202 with clipping.
    
    Consider a case when the video is playing, obscure the player window
    with another window, without moving the player window, move the other
    window away. The part of the window that was obscured didn't display
    the video.
    
    With this patch instead of relying on the target rectangle, we use
    the clipBoxes supplied in every frame.

diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c
index b4b1183..59c25fe 100644
--- a/src/vmwarevideo.c
+++ b/src/vmwarevideo.c
@@ -165,7 +165,7 @@ struct VMWAREVideoRec {
    uint32             colorKey;
    Bool               isAutoPaintColorkey;
    uint32             flags;
-   BoxRec             position;
+   RegionRec          clipBoxes;
    VMWAREVideoFmtData *fmt_priv;
 };
 
@@ -226,8 +226,6 @@ static void vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId);
 static void vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
                                  uint32 regId, uint32 value);
 static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid);
-static Bool vmwareVideoMoved(VMWAREVideoPtr pVid, short drw_x,
-                             short drw_y, short drw_w, short drw_h);
 
 /*
  * Offscreen memory manager functions
@@ -660,10 +658,7 @@ static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
     }
     pVid->currBuf = 0;
 
-    pVid->position.x1 = drw_x;
-    pVid->position.y1 = drw_y;
-    pVid->position.x2 = drw_w;
-    pVid->position.y2 = drw_h;
+    REGION_COPY(pScrn->pScreen, &pVid->clipBoxes, clipBoxes);
 
     if (pVid->isAutoPaintColorkey) {
         xf86XVFillKeyHelper(pScrn->pScreen, pVid->colorKey, clipBoxes);
@@ -828,21 +823,18 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
         vmwareWriteWordToFIFO(pVMWARE, fifoItem[i]);
     }
 
-    if (pVid->isAutoPaintColorkey &&
-        vmwareVideoMoved(pVid, drw_x, drw_y, drw_w, drw_h)) {
-        xf86XVFillKeyHelper(pScrn->pScreen, pVid->colorKey, clipBoxes);
+    /* 
+     *  Update the clipList and paint the colorkey, if required.
+     */
+    if (!REGION_EQUAL(pScrn->pScreen, &pVid->clipBoxes, clipBoxes)) {
+        REGION_COPY(pScrn->pScreen, &pVid->clipBoxes, clipBoxes);
+        if (pVid->isAutoPaintColorkey) {
+            xf86XVFillKeyHelper(pScrn->pScreen, pVid->colorKey, clipBoxes);
+        }
     }
 
     vmwareVideoFlush(pVMWARE, pVid->streamId);
 
-    /*
-     * Update the position of the video frame.
-     */
-    pVid->position.x1 = drw_x;
-    pVid->position.y1 = drw_y;
-    pVid->position.x2 = drw_w;
-    pVid->position.y2 = drw_h;
-
     pVid->currBuf = ++pVid->currBuf & (VMWARE_VID_NUM_BUFFERS - 1);
 
     return Success;
@@ -1005,32 +997,6 @@ static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
 /*
  *-----------------------------------------------------------------------------
  *
- * vmwareVideoMoved --
- *
- *    Detects whether the video frame has changed its position.
- *
- * Results:
- *    TRUE if the position has changed, FALSE otherwise.
- *
- * Side effects:
- *    None.
- *
- *-----------------------------------------------------------------------------
- */
-
-static Bool vmwareVideoMoved(VMWAREVideoPtr pVid, short drw_x,
-                             short drw_y, short drw_w, short drw_h)
-{
-    return !(pVid->position.x1 == drw_x &&
-             pVid->position.y1 == drw_y &&
-             pVid->position.x2 == drw_w &&
-             pVid->position.y2 == drw_h);
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- *
  * vmwareXvPutImage --
  *
  *    Main video playback function. It copies the passed data which is in

commit 71f1ca515cd1b3d92397682f4fcea120c392b26e
Author: Philip Langdale <philipl@fido2.homeip.net>
Date:   Fri Jul 18 14:03:09 2008 -0700

    Prepare for 10.16.3
    
    Bump up version numbers.

diff --git a/configure.ac b/configure.ac
index 09d70f2..665bbc3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,7 +22,7 @@
 
 AC_PREREQ(2.57)
 AC_INIT([xf86-video-vmware],
-        10.16.2,
+        10.16.3,
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         xf86-video-vmware)
 
diff --git a/src/vmware.c b/src/vmware.c
index e22c038..130351b 100644
--- a/src/vmware.c
+++ b/src/vmware.c
@@ -83,7 +83,7 @@ char rcsId_vmware[] =
 #define VMWARE_DRIVER_NAME "vmware"
 #define VMWARE_MAJOR_VERSION	10
 #define VMWARE_MINOR_VERSION	16
-#define VMWARE_PATCHLEVEL	2
+#define VMWARE_PATCHLEVEL	3
 #define VMWARE_DRIVER_VERSION \
    (VMWARE_MAJOR_VERSION * 65536 + VMWARE_MINOR_VERSION * 256 + VMWARE_PATCHLEVEL)
 #define VMWARE_DRIVER_VERSION_STRING \

commit e7f404938b7ccd4c7e61c71c6c182ca8ee8d875f
Author: Philip Langdale <philipl@fido2.homeip.net>
Date:   Fri Jul 18 13:59:34 2008 -0700

    Video Overlay: Add XV_AUTOPAINT_COLORKEY capability to the Xv extension of Linux guest driver.
    
    Applications use XV_AUTOPAINT_COLORKEY capability to let the driver handle the painting
    of colorkey.
    
    Real Player assumes this capability as ON by default and hence prior to this patch videos
    didn't play with Real player.
    
    With this patch:
    a) If AUTOPAINT_COLORKEY is SET then the driver handles the painting of the colorkey.
    Painting is done on the 1st frame and from there on only if the video frame moves.
    
    b) Adds UYVY fourcc format to keep it consistent with Windows SVGA driver and the host backends.
    
    c) Changes the default colorkey from a pungent GREEN to a darker shade.
    Real Player sets this colorkey and it looks better when the video is moved around.

diff --git a/src/svga_overlay.h b/src/svga_overlay.h
index b312577..46aef9d 100644
--- a/src/svga_overlay.h
+++ b/src/svga_overlay.h
@@ -17,6 +17,7 @@
 
 #define VMWARE_FOURCC_YV12 0x32315659 /* 'Y' 'V' '1' '2' */
 #define VMWARE_FOURCC_YUY2 0x32595559 /* 'Y' 'U' 'Y' '2' */
+#define VMWARE_FOURCC_UYVY 0x59565955 /* 'U' 'Y' 'V' 'Y' */
 
 #define SVGA_ESCAPE_VMWARE_VIDEO             0x00020000
 
diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c
index 04a2894..b4b1183 100644
--- a/src/vmwarevideo.c
+++ b/src/vmwarevideo.c
@@ -59,9 +59,9 @@
 #define VMWARE_VID_NUM_PORTS 1
 
 /*
- * Using green as the default colorKey
+ * Using a dark shade as the default colorKey
  */
-#define VMWARE_VIDEO_COLORKEY 0x00ff00
+#define VMWARE_VIDEO_COLORKEY 0x100701
 
 /*
  * Maximum dimensions
@@ -87,14 +87,15 @@ static XF86VideoFormatRec vmwareVideoFormats[] =
     { 24, TrueColor}
 };
 
-#define VMWARE_VID_NUM_IMAGES 2
+#define VMWARE_VID_NUM_IMAGES 3
 static XF86ImageRec vmwareVideoImages[] =
 {
     XVIMAGE_YV12,
-    XVIMAGE_YUY2
+    XVIMAGE_YUY2,
+    XVIMAGE_UYVY
 };
 
-#define VMWARE_VID_NUM_ATTRIBUTES 1
+#define VMWARE_VID_NUM_ATTRIBUTES 2
 static XF86AttributeRec vmwareVideoAttributes[] =
 {
     {
@@ -102,6 +103,12 @@ static XF86AttributeRec vmwareVideoAttributes[] =
         0x000000,
         0xffffff,
         "XV_COLORKEY"
+    },
+    {
+        XvGettable | XvSettable,
+        0,
+        1,
+        "XV_AUTOPAINT_COLORKEY"
     }
 };
 
@@ -147,7 +154,7 @@ struct VMWAREVideoRec {
    int                (*play)(ScrnInfoPtr, struct VMWAREVideoRec *,
                               short, short, short, short, short,
                               short, short, short, int, unsigned char*,
-                              short, short);
+                              short, short, RegionPtr);
    /*
     * Offscreen memory region used to pass video data to the host.
     */
@@ -156,7 +163,9 @@ struct VMWAREVideoRec {
    uint8              currBuf;
    uint32             size;
    uint32             colorKey;
+   Bool               isAutoPaintColorkey;
    uint32             flags;
+   BoxRec             position;
    VMWAREVideoFmtData *fmt_priv;
 };
 
@@ -202,7 +211,8 @@ static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
                                  short src_x, short src_y, short drw_x,
                                  short drw_y, short src_w, short src_h,
                                  short drw_w, short drw_h, int format,
-                                 unsigned char *buf, short width, short height);
+                                 unsigned char *buf, short width,
+                                 short height, RegionPtr clipBoxes);
 static int vmwareVideoInitAttributes(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
                                      int format, unsigned short width,
                                      unsigned short height);
@@ -211,11 +221,13 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
                            short drw_y, short src_w, short src_h,
                            short drw_w, short drw_h, int format,
                            unsigned char *buf, short width,
-                           short height);
+                           short height, RegionPtr clipBoxes);
 static void vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId);
 static void vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
                                  uint32 regId, uint32 value);
 static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid);
+static Bool vmwareVideoMoved(VMWAREVideoPtr pVid, short drw_x,
+                             short drw_y, short drw_w, short drw_h);
 
 /*
  * Offscreen memory manager functions
@@ -557,6 +569,7 @@ static XF86VideoAdaptorPtr vmwareVideoSetup(ScrnInfoPtr pScrn)
         pPriv[i].play = vmwareVideoInitStream;
         pPriv[i].flags = SVGA_VIDEO_FLAG_COLORKEY;
         pPriv[i].colorKey = VMWARE_VIDEO_COLORKEY;
+        pPriv[i].isAutoPaintColorkey = TRUE;
         adaptor->pPortPrivates[i].ptr = &pPriv[i];
     }
     pVMWARE->videoStreams = du;
@@ -607,7 +620,8 @@ static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
                                  short src_x, short src_y, short drw_x,
                                  short drw_y, short src_w, short src_h,
                                  short drw_w, short drw_h, int format,
-                                 unsigned char *buf, short width, short height)
+                                 unsigned char *buf, short width,
+                                 short height, RegionPtr clipBoxes)
 {
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
     int i;
@@ -646,12 +660,21 @@ static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
     }
     pVid->currBuf = 0;
 
+    pVid->position.x1 = drw_x;
+    pVid->position.y1 = drw_y;
+    pVid->position.x2 = drw_w;
+    pVid->position.y2 = drw_h;
+
+    if (pVid->isAutoPaintColorkey) {
+        xf86XVFillKeyHelper(pScrn->pScreen, pVid->colorKey, clipBoxes);
+    }
+
     VmwareLog(("Got offscreen region, offset %d, size %d "
                "(yuv size in bytes: %d)\n",
                pVid->fbarea->offset, pVid->fbarea->size, pVid->size));
 
     return pVid->play(pScrn, pVid, src_x, src_y, drw_x, drw_y, src_w, src_h,
-                      drw_w, drw_h, format, buf, width, height);
+                      drw_w, drw_h, format, buf, width, height, clipBoxes);
 }
 
 
@@ -719,7 +742,7 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
                            short drw_y, short src_w, short src_h,
                            short drw_w, short drw_h, int format,
                            unsigned char *buf, short width,
-                           short height)
+                           short height, RegionPtr clipBoxes)
 {
     VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
     uint32 *fifoItem;
@@ -759,10 +782,11 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Increase in size of Xv video "
                    "frame streamId:%d.\n", pVid->streamId);
         vmwareStopVideo(pScrn, pVid, TRUE);
-        return pVid->play(pScrn, pVid, src_x, src_y, drw_x, drw_y, src_w, 
-                          src_h, drw_w, drw_h, format, buf, width, height);
+        return pVid->play(pScrn, pVid, src_x, src_y, drw_x, drw_y, src_w,
+                          src_h, drw_w, drw_h, format, buf, width, height,
+                          clipBoxes);
     }
-              
+
     pVid->size = size;
     memcpy(pVid->bufs[pVid->currBuf].data, buf, pVid->size);
 
@@ -804,9 +828,23 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
         vmwareWriteWordToFIFO(pVMWARE, fifoItem[i]);
     }
 
+    if (pVid->isAutoPaintColorkey &&
+        vmwareVideoMoved(pVid, drw_x, drw_y, drw_w, drw_h)) {
+        xf86XVFillKeyHelper(pScrn->pScreen, pVid->colorKey, clipBoxes);
+    }
+
     vmwareVideoFlush(pVMWARE, pVid->streamId);
 
+    /*
+     * Update the position of the video frame.
+     */
+    pVid->position.x1 = drw_x;
+    pVid->position.y1 = drw_y;
+    pVid->position.x2 = drw_w;
+    pVid->position.y2 = drw_h;
+
     pVid->currBuf = ++pVid->currBuf & (VMWARE_VID_NUM_BUFFERS - 1);
+
     return Success;
 }
 
@@ -933,6 +971,7 @@ static void vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
 static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
 {
     uint32 id, colorKey, flags;
+    Bool isAutoPaintColorkey;
 
     if (pVid->fmt_priv) {
         free(pVid->fmt_priv);
@@ -951,11 +990,41 @@ static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
     id = pVid->streamId;
     colorKey = pVid->colorKey;
     flags = pVid->flags;
+    isAutoPaintColorkey = pVid->isAutoPaintColorkey;
+
     memset(pVid, 0, sizeof(*pVid));
+
     pVid->streamId = id;
     pVid->play = vmwareVideoInitStream;
     pVid->colorKey = colorKey;
     pVid->flags = flags;
+    pVid->isAutoPaintColorkey = isAutoPaintColorkey;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * vmwareVideoMoved --
+ *
+ *    Detects whether the video frame has changed its position.
+ *
+ * Results:
+ *    TRUE if the position has changed, FALSE otherwise.
+ *
+ * Side effects:
+ *    None.
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+static Bool vmwareVideoMoved(VMWAREVideoPtr pVid, short drw_x,
+                             short drw_y, short drw_w, short drw_h)
+{
+    return !(pVid->position.x1 == drw_x &&
+             pVid->position.y1 == drw_y &&
+             pVid->position.x2 == drw_w &&
+             pVid->position.y2 == drw_h);
 }
 
 
@@ -1008,7 +1077,7 @@ static int vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
     }
 
     return pVid->play(pScrn, pVid, src_x, src_y, drw_x, drw_y, src_w, src_h,
-                      drw_w, drw_h, format, buf, width, height);
+                      drw_w, drw_h, format, buf, width, height, clipBoxes);
 }
 
 
@@ -1115,6 +1184,7 @@ static int vmwareQueryImageAttributes(ScrnInfoPtr pScrn, int format,
            }
            size += tmp;
            break;
+       case FOURCC_UYVY:
        case FOURCC_YUY2:
            size = *width * 2;
            if (pitches) {
@@ -1153,12 +1223,18 @@ static int vmwareSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
 {
     VMWAREVideoPtr pVid = (VMWAREVideoPtr) data;
     Atom xvColorKey = MAKE_ATOM("XV_COLORKEY");
+    Atom xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY");
 
     if (attribute == xvColorKey) {
+        VmwareLog(("Set colorkey:0x%x\n", value));
         pVid->colorKey = value;
+    } else if (attribute == xvAutoPaint) {
+        VmwareLog(("Set autoPaint: %s\n", value? "TRUE": "FALSE"));
+        pVid->isAutoPaintColorkey = value;
     } else {
         return XvBadAlloc;
     }
+
     return Success;
 }
 
@@ -1186,12 +1262,16 @@ static int vmwareGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
 {
     VMWAREVideoPtr pVid = (VMWAREVideoPtr) data;
     Atom xvColorKey = MAKE_ATOM("XV_COLORKEY");
+    Atom xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY");
 
     if (attribute == xvColorKey) {
         *value = pVid->colorKey;
+    } else if (attribute == xvAutoPaint) {
+        *value = pVid->isAutoPaintColorkey;
     } else {
         return XvBadAlloc;
     }
+
     return Success;
 }
 

commit 0705e7093e42f7a5ae909477150fd5bb416f8da0
Author: Vinay Bondhugula <vinayb@vmware.com>
Date:   Wed Jul 2 21:32:44 2008 -0400

    Trivial fix: Delete ASSERT() statement
    
    Delete the ASSERT() statement that got introduced in the previous check-in.

diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c
index 7cc682d..04a2894 100644
--- a/src/vmwarevideo.c
+++ b/src/vmwarevideo.c
@@ -754,7 +754,6 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
 
     size = vmwareQueryImageAttributes(pScrn, format, &w, &h,
                                       fmtData->pitches, fmtData->offsets);
-    ASSERT(size != -1);
 
     if (size > pVid->size) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Increase in size of Xv video "

commit f4b5158960c3402e18a0fcf0e0211b68b0f0f127
Author: Vinay Bondhugula <vinayb@vmware.com>
Date:   Wed Jul 2 18:17:58 2008 -0400

    Fix video overlay offscreen allocation bug
    
    When Kaffeine player stops a video, it sets the cleanup flag to FALSE and may
    start playing the next video. In its present state the driver does not check or
    clean up the offscreen area. This is a bug as the newer video might need more
    offscreen space for its frame. The fix is to check for the offscreen frame size
    in videoPlay and restart the stream if necessary.

diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c
index a0a7781..7cc682d 100644
--- a/src/vmwarevideo.c
+++ b/src/vmwarevideo.c
@@ -744,7 +744,27 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
 
     struct _cmdSetRegs cmdSetRegs;
     struct _item *items;
+    int size;
+    VMWAREVideoFmtData *fmtData;
+    unsigned short w, h;
+
+    w = width;
+    h = height;
+    fmtData = pVid->fmt_priv;
 
+    size = vmwareQueryImageAttributes(pScrn, format, &w, &h,
+                                      fmtData->pitches, fmtData->offsets);
+    ASSERT(size != -1);
+
+    if (size > pVid->size) {
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Increase in size of Xv video "
+                   "frame streamId:%d.\n", pVid->streamId);
+        vmwareStopVideo(pScrn, pVid, TRUE);
+        return pVid->play(pScrn, pVid, src_x, src_y, drw_x, drw_y, src_w, 
+                          src_h, drw_w, drw_h, format, buf, width, height);
+    }
+              
+    pVid->size = size;
     memcpy(pVid->bufs[pVid->currBuf].data, buf, pVid->size);
 
     cmdSetRegs.cmd = SVGA_CMD_ESCAPE;
@@ -763,8 +783,8 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
         pVid->bufs[pVid->currBuf].dataOffset;
     items[SVGA_VIDEO_SIZE].value = pVid->size;
     items[SVGA_VIDEO_FORMAT].value = format;
-    items[SVGA_VIDEO_WIDTH].value = width;
-    items[SVGA_VIDEO_HEIGHT].value = height;
+    items[SVGA_VIDEO_WIDTH].value = w;
+    items[SVGA_VIDEO_HEIGHT].value = h;
     items[SVGA_VIDEO_SRC_X].value = src_x;
     items[SVGA_VIDEO_SRC_Y].value = src_y;
     items[SVGA_VIDEO_SRC_WIDTH].value = src_w;
@@ -777,7 +797,7 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
     items[SVGA_VIDEO_FLAGS].value = pVid->flags;
 
     for (i = 0, regId = SVGA_VIDEO_PITCH_1; i < 3; i++, regId++) {
-        items[regId].value = pVid->fmt_priv->pitches[i];
+        items[regId].value = fmtData->pitches[i];
     }
 
     fifoItem = (uint32 *) &cmdSetRegs;
@@ -1022,6 +1042,7 @@ static void vmwareStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
         return;
     }
     if (!Cleanup) {
+        VmwareLog(("vmwareStopVideo: Cleanup is FALSE.\n"));
         return;
     }
     vmwareVideoSetOneReg(pVMWARE, pVid->streamId,

commit b53bb2ad4c6f6e378cbf82a98cac917736d62740
Author: Vinay Bondhugula <vinayb@vmware.com>
Date:   Thu Jun 12 17:34:30 2008 -0400


Reply to: