xf86-video-intel: 2 commits - src/sna/sna_accel.c src/sna/sna_damage.h

Chris Wilson ickle at kemper.freedesktop.org
Fri Jul 4 03:46:15 PDT 2014


 src/sna/sna_accel.c  |   69 ++++++++++++++++++++++++++++++++++-----------------
 src/sna/sna_damage.h |    1 
 2 files changed, 48 insertions(+), 22 deletions(-)

New commits:
commit 64bcb91f58fba3956f2c66fa37707b9e496da936
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jul 4 11:02:39 2014 +0100

    sna: Utilise existing cached upload for promoting to GPU bo
    
    If we already have a buffer that represents the data on the GPU, we can
    simply use that when we need to promote the pixmap onto the GPU.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 9191fe2..0b16bd0 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4091,24 +4091,19 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 		goto active;
 	}
 
-	if (kgem_bo_discard_cache(priv->gpu_bo, flags & (MOVE_WRITE | __MOVE_FORCE))) {
-		DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
-		assert(DAMAGE_IS_ALL(priv->cpu_damage));
-		assert(priv->gpu_damage == NULL || DAMAGE_IS_ALL(priv->gpu_damage)); /* magical upload buffer */
-		assert(!priv->pinned);
-		assert(!priv->mapped);
-		sna_damage_destroy(&priv->gpu_damage);
-		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
-		priv->gpu_bo = NULL;
-	}
-
 	if ((flags & MOVE_READ) == 0)
 		sna_damage_destroy(&priv->cpu_damage);
 
 	sna_damage_reduce(&priv->cpu_damage);
 	assert_pixmap_damage(pixmap);
 	DBG(("%s: CPU damage? %d\n", __FUNCTION__, priv->cpu_damage != NULL));
-	if (priv->gpu_bo == NULL) {
+	if (priv->gpu_bo == NULL ||
+	    kgem_bo_discard_cache(priv->gpu_bo, flags & (MOVE_WRITE | __MOVE_FORCE))) {
+		struct kgem_bo *proxy;
+
+		proxy = priv->gpu_bo;
+		priv->gpu_bo = NULL;
+
 		DBG(("%s: creating GPU bo (%dx%d@%d), create=%x\n",
 		     __FUNCTION__,
 		     pixmap->drawable.width,
@@ -4116,9 +4111,9 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 		     pixmap->drawable.bitsPerPixel,
 		     priv->create));
 		assert(!priv->mapped);
-		if (flags & __MOVE_FORCE || priv->create & KGEM_CAN_CREATE_GPU) {
-			unsigned create;
+		assert(list_is_empty(&priv->flush_list));
 
+		if (flags & __MOVE_FORCE || priv->create & KGEM_CAN_CREATE_GPU) {
 			assert(pixmap->drawable.width > 0);
 			assert(pixmap->drawable.height > 0);
 			assert(pixmap->drawable.bitsPerPixel >= 8);
@@ -4138,21 +4133,39 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 				pixmap->devPrivate.ptr = NULL;
 				sna_damage_all(&priv->gpu_damage, pixmap);
 				sna_damage_destroy(&priv->cpu_damage);
-				goto done;
-			}
-
-			create = 0;
-			if (flags & MOVE_INPLACE_HINT || (priv->cpu_damage && priv->cpu_bo == NULL))
-				create = CREATE_GTT_MAP | CREATE_INACTIVE;
+			} else {
+				unsigned create = 0;
+				if (flags & MOVE_INPLACE_HINT || (priv->cpu_damage && priv->cpu_bo == NULL))
+					create = CREATE_GTT_MAP | CREATE_INACTIVE;
 
-			sna_pixmap_alloc_gpu(sna, pixmap, priv, create);
+				sna_pixmap_alloc_gpu(sna, pixmap, priv, create);
+			}
 		}
+
 		if (priv->gpu_bo == NULL) {
 			DBG(("%s: not creating GPU bo\n", __FUNCTION__));
 			assert(priv->gpu_damage == NULL);
+			priv->gpu_bo = proxy;
+			if (proxy)
+				sna_damage_all(&priv->cpu_damage, pixmap);
 			return NULL;
 		}
 
+		if (proxy) {
+			DBG(("%s: promoting upload proxy handle=%d to GPU\n", __FUNCTION__, proxy->handle));
+
+			if (priv->cpu_damage &&
+			    sna->render.copy_boxes(sna, GXcopy,
+						   &pixmap->drawable, proxy, 0, 0,
+						   &pixmap->drawable, priv->gpu_bo, 0, 0,
+						   region_rects(DAMAGE_REGION(priv->cpu_damage)),
+						   region_num_rects(DAMAGE_REGION(priv->cpu_damage)),
+						   0))
+				sna_damage_destroy(&priv->cpu_damage);
+
+			kgem_bo_destroy(&sna->kgem, proxy);
+		}
+
 		if (flags & MOVE_WRITE && priv->cpu_damage == NULL) {
 			/* Presume that we will only ever write to the GPU
 			 * bo. Readbacks are expensive but fairly constant
diff --git a/src/sna/sna_damage.h b/src/sna/sna_damage.h
index 28f7ee6..a55f859 100644
--- a/src/sna/sna_damage.h
+++ b/src/sna/sna_damage.h
@@ -25,6 +25,7 @@ struct sna_damage {
 #define DAMAGE_IS_ALL(ptr) (((uintptr_t)(ptr))&1)
 #define DAMAGE_MARK_ALL(ptr) ((struct sna_damage *)(((uintptr_t)(ptr))|1))
 #define DAMAGE_PTR(ptr) ((struct sna_damage *)(((uintptr_t)(ptr))&~1))
+#define DAMAGE_REGION(ptr) (&DAMAGE_PTR(ptr)->region)
 
 struct sna_damage *sna_damage_create(void);
 
commit 821ef20b27f84cc26aec266b0f616a7f39ba9e3d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jul 4 10:43:35 2014 +0100

    sna: Promote tile pixmaps to GPU when reused
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 0475f1e..9191fe2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -11938,6 +11938,7 @@ static struct kgem_bo *
 sna_pixmap_get_source_bo(PixmapPtr pixmap)
 {
 	struct sna_pixmap *priv = sna_pixmap(pixmap);
+	unsigned flags;
 	BoxRec box;
 
 	box.x1 = box.y1 = 0;
@@ -11968,7 +11969,18 @@ sna_pixmap_get_source_bo(PixmapPtr pixmap)
 			return kgem_bo_reference(priv->cpu_bo);
 	}
 
-	if (!sna_pixmap_move_to_gpu(pixmap, MOVE_READ | MOVE_ASYNC_HINT)) {
+	flags = MOVE_READ | MOVE_ASYNC_HINT;
+	if (priv->gpu_bo && priv->gpu_bo->proxy) {
+		struct kgem_bo *bo = priv->gpu_bo;
+		if (bo->rq == NULL && (bo->snoop || bo->pitch >= 4096))
+			flags |= __MOVE_FORCE;
+	}
+	if (priv->gpu_bo == NULL) {
+		if (++priv->source_count > SOURCE_BIAS)
+			flags |= __MOVE_FORCE;
+	}
+
+	if (!sna_pixmap_move_to_gpu(pixmap, flags)) {
 		struct kgem_bo *upload;
 
 		if (!sna_pixmap_move_to_cpu(pixmap, MOVE_READ))


More information about the xorg-commit mailing list