diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-04-06 14:27:15 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-04-06 14:21:33 +0100 |
commit | 42a84613e34522af885b4b50d6c68ef77e81ffc3 (patch) | |
tree | a62566337b1939431914fd1fe0b91f7d680a0cea | |
parent | 999aa210ff87919945c673bdd34bae76ac097681 (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.c | 1 | ||||
-rw-r--r-- | src/sna/sna_accel.c | 21 |
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; } |