diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2014-08-06 10:30:25 +0900 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-08-12 15:55:01 -0700 |
commit | 606b701c563c10f01dec147e061fa00cda784a9d (patch) | |
tree | 953b5339ab0a86b55001520a54c609a58d1d4373 /glamor/glamor_copy.c | |
parent | 1e30fc1b99bda040038e4fd56d1b27c686b44c75 (diff) |
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@amd.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'glamor/glamor_copy.c')
-rw-r--r-- | glamor/glamor_copy.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/glamor/glamor_copy.c b/glamor/glamor_copy.c index bfcde43db..b84fcf250 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; } |