From e9c0e54e69a5ce93bb4e79d56da4a83fddf49c4e Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 11 Aug 2012 08:58:14 +0100 Subject: [PATCH] sna: Handle userptr failures more gracefully Signed-off-by: Chris Wilson --- src/sna/kgem.c | 2 +- src/sna/sna_accel.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 50e0321a..1fdd89c7 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -2190,7 +2190,7 @@ void _kgem_submit(struct kgem *kgem) i, kgem->exec[i].handle, (int)kgem->exec[i].offset, - found ? bytes(found) : -1, + found ? kgem_bo_size(found) : -1, found ? found->tiling : -1, (int)(kgem->exec[i].flags & EXEC_OBJECT_NEEDS_FENCE), found ? found->purged : -1); diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index dc6557a5..517c6985 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -754,9 +754,11 @@ sna_pixmap_create_shm(ScreenPtr screen, struct sna_pixmap *priv; PixmapPtr pixmap; - DBG(("%s(%d, %d, %d)\n", __FUNCTION__, width, height, depth)); + DBG(("%s(%dx%d, depth=%d, bpp=%d, pitch=%d)\n", + __FUNCTION__, width, height, depth, bpp, pitch)); - if (wedged(sna)) { + if (wedged(sna) || bpp == 0) { +fallback: pixmap = sna_pixmap_create_unattached(screen, 0, 0, depth); if (pixmap == NULL) return NULL; @@ -807,19 +809,20 @@ sna_pixmap_create_shm(ScreenPtr screen, } } - priv->cpu_bo = kgem_create_map(&sna->kgem, addr, pitch*height, false); + priv->cpu_bo = kgem_create_map(&sna->kgem, + addr, pitch*(height-1)+width*bpp/8, + false); if (priv->cpu_bo == NULL) { - free(priv); - FreePixmap(pixmap); - return GetScratchPixmapHeader(screen, width, height, depth, - bpp, pitch, addr); + priv->header = true; + sna_pixmap_destroy(pixmap); + goto fallback; } priv->cpu_bo->flush = true; priv->cpu_bo->pitch = pitch; sna_accel_watch_flush(sna, 1); + priv->cpu = true; priv->shm = true; - priv->header = true; sna_damage_all(&priv->cpu_damage, width, height); pixmap->devKind = pitch;