summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sna/sna_accel.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 69a151c2..1663fe3c 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4861,6 +4861,22 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
}
}
+ if (src_priv) {
+ bool ret;
+
+ RegionTranslate(region, src_dx, src_dy);
+ ret = sna_drawable_move_region_to_cpu(&src_pixmap->drawable,
+ region, MOVE_READ);
+ RegionTranslate(region, -src_dx, -src_dy);
+ if (!ret)
+ goto fallback;
+
+ assert(!src_priv->mapped);
+ if (src_pixmap->devPrivate.ptr == NULL)
+ /* uninitialised!*/
+ return;
+ }
+
if (alu != GXcopy) {
PixmapPtr tmp;
struct kgem_bo *src_bo;
@@ -4936,21 +4952,6 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
DBG(("%s: dst is on the GPU, src is on the CPU, uploading into dst\n",
__FUNCTION__));
- if (src_priv) {
- /* Fixup the shadow pointer as necessary */
- if (src_priv->mapped) {
- assert(!src_priv->shm);
- src_pixmap->devPrivate.ptr = NULL;
- src_priv->mapped = false;
- }
- if (src_pixmap->devPrivate.ptr == NULL) {
- if (!src_priv->ptr) /* uninitialised!*/
- return;
- src_pixmap->devPrivate.ptr = PTR(src_priv->ptr);
- src_pixmap->devKind = src_priv->stride;
- }
- }
-
if (!dst_priv->pinned && replaces) {
stride = src_pixmap->devKind;
bits = src_pixmap->devPrivate.ptr;