gallium/targets/xorg-vmwgfx: Xv fixes
authorThomas Hellstrom <thellstrom@vmware.com>
Wed, 24 Nov 2010 14:18:15 +0000 (15:18 +0100)
committerThomas Hellstrom <thellstrom@vmware.com>
Wed, 24 Nov 2010 14:23:10 +0000 (15:23 +0100)
Make sure regions are properly updated and that the colorkey painting is
flushed before we update the HW overlay.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
src/gallium/targets/xorg-vmwgfx/vmw_video.c

index 94465e520439daf78b7f127a6d5f3946ae227ba2..719646afaee73c209e5577ef8166c59887c4506e 100644 (file)
@@ -362,8 +362,10 @@ vmw_video_close(struct vmw_customizer *vmw)
        /* make sure the port is stoped as well */
        vmw_xv_stop_video(pScrn, &video->port[i], TRUE);
        vmw_ioctl_unref_stream(vmw, video->port[i].streamId);
+       REGION_UNINIT(pScreen, &video->port[i].clipBoxes);
     }
 
+
     /* XXX: I'm sure this function is missing code for turning off Xv */
 
     free(vmw->video_priv);
@@ -463,6 +465,7 @@ vmw_video_init_adaptor(ScrnInfoPtr pScrn, struct vmw_customizer *vmw)
         video->port[i].flags = SVGA_VIDEO_FLAG_COLORKEY;
         video->port[i].colorKey = VMWARE_VIDEO_COLORKEY;
         video->port[i].isAutoPaintColorkey = TRUE;
+        REGION_NULL(pScrn->pScreen, &video->port[i].clipBoxes);
         adaptor->pPortPrivates[i].ptr = &video->port[i];
     }
 
@@ -553,8 +556,10 @@ vmw_video_port_init(ScrnInfoPtr pScrn, struct vmw_video_port *port,
 
     REGION_COPY(pScrn->pScreen, &port->clipBoxes, clipBoxes);
 
-    if (port->isAutoPaintColorkey)
-        xf86XVFillKeyHelper(pScrn->pScreen, port->colorKey, clipBoxes);
+    if (port->isAutoPaintColorkey) {
+       xf86XVFillKeyHelper(pScrn->pScreen, port->colorKey, clipBoxes);
+       xorg_flush(pScrn->pScreen);
+    }
 
     return port->play(pScrn, port, src_x, src_y, drw_x, drw_y, src_w, src_h,
                       drw_w, drw_h, format, buf, width, height, clipBoxes);
@@ -643,6 +648,7 @@ vmw_video_port_play(ScrnInfoPtr pScrn, struct vmw_video_port *port,
         REGION_COPY(pScrn->pScreen, &port->clipBoxes, clipBoxes);
         if (port->isAutoPaintColorkey) {
             xf86XVFillKeyHelper(pScrn->pScreen, port->colorKey, clipBoxes);
+           xorg_flush(pScrn->pScreen);
         }
     }
 
@@ -865,6 +871,8 @@ vmw_xv_stop_video(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
     if (!vmw->video_priv)
         return;
 
+    REGION_EMPTY(pScrn->pScreen, &port->clipBoxes);
+
     if (!cleanup)
         return;