summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-06-02 08:27:59 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-06-02 08:38:21 +0100
commitaffb1f82c1401bac3f54654a342e3b16b8bd374b (patch)
tree3271a368dd6c8897e4e8867d2fdfbdb95cf58494
parente51f984a4c15de42c5bee3aeacee553e2dd4eca0 (diff)
sna/gradient: Reuse old gradient bo if allocation of new fails
Prefer a stall to a crash. Reported-by: Zdenek Kabelac <zkabelac@redhat.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_gradient.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index 0fda6ce3..9ac03288 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -235,6 +235,7 @@ static void
sna_render_finish_solid(struct sna *sna, bool force)
{
struct sna_solid_cache *cache = &sna->render.solid_cache;
+ struct kgem_bo *old;
int i;
DBG(("sna_render_finish_solid(force=%d, domain=%d, busy=%d, dirty=%d)\n",
@@ -253,16 +254,25 @@ sna_render_finish_solid(struct sna *sna, bool force)
kgem_bo_destroy(&sna->kgem, cache->bo[i]);
cache->bo[i] = NULL;
}
- kgem_bo_destroy(&sna->kgem, cache->cache_bo);
+
+ old = cache->cache_bo;
DBG(("sna_render_finish_solid reset\n"));
cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(cache->color), 0);
+ if (cache->cache_bo == NULL) {
+ cache->cache_bo = old;
+ old = NULL;
+ }
+
cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
0, sizeof(uint32_t));
cache->bo[0]->pitch = 4;
if (force)
cache->size = 1;
+
+ if (old)
+ kgem_bo_destroy(&sna->kgem, old);
}
struct kgem_bo *