The Xv StopVideo callback is not invoked on textured video ports, so
the temporary pixmaps allocated for the video planes are never freed.

Freeing the storage immediately after use is a simple solution to this
problem which doesn't appear to have any visible performance impact.

Signed-off-by: Keith Packard <kei...@keithp.com>
---
 glamor/glamor_xv.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/glamor/glamor_xv.c b/glamor/glamor_xv.c
index 3f3e064..26bdef6 100644
--- a/glamor/glamor_xv.c
+++ b/glamor/glamor_xv.c
@@ -136,6 +136,11 @@ glamor_init_xv_shader(ScreenPtr screen)
 void
 glamor_xv_stop_video(glamor_port_private *port_priv)
 {
+}
+
+static void
+glamor_xv_free_port_data(glamor_port_private *port_priv)
+{
     int i;
 
     for (i = 0; i < 3; i++) {
@@ -144,6 +149,8 @@ glamor_xv_stop_video(glamor_port_private *port_priv)
             port_priv->src_pix[i] = NULL;
         }
     }
+    RegionUninit(&port_priv->clip);
+    RegionNull(&port_priv->clip);
 }
 
 int
@@ -381,6 +388,8 @@ glamor_xv_render(glamor_port_private *port_priv)
     glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
 
     DamageDamageRegion(port_priv->pDraw, &port_priv->clip);
+
+    glamor_xv_free_port_data(port_priv);
 }
 
 int
@@ -468,9 +477,7 @@ glamor_xv_put_image(glamor_port_private *port_priv,
     else
         port_priv->pPixmap = (PixmapPtr) pDrawable;
 
-    if (!RegionEqual(&port_priv->clip, clipBoxes)) {
-        RegionCopy(&port_priv->clip, clipBoxes);
-    }
+    RegionCopy(&port_priv->clip, clipBoxes);
 
     port_priv->src_x = src_x;
     port_priv->src_y = src_y;
-- 
2.0.1

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to