From 60e4e009f90543bfd57f6a4e51ebc5b32b4af33b Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 20 Oct 2012 17:59:45 +0100 Subject: [PATCH] sna: Move the source region to the CPU for a self-copy fallback CopyArea Signed-off-by: Chris Wilson --- src/sna/fb/fbblt.c | 2 +- src/sna/sna_accel.c | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/sna/fb/fbblt.c b/src/sna/fb/fbblt.c index d4d20b68..287ea40f 100644 --- a/src/sna/fb/fbblt.c +++ b/src/sna/fb/fbblt.c @@ -270,7 +270,7 @@ fbBlt(FbBits *srcLine, FbStride srcStride, int srcX, int alu, FbBits pm, int bpp, Bool reverse, Bool upsidedown) { - DBG(("%s %dx%d, alu=%d, pm=%d, bpp=%d (reverse=%d, upsidedown=%d)\n", + DBG(("%s %dx%d, alu=%d, pm=%x, bpp=%d (reverse=%d, upsidedown=%d)\n", __FUNCTION__, width, height, alu, pm, bpp, reverse, upsidedown)); if (alu == GXcopy && pm == FB_ALLONES && ((srcX|dstX|width) & 7) == 0) { diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 593eb424..8d2a3f91 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -5016,16 +5016,17 @@ sna_fallback_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc, if (!sna_gc_move_to_cpu(gc, dst, region)) return; + RegionTranslate(region, dx, dy); + if (!sna_drawable_move_region_to_cpu(src, region, MOVE_READ)) + goto out_gc; + RegionTranslate(region, -dx, -dy); + if (src == dst || get_drawable_pixmap(src) == get_drawable_pixmap(dst)) { + DBG(("%s: self-copy\n", __FUNCTION__)); if (!sna_drawable_move_to_cpu(dst, MOVE_WRITE | MOVE_READ)) goto out_gc; } else { - RegionTranslate(region, dx, dy); - if (!sna_drawable_move_region_to_cpu(src, region, MOVE_READ)) - goto out_gc; - RegionTranslate(region, -dx, -dy); - if (!sna_drawable_move_region_to_cpu(dst, region, drawable_gc_flags(dst, gc, false))) goto out_gc; @@ -5051,10 +5052,11 @@ sna_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc, if (gc->planemask == 0) return NULL; - DBG(("%s: src=(%d, %d)x(%d, %d)+(%d, %d) -> dst=(%d, %d)+(%d, %d)\n", + DBG(("%s: src=(%d, %d)x(%d, %d)+(%d, %d) -> dst=(%d, %d)+(%d, %d); alu=%d, pm=%lx\n", __FUNCTION__, src_x, src_y, width, height, src->x, src->y, - dst_x, dst_y, dst->x, dst->y)); + dst_x, dst_y, dst->x, dst->y, + gc->alu, gc->planemask)); if (FORCE_FALLBACK || !ACCEL_COPY_AREA || wedged(sna) || !PM_IS_SOLID(dst, gc->planemask))