[PATCH 8/8] glamor: Share code for put_image handling.

Eric Anholt eric at anholt.net
Mon May 5 13:09:13 PDT 2014


The difference between the two is that XF86 has the clip helper that
lets you upload less data when rendering video that's clipped.  I
don't think that's really worth the trouble, especially in a world of
compositors, so I've dropped it to get to shared code.

It turns out the clipping code was broken on xf86-video-intel anyway.
To reproduce, run without a compositor, and use another window to clip
the top half of your XV output on the glamor XV adaptor: the rendering
got confused about which half of the window was being drawn to.

Signed-off-by: Eric Anholt <eric at anholt.net>
---
 glamor/glamor_priv.h                   |  12 ++++
 glamor/glamor_xv.c                     | 104 ++++++++++++++++++++++++++++++
 hw/kdrive/ephyr/ephyr_glamor_xv.c      |  95 ++-------------------------
 hw/xfree86/glamor_egl/glamor_xf86_xv.c | 114 ++-------------------------------
 4 files changed, 128 insertions(+), 197 deletions(-)

diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index dfa2cfa..003fe7e 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -1051,6 +1051,18 @@ int glamor_xv_get_port_attribute(glamor_port_private *port_priv,
 int glamor_xv_query_image_attributes(int id,
                                      unsigned short *w, unsigned short *h,
                                      int *pitches, int *offsets);
+int glamor_xv_put_image(glamor_port_private *port_priv,
+                        DrawablePtr pDrawable,
+                        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 id,
+                        unsigned char *buf,
+                        short width,
+                        short height,
+                        Bool sync,
+                        RegionPtr clipBoxes);
 void glamor_xv_core_init(ScreenPtr screen);
 void glamor_xv_render(glamor_port_private *port_priv);
 
diff --git a/glamor/glamor_xv.c b/glamor/glamor_xv.c
index 4aaa866..1e8bdb8 100644
--- a/glamor/glamor_xv.c
+++ b/glamor/glamor_xv.c
@@ -380,6 +380,110 @@ glamor_xv_render(glamor_port_private *port_priv)
     DamageDamageRegion(port_priv->pDraw, &port_priv->clip);
 }
 
