From efe3c8ff48738f2a274e1d4514d32499fc4aadbc Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 26 Jul 2012 14:43:33 +0100 Subject: [PATCH] sna: Allow DRI to force allocation of a GPU bo and backing pixmap Signed-off-by: Chris Wilson --- src/sna/sna.h | 1 + src/sna/sna_accel.c | 13 ++++++++++++- src/sna/sna_dri.c | 18 +++++++++++++----- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/sna/sna.h b/src/sna/sna.h index 51a8206a..0db6861c 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -425,6 +425,7 @@ void sna_pixmap_destroy(PixmapPtr pixmap); #define MOVE_SOURCE_HINT 0x10 #define MOVE_WHOLE_HINT 0x20 #define __MOVE_FORCE 0x40 +#define __MOVE_DRI 0x80 struct sna_pixmap *sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags); static inline struct sna_pixmap * diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 4d30c5c9..062ccfed 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -2671,7 +2671,18 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags) priv = sna_pixmap(pixmap); if (priv == NULL) { DBG(("%s: not attached\n", __FUNCTION__)); - return NULL; + if ((flags & __MOVE_DRI) == 0) + return NULL; + + DBG(("%s: forcing the creation on the GPU\n", __FUNCTION__)); + + priv = sna_pixmap_attach(pixmap); + if (priv == NULL) + return NULL; + + sna_damage_all(&priv->cpu_damage, + pixmap->drawable.width, + pixmap->drawable.height); } if (sna_damage_is_all(&priv->gpu_damage, diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c index bdd1f22f..18122671 100644 --- a/src/sna/sna_dri.c +++ b/src/sna/sna_dri.c @@ -154,13 +154,21 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna, struct sna_pixmap *priv; int tiling; - priv = sna_pixmap(pixmap); - if (priv == NULL || priv->shm) - return NULL; + DBG(("%s: attaching DRI client to pixmap=%ld\n", + __FUNCTION__, pixmap->drawable.serialNumber)); - priv = sna_pixmap_force_to_gpu(pixmap, MOVE_READ | MOVE_WRITE); - if (priv == NULL) + priv = sna_pixmap(pixmap); + if (priv != NULL && priv->shm) { + DBG(("%s: SHM Pixmap, BadAlloc\n", __FUNCTION__)); return NULL; + } + + priv = sna_pixmap_move_to_gpu(pixmap, + MOVE_READ | MOVE_WRITE | __MOVE_FORCE | __MOVE_DRI); + if (priv == NULL) { + DBG(("%s: failed to move to GPU, BadAlloc\n", __FUNCTION__)); + return NULL; + } if (priv->flush++) return priv->gpu_bo;