diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-06-02 08:27:59 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-06-02 08:38:21 +0100 |
commit | affb1f82c1401bac3f54654a342e3b16b8bd374b (patch) | |
tree | 3271a368dd6c8897e4e8867d2fdfbdb95cf58494 | |
parent | e51f984a4c15de42c5bee3aeacee553e2dd4eca0 (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.c | 12 |
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 * |