+int
+glamor_xv_put_image(glamor_port_private *port_priv,
+                    DrawablePtr pDrawable,
+                    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 id,
+                    unsigned char *buf,
+                    short width,
+                    short height,
+                    Bool sync,
+                    RegionPtr clipBoxes)
+{
+    ScreenPtr pScreen = pDrawable->pScreen;
+    int srcPitch, srcPitch2;
+    int top, nlines;
+    int s2offset, s3offset, tmp;
+
+    s2offset = s3offset = srcPitch2 = 0;
+
+    srcPitch = width;
+    srcPitch2 = width >> 1;
+
+    if (!port_priv->src_pix[0] ||
+        (width != port_priv->src_pix_w || height != port_priv->src_pix_h)) {
+        int i;
+
+        for (i = 0; i < 3; i++)
+            if (port_priv->src_pix[i])
+                glamor_destroy_pixmap(port_priv->src_pix[i]);
+
+        port_priv->src_pix[0] =
+            glamor_create_pixmap(pScreen, width, height, 8, 0);
+        port_priv->src_pix[1] =
+            glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, 0);
+        port_priv->src_pix[2] =
+            glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, 0);
+        port_priv->src_pix_w = width;
+        port_priv->src_pix_h = height;
+
+        if (!port_priv->src_pix[0] || !port_priv->src_pix[1] ||
+            !port_priv->src_pix[2])
+            return BadAlloc;
+    }
+
+    top = (src_y) & ~1;
+    nlines = (src_y + height) - top;
+
+    switch (id) {
+    case FOURCC_YV12:
+    case FOURCC_I420:
+        s2offset = srcPitch * height;
+        s3offset = s2offset + (srcPitch2 * ((height + 1) >> 1));
+        s2offset += ((top >> 1) * srcPitch2);
+        s3offset += ((top >> 1) * srcPitch2);
+        if (id == FOURCC_YV12) {
+            tmp = s2offset;
+            s2offset = s3offset;
+            s3offset = tmp;
+        }
+        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[0],
+                                            0, 0, srcPitch, nlines,
+                                            port_priv->src_pix[0]->devKind,
+                                            buf + (top * srcPitch), 0);
+
+        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[1],
+                                            0, 0, srcPitch2, (nlines + 1) >> 1,
+                                            port_priv->src_pix[1]->devKind,
+                                            buf + s2offset, 0);
+
+        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[2],
+                                            0, 0, srcPitch2, (nlines + 1) >> 1,
+                                            port_priv->src_pix[2]->devKind,
+                                            buf + s3offset, 0);
+        break;
+    default:
+        return BadMatch;
+    }
+
+    if (pDrawable->type == DRAWABLE_WINDOW)
+        port_priv->pPixmap = pScreen->GetWindowPixmap((WindowPtr) pDrawable);
+    else
+        port_priv->pPixmap = (PixmapPtr) pDrawable;
+
+    if (!RegionEqual(&port_priv->clip, clipBoxes)) {
+        RegionCopy(&port_priv->clip, clipBoxes);
+    }
+
+    port_priv->src_x = src_x;
+    port_priv->src_y = src_y;
+    port_priv->src_w = src_w;
+    port_priv->src_h = src_h;
+    port_priv->dst_w = drw_w;
+    port_priv->dst_h = drw_h;
+    port_priv->drw_x = drw_x;
+    port_priv->drw_y = drw_y;
+    port_priv->w = width;
+    port_priv->h = height;
+    port_priv->pDraw = pDrawable;
+    glamor_xv_render(port_priv);
+    return Success;
+}
+
 void
 glamor_xv_init_port(glamor_port_private *port_priv)
 {
diff --git a/hw/kdrive/ephyr/ephyr_glamor_xv.c b/hw/kdrive/ephyr/ephyr_glamor_xv.c
index 3fc9747..b9c3464 100644
--- a/hw/kdrive/ephyr/ephyr_glamor_xv.c
+++ b/hw/kdrive/ephyr/ephyr_glamor_xv.c
@@ -97,95 +97,12 @@ ephyr_glamor_xv_put_image(KdScreenInfo *screen,
                           Bool sync,
                           RegionPtr clipBoxes, void *data)
 {
-    ScreenPtr pScreen = pDrawable->pScreen;
-    glamor_port_private *port_priv = (glamor_port_private *) data;
-    int srcPitch, srcPitch2;
-    int top, nlines;
-    int s2offset, s3offset, tmp;
-
-    s2offset = s3offset = srcPitch2 = 0;
-
-    srcPitch = width;
-    srcPitch2 = width >> 1;
-
-    if (!port_priv->src_pix[0] ||
-        (width != port_priv->src_pix_w || height != port_priv->src_pix_h)) {
-        int i;
-
-        for (i = 0; i < 3; i++)
-            if (port_priv->src_pix[i])
-                glamor_destroy_pixmap(port_priv->src_pix[i]);
-
-        port_priv->src_pix[0] =
-            glamor_create_pixmap(pScreen, width, height, 8, 0);
-        port_priv->src_pix[1] =
-            glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, 0);
-        port_priv->src_pix[2] =
-            glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, 0);
-        port_priv->src_pix_w = width;
-        port_priv->src_pix_h = height;
-
-        if (!port_priv->src_pix[0] || !port_priv->src_pix[1] ||
-            !port_priv->src_pix[2])
-            return BadAlloc;
-    }
-
-    top = (src_y) & ~1;
-    nlines = (src_y + height) - top;
-
-    switch (id) {
-    case FOURCC_YV12:
-    case FOURCC_I420:
-        s2offset = srcPitch * height;
-        s3offset = s2offset + (srcPitch2 * ((height + 1) >> 1));
-        s2offset += ((top >> 1) * srcPitch2);
-        s3offset += ((top >> 1) * srcPitch2);
-        if (id == FOURCC_YV12) {
-            tmp = s2offset;
-            s2offset = s3offset;
-            s3offset = tmp;
-        }
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[0],
-                                            0, 0, srcPitch, nlines,
-                                            port_priv->src_pix[0]->devKind,
-                                            buf + (top * srcPitch), 0);
-
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[1],
-                                            0, 0, srcPitch2, (nlines + 1) >> 1,
-                                            port_priv->src_pix[1]->devKind,
-                                            buf + s2offset, 0);
-
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[2],
-                                            0, 0, srcPitch2, (nlines + 1) >> 1,
-                                            port_priv->src_pix[2]->devKind,
-                                            buf + s3offset, 0);
-        break;
-    default:
-        return BadMatch;
-    }
-
-    if (pDrawable->type == DRAWABLE_WINDOW)
-        port_priv->pPixmap = pScreen->GetWindowPixmap((WindowPtr) pDrawable);
-    else
-        port_priv->pPixmap = (PixmapPtr) pDrawable;
-
-    if (!RegionEqual(&port_priv->clip, clipBoxes)) {
-        RegionCopy(&port_priv->clip, clipBoxes);
-    }
-
-    port_priv->src_x = src_x;
-    port_priv->src_y = src_y;
-    port_priv->src_w = src_w;
-    port_priv->src_h = src_h;
-    port_priv->dst_w = drw_w;
-    port_priv->dst_h = drw_h;
-    port_priv->drw_x = drw_x;
-    port_priv->drw_y = drw_y;
-    port_priv->w = width;
-    port_priv->h = height;
-    port_priv->pDraw = pDrawable;
-    glamor_xv_render(port_priv);
-    return Success;
+    return glamor_xv_put_image(data, pDrawable,
+                               src_x, src_y,
+                               drw_x, drw_y,
+                               src_w, src_h,
+                               drw_w, drw_h,
+                               id, buf, width, height, sync, clipBoxes);
 }
 
 void
