xserver: Branch 'master'

Keith Packard keithp at kemper.freedesktop.org
Tue Aug 12 15:57:39 PDT 2014


 glamor/glamor_copy.c |   54 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

New commits:
commit 606b701c563c10f01dec147e061fa00cda784a9d
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Aug 6 10:30:25 2014 +0900

    glamor: Add glamor_copy_fbo_cpu() for CopyArea to non-GPU destination
    
    This provides a speedup e.g. when the destination is an SHM pixmap.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76285
    Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/glamor/glamor_copy.c b/glamor/glamor_copy.c
index bfcde43..b84fcf2 100644
--- a/glamor/glamor_copy.c
+++ b/glamor/glamor_copy.c
@@ -233,6 +233,56 @@ bail:
     return FALSE;
 }
 
+/**
+ * Implements CopyArea from the GPU to the CPU using glReadPixels from the
+ * source FBO.
+ */
+static Bool
+glamor_copy_fbo_cpu(DrawablePtr src,
+                    DrawablePtr dst,
+                    GCPtr gc,
+                    BoxPtr box,
+                    int nbox,
+                    int dx,
+                    int dy,
+                    Bool reverse,
+                    Bool upsidedown,
+                    Pixel bitplane,
+                    void *closure)
+{
+    ScreenPtr screen = dst->pScreen;
+    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+    PixmapPtr src_pixmap = glamor_get_drawable_pixmap(src);
+    FbBits *dst_bits;
+    FbStride dst_stride;
+    int dst_bpp;
+    int src_xoff, src_yoff;
+    int dst_xoff, dst_yoff;
+
+    if (gc && gc->alu != GXcopy)
+        goto bail;
+
+    if (gc && !glamor_pm_is_solid(dst, gc->planemask))
+        goto bail;
+
+    glamor_make_current(glamor_priv);
+    glamor_prepare_access(dst, GLAMOR_ACCESS_RW);
+
+    glamor_get_drawable_deltas(src, src_pixmap, &src_xoff, &src_yoff);
+
+    fbGetDrawable(dst, dst_bits, dst_stride, dst_bpp, dst_xoff, dst_yoff);
+
+    glamor_download_boxes(src_pixmap, box, nbox, src_xoff + dx, src_yoff + dy,
+                          dst_xoff, dst_yoff,
+                          (uint8_t *) dst_bits, dst_stride * sizeof (FbBits));
+    glamor_finish_access(dst);
+
+    return TRUE;
+
+bail:
+    return FALSE;
+}
+
 /*
  * Copy from GPU to GPU by using the source
  * as a texture and painting that into the destination
@@ -584,6 +634,10 @@ glamor_copy_gl(DrawablePtr src,
         if (bitplane == 0)
             return glamor_copy_cpu_fbo(src, dst, gc, box, nbox, dx, dy,
                                        reverse, upsidedown, bitplane, closure);
+    } else if (GLAMOR_PIXMAP_PRIV_HAS_FBO(src_priv) &&
+               bitplane == 0) {
+            return glamor_copy_fbo_cpu(src, dst, gc, box, nbox, dx, dy,
+                                       reverse, upsidedown, bitplane, closure);
     }
     return FALSE;
 }


More information about the xorg-commit mailing list