summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-04-06 14:27:15 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-04-06 14:21:33 +0100
commit42a84613e34522af885b4b50d6c68ef77e81ffc3 (patch)
treea62566337b1939431914fd1fe0b91f7d680a0cea
parent999aa210ff87919945c673bdd34bae76ac097681 (diff)
sna: Relase the upload cache when overwriting with PutImage
Reported-by: Clemens Eisserer <linuxhippy@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48359 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen3_render.c1
-rw-r--r--src/sna/sna_accel.c21
2 files changed, 21 insertions, 1 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 0d229cda..529884c4 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2499,6 +2499,7 @@ gen3_composite_set_target(struct sna *sna,
kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
priv->gpu_bo = bo;
}
+ assert(priv->gpu_bo->proxy == NULL);
op->dst.bo = priv->gpu_bo;
op->damage = &priv->gpu_damage;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index f1d4d00b..6afd5820 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1032,6 +1032,8 @@ skip_inplace_map:
goto done;
}
+ assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL);
+
if (flags & MOVE_INPLACE_HINT &&
priv->stride && priv->gpu_bo &&
!kgem_bo_map_will_stall(&sna->kgem, priv->gpu_bo) &&
@@ -1772,6 +1774,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box, unsigned int flags)
goto done;
}
}
+ assert(priv->gpu_bo->proxy == NULL);
if ((flags & MOVE_READ) == 0)
sna_damage_subtract_box(&priv->cpu_damage, box);
@@ -1929,6 +1932,12 @@ sna_drawable_use_bo(DrawablePtr drawable,
return NULL;
}
+ if (priv->gpu_bo && priv->gpu_bo->proxy) {
+ kgem_bo_destroy(to_sna_from_pixmap(pixmap), priv->gpu_bo);
+ priv->gpu_bo = NULL;
+ goto use_cpu_bo;
+ }
+
if (DAMAGE_IS_ALL(priv->gpu_damage))
goto use_gpu_bo;
@@ -2320,7 +2329,8 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
goto done;
if (priv->gpu_bo->proxy) {
- assert((flags & MOVE_WRITE) ==0);
+ DBG(("%s: reusing cached upload\n", __FUNCTION__));
+ assert((flags & MOVE_WRITE) == 0);
goto done;
}
@@ -2604,6 +2614,7 @@ sna_put_image_upload_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
return FALSE;
assert(priv->gpu_bo);
+ assert(priv->gpu_bo->proxy == NULL);
if (!priv->pinned && nbox == 1 &&
box->x1 <= 0 && box->y1 <= 0 &&
@@ -2712,6 +2723,12 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
return true;
}
+ if (priv->gpu_bo && priv->gpu_bo->proxy) {
+ DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
+ kgem_bo_destroy(sna, priv->gpu_bo);
+ priv->gpu_bo = NULL;
+ }
+
if (priv->cpu_bo) {
/* If the GPU is currently accessing the CPU pixmap, then
* we will need to wait for that to finish before we can
@@ -3307,6 +3324,7 @@ sna_self_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
goto fallback;
if (priv->gpu_bo) {
+ assert(priv->gpu_bo->proxy == NULL);
if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ)) {
DBG(("%s: fallback - not a pure copy and failed to move dst to GPU\n",
__FUNCTION__));
@@ -3501,6 +3519,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
}
if (dst_priv->gpu_bo && dst_priv->gpu_bo->proxy) {
+ DBG(("%s: discarding cached upload\n", __FUNCTION__));
kgem_bo_destroy(&sna->kgem, dst_priv->gpu_bo);
dst_priv->gpu_bo = NULL;
}