diff --git a/hw/xfree86/glamor_egl/glamor_xf86_xv.c b/hw/xfree86/glamor_egl/glamor_xf86_xv.c
index a54c9a9..8535fa0 100644
--- a/hw/xfree86/glamor_egl/glamor_xf86_xv.c
+++ b/hw/xfree86/glamor_egl/glamor_xf86_xv.c
@@ -106,114 +106,12 @@ glamor_xf86_xv_put_image(ScrnInfoPtr pScrn,
                     Bool sync,
                     RegionPtr clipBoxes, void *data, DrawablePtr pDrawable)
 {
-    ScreenPtr screen = pDrawable->pScreen;
-    glamor_port_private *port_priv = (glamor_port_private *) data;
-    INT32 x1, x2, y1, y2;
-    int srcPitch, srcPitch2;
-    BoxRec dstBox;
-    int top, nlines;
-    int s2offset, s3offset, tmp;
-
-    s2offset = s3offset = srcPitch2 = 0;
-
-    /* Clip */
-    x1 = src_x;
-    x2 = src_x + src_w;
-    y1 = src_y;
-    y2 = src_y + src_h;
-
-    dstBox.x1 = drw_x;
-    dstBox.x2 = drw_x + drw_w;
-    dstBox.y1 = drw_y;
-    dstBox.y2 = drw_y + drw_h;
-    if (!xf86XVClipVideoHelper
-        (&dstBox, &x1, &x2, &y1, &y2, clipBoxes, width, height))
-        return Success;
-
-    if ((x1 >= x2) || (y1 >= y2))
-        return Success;
-
-    srcPitch = width;
-    srcPitch2 = width >> 1;
-
-    if (!port_priv->src_pix[0] ||
-        (width != port_priv->src_pix_w || height != port_priv->src_pix_h)) {
-        int i;
-
-        for (i = 0; i < 3; i++)
-            if (port_priv->src_pix[i])
-                glamor_destroy_pixmap(port_priv->src_pix[i]);
-
-        port_priv->src_pix[0] =
-            glamor_create_pixmap(screen, width, height, 8, 0);
-        port_priv->src_pix[1] =
-            glamor_create_pixmap(screen, width >> 1, height >> 1, 8, 0);
-        port_priv->src_pix[2] =
-            glamor_create_pixmap(screen, width >> 1, height >> 1, 8, 0);
-        port_priv->src_pix_w = width;
-        port_priv->src_pix_h = height;
-
-        if (!port_priv->src_pix[0] || !port_priv->src_pix[1] ||
-            !port_priv->src_pix[2])
-            return BadAlloc;
-    }
-
-    top = (y1 >> 16) & ~1;
-    nlines = ((y2 + 0xffff) >> 16) - top;
-
-    switch (id) {
-    case FOURCC_YV12:
-    case FOURCC_I420:
-        s2offset = srcPitch * height;
-        s3offset = s2offset + (srcPitch2 * ((height + 1) >> 1));
-        s2offset += ((top >> 1) * srcPitch2);
-        s3offset += ((top >> 1) * srcPitch2);
-        if (id == FOURCC_YV12) {
-            tmp = s2offset;
-            s2offset = s3offset;
-            s3offset = tmp;
-        }
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[0],
-                                            0, 0, srcPitch, nlines,
-                                            port_priv->src_pix[0]->devKind,
-                                            buf + (top * srcPitch), 0);
-
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[1],
-                                            0, 0, srcPitch2, (nlines + 1) >> 1,
-                                            port_priv->src_pix[1]->devKind,
-                                            buf + s2offset, 0);
-
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[2],
-                                            0, 0, srcPitch2, (nlines + 1) >> 1,
-                                            port_priv->src_pix[2]->devKind,
-                                            buf + s3offset, 0);
-        break;
-    default:
-        return BadMatch;
-    }
-
-    if (pDrawable->type == DRAWABLE_WINDOW)
-        port_priv->pPixmap = (*screen->GetWindowPixmap) ((WindowPtr) pDrawable);
-    else
-        port_priv->pPixmap = (PixmapPtr) pDrawable;
-
-    if (!RegionEqual(&port_priv->clip, clipBoxes)) {
-        RegionCopy(&port_priv->clip, clipBoxes);
-    }
-
-    port_priv->src_x = src_x;
-    port_priv->src_y = src_y;
-    port_priv->src_w = src_w;
-    port_priv->src_h = src_h;
-    port_priv->dst_w = drw_w;
-    port_priv->dst_h = drw_h;
-    port_priv->drw_x = drw_x;
-    port_priv->drw_y = drw_y;
-    port_priv->w = width;
-    port_priv->h = height;
-    port_priv->pDraw = pDrawable;
-    glamor_xv_render(port_priv);
-    return Success;
+    return glamor_xv_put_image(data, pDrawable,
+                               src_x, src_y,
+                               drw_x, drw_y,
+                               src_w, src_h,
+                               drw_w, drw_h,
+                               id, buf, width, height, sync, clipBoxes);
 }
 
 static XF86VideoEncodingRec DummyEncodingGLAMOR[1] = {
-- 
1.9.2



More information about the xorg-devel mailing list