diff options
-rw-r--r-- | src/sna/sna_render.c | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c index 6e95e554..330bfadf 100644 --- a/src/sna/sna_render.c +++ b/src/sna/sna_render.c @@ -523,21 +523,20 @@ static struct kgem_bo *upload(struct sna *sna, priv = sna_pixmap(pixmap); if (priv) { + RegionRec region; + if (priv->cpu_damage == NULL) + return NULL; /* uninitialised */ + + region.extents = *box; + region.data = NULL; + if (!sna_drawable_move_region_to_cpu(&pixmap->drawable, + ®ion, MOVE_READ)) return NULL; - /* As we know this box is on the CPU just fixup the shadow */ - if (priv->mapped) { - pixmap->devPrivate.ptr = NULL; - priv->mapped = false; - } - if (pixmap->devPrivate.ptr == NULL) { - if (priv->ptr == NULL) /* uninitialised */ - return NULL; - assert(priv->stride); - pixmap->devPrivate.ptr = PTR(priv->ptr); - pixmap->devKind = priv->stride; - } + assert(!priv->mapped); + if (pixmap->devPrivate.ptr == NULL) + return NULL; /* uninitialised */ } bo = kgem_upload_source_image(&sna->kgem, @@ -1188,20 +1187,32 @@ sna_render_picture_extract(struct sna *sna, if (src_bo == NULL) { src_bo = move_to_gpu(pixmap, &box, false); if (src_bo == NULL) { + struct sna_pixmap *priv = sna_pixmap(pixmap); + if (priv) { + RegionRec region; + + region.extents = box; + region.data = NULL; + if (!sna_drawable_move_region_to_cpu(&pixmap->drawable, + ®ion, MOVE_READ)) + return 0; + + assert(!priv->mapped); + if (pixmap->devPrivate.ptr == NULL) + return 0; /* uninitialised */ + } + bo = kgem_upload_source_image(&sna->kgem, pixmap->devPrivate.ptr, &box, pixmap->devKind, pixmap->drawable.bitsPerPixel); - if (bo != NULL && + if (priv != NULL && bo != NULL && box.x2 - box.x1 == pixmap->drawable.width && box.y2 - box.y1 == pixmap->drawable.height) { - struct sna_pixmap *priv = sna_pixmap(pixmap); - if (priv) { - assert(priv->gpu_damage == NULL); - assert(priv->gpu_bo == NULL); - kgem_proxy_bo_attach(bo, &priv->gpu_bo); - } + assert(priv->gpu_damage == NULL); + assert(priv->gpu_bo == NULL); + kgem_proxy_bo_attach(bo, &priv->gpu_bo); } } } |