[g3dvl] make reset_dirty_area a public interface
authorChristian König <deathsimple@vodafone.de>
Wed, 27 Apr 2011 13:28:13 +0000 (15:28 +0200)
committerChristian König <deathsimple@vodafone.de>
Wed, 27 Apr 2011 13:28:13 +0000 (15:28 +0200)
src/gallium/auxiliary/vl/vl_compositor.c
src/gallium/include/pipe/p_video_context.h
src/gallium/state_trackers/xorg/xvmc/surface.c

index f6f7b65fd6b804b5c911785a443b9fa1f243f0d2..c13e69d53d1628cc479da9fafbd1101a671e2fca 100644 (file)
@@ -713,6 +713,7 @@ vl_compositor_init(struct pipe_video_context *vpipe, struct pipe_context *pipe)
    compositor->base.context = vpipe;
    compositor->base.destroy = vl_compositor_destroy;
    compositor->base.set_csc_matrix = vl_compositor_set_csc_matrix;
+   compositor->base.reset_dirty_area = vl_compositor_reset_dirty_area;
    compositor->base.clear_layers = vl_compositor_clear_layers;
    compositor->base.set_buffer_layer = vl_compositor_set_buffer_layer;
    compositor->base.set_palette_layer = vl_compositor_set_palette_layer;
index 41f2e320580ae37b37e31377cf4043fe0687e6d5..933b377a0c30e693294acb3be0ed3dca2598ac3b 100644 (file)
@@ -264,6 +264,11 @@ struct pipe_video_compositor
     */
    void (*set_csc_matrix)(struct pipe_video_compositor *compositor, const float mat[16]);
 
+   /**
+    * reset dirty area, so it's cleared with the clear colour
+    */
+   void (*reset_dirty_area)(struct pipe_video_compositor *compositor);
+
    /**
     * set overlay samplers
     */
index 7819fe0777b42f8517375827fc72f23ea1163984..da41a182164be9552f6c5b2d28c53df50a3937f8 100644 (file)
@@ -500,20 +500,26 @@ Status XvMCPutSurface(Display *dpy, XvMCSurface *surface, Drawable drawable,
    context = surface_priv->context;
    context_priv = context->privData;
 
+   assert(flags == XVMC_TOP_FIELD || flags == XVMC_BOTTOM_FIELD || flags == XVMC_FRAME_PICTURE);
+   assert(srcx + srcw - 1 < surface->width);
+   assert(srcy + srch - 1 < surface->height);
+
+   subpicture_priv = surface_priv->subpicture ? surface_priv->subpicture->privData : NULL;
+   vpipe = context_priv->vctx->vpipe;
+   compositor = context_priv->compositor;
+
    if (!context_priv->drawable_surface ||
        context_priv->dst_rect.x != dst_rect.x || context_priv->dst_rect.y != dst_rect.y ||
        context_priv->dst_rect.w != dst_rect.w || context_priv->dst_rect.h != dst_rect.h) {
 
       context_priv->drawable_surface = vl_drawable_surface_get(context_priv->vctx, drawable);
       context_priv->dst_rect = dst_rect;
+      compositor->reset_dirty_area(compositor);
    }
 
    if (!context_priv->drawable_surface)
       return BadDrawable;
 
-   assert(flags == XVMC_TOP_FIELD || flags == XVMC_BOTTOM_FIELD || flags == XVMC_FRAME_PICTURE);
-   assert(srcx + srcw - 1 < surface->width);
-   assert(srcy + srch - 1 < surface->height);
    /*
     * Some apps (mplayer) hit these asserts because they call
     * this function after the window has been resized by the WM
@@ -526,10 +532,6 @@ Status XvMCPutSurface(Display *dpy, XvMCSurface *surface, Drawable drawable,
    assert(desty + desth - 1 < drawable_surface->height);
     */
 
-   subpicture_priv = surface_priv->subpicture ? surface_priv->subpicture->privData : NULL;
-   vpipe = context_priv->vctx->vpipe;
-   compositor = context_priv->compositor;
-
    unmap_and_flush_surface(surface_priv);
 
    compositor->clear_layers(compositor);