xf86-video-intel: 2 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_accel.c src/sna/sna_dri.c src/sna/sna.h src/uxa/intel_dri.c src/uxa/intel.h src/uxa/intel_uxa.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Nov 22 05:37:27 PST 2013


 src/sna/gen2_render.c |   26 +++++++++++++++++++-------
 src/sna/gen3_render.c |   14 ++++++++++----
 src/sna/gen4_render.c |   25 +++++++++++++++++++------
 src/sna/gen5_render.c |   25 +++++++++++++++++++------
 src/sna/gen6_render.c |   31 +++++++++++++++++++------------
 src/sna/gen7_render.c |   31 +++++++++++++++++++------------
 src/sna/sna.h         |    7 ++++---
 src/sna/sna_accel.c   |    2 +-
 src/sna/sna_dri.c     |   18 ++++++++++++------
 src/uxa/intel.h       |    8 +++++---
 src/uxa/intel_dri.c   |    5 ++++-
 src/uxa/intel_uxa.c   |    4 ++--
 12 files changed, 133 insertions(+), 63 deletions(-)

New commits:
commit 0ee29c4ea3b05e9361635a2ef6e7b92c160d68cf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Nov 22 13:34:35 2013 +0000

    uxa,sna: Prevent bo exchange when pinned for non-DRI2 clients
    
    With the advent of DRI3 (and previously with Prime and Glamor) we have
    external clients who rely on the pixmap<->bo mapping being invariant.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 6474d11..b3e38a3 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -142,10 +142,11 @@ struct sna_pixmap {
 
 #define SOURCE_BIAS 4
 	uint16_t source_count;
-	uint8_t pinned :3;
+	uint8_t pinned :4;
 #define PIN_SCANOUT 0x1
-#define PIN_DRI 0x2
-#define PIN_PRIME 0x4
+#define PIN_DRI2 0x2
+#define PIN_DRI3 0x4
+#define PIN_PRIME 0x8
 	uint8_t create :4;
 	uint8_t mapped :2;
 #define MAPPED_NONE 0
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7238cbe..a68e5fb 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1040,7 +1040,7 @@ sna_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr slave, void **fd_handle)
 		     pixmap->drawable.width, pixmap->drawable.height,
 		     pixmap->drawable.serialNumber));
 
-		if (priv->pinned & ~(PIN_DRI | PIN_PRIME)) {
+		if (priv->pinned) {
 			DBG(("%s: can't convert pinned bo\n", __FUNCTION__));
 			return FALSE;
 		}
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 5e6d3a7..a218be3 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -248,7 +248,7 @@ sna_dri_create_buffer(DrawablePtr draw,
 			assert(private->pixmap == pixmap);
 			assert(sna_pixmap(pixmap)->flush);
 			assert(sna_pixmap(pixmap)->gpu_bo == private->bo);
-			assert(sna_pixmap(pixmap)->pinned & PIN_DRI);
+			assert(sna_pixmap(pixmap)->pinned & PIN_DRI2);
 			assert(kgem_bo_flink(&sna->kgem, private->bo) == buffer->name);
 			assert(8*private->bo->pitch >= pixmap->drawable.width * pixmap->drawable.bitsPerPixel);
 			assert(private->bo->pitch * pixmap->drawable.height <= kgem_bo_size(private->bo));
@@ -378,10 +378,10 @@ sna_dri_create_buffer(DrawablePtr draw,
 
 		priv = sna_pixmap(pixmap);
 		assert(priv->flush == false);
-		assert((priv->pinned & PIN_DRI) == 0);
+		assert((priv->pinned & PIN_DRI2) == 0);
 
 		/* Don't allow this named buffer to be replaced */
-		priv->pinned |= PIN_DRI;
+		priv->pinned |= PIN_DRI2;
 
 		/* We need to submit any modifications to and reads from this
 		 * buffer before we send any reply to the Client.
@@ -424,7 +424,7 @@ static void _sna_dri_destroy_buffer(struct sna *sna, DRI2Buffer2Ptr buffer)
 		assert(sna_pixmap_get_buffer(pixmap) == buffer);
 		assert(priv->gpu_bo == private->bo);
 		assert(priv->gpu_bo->flush);
-		assert(priv->pinned & PIN_DRI);
+		assert(priv->pinned & PIN_DRI2);
 		assert(priv->flush);
 
 		/* Undo the DRI markings on this pixmap */
@@ -436,7 +436,7 @@ static void _sna_dri_destroy_buffer(struct sna *sna, DRI2Buffer2Ptr buffer)
 		list_del(&priv->flush_list);
 
 		priv->gpu_bo->flush = false;
-		priv->pinned &= ~PIN_DRI;
+		priv->pinned &= ~PIN_DRI2;
 
 		priv->flush = false;
 		sna_accel_watch_flush(sna, -1);
@@ -496,7 +496,7 @@ static void set_bo(PixmapPtr pixmap, struct kgem_bo *bo)
 	assert(pixmap->drawable.height * bo->pitch <= kgem_bo_size(bo));
 	assert(bo->proxy == NULL);
 	assert(bo->flush);
-	assert(priv->pinned & PIN_DRI);
+	assert(priv->pinned & PIN_DRI2);
 	assert((priv->pinned & PIN_PRIME) == 0);
 	assert(priv->flush);
 
@@ -1214,6 +1214,12 @@ can_flip(struct sna * sna,
 		return false;
 	}
 
+	if (sna_pixmap(pixmap)->pinned & ~(PIN_DRI2 | PIN_SCANOUT)) {
+		DBG(("%s -- no, pinned: front %x\n",
+		     __FUNCTION__, get_private(front)->pinned));
+		return false;
+	}
+
 	return true;
 }
 
diff --git a/src/uxa/intel.h b/src/uxa/intel.h
index 131f18c..ded975f 100644
--- a/src/uxa/intel.h
+++ b/src/uxa/intel.h
@@ -97,10 +97,12 @@ struct intel_pixmap {
 	int8_t busy :2;
 	uint8_t dirty :1;
 	uint8_t offscreen :1;
-	uint8_t pinned :3;
+	uint8_t pinned :5;
 #define PIN_SCANOUT 0x1
-#define PIN_DRI 0x2
-#define PIN_GLAMOR 0x4
+#define PIN_DRI2 0x2
+#define PIN_DRI3 0x4
+#define PIN_PRIME 0x8
+#define PIN_GLAMOR 0x10
 };
 
 #if HAS_DEVPRIVATEKEYREC
diff --git a/src/uxa/intel_dri.c b/src/uxa/intel_dri.c
index acedd0b..1a9bad0 100644
--- a/src/uxa/intel_dri.c
+++ b/src/uxa/intel_dri.c
@@ -91,7 +91,7 @@ static uint32_t pixmap_flink(PixmapPtr pixmap)
 	if (dri_bo_flink(priv->bo, &name) != 0)
 		return 0;
 
-	priv->pinned |= PIN_DRI;
+	priv->pinned |= PIN_DRI2;
 	return name;
 }
 
@@ -984,6 +984,9 @@ can_exchange(DrawablePtr drawable, DRI2BufferPtr front, DRI2BufferPtr back)
 	if (front_intel->tiling != back_intel->tiling)
 		return FALSE;
 
+	if (front_intel->pinned & ~(PIN_SCANOUT | PIN_DRI2))
+		return FALSE;
+
 	return TRUE;
 }
 
diff --git a/src/uxa/intel_uxa.c b/src/uxa/intel_uxa.c
index 6fb1333..d4ba7fc 100644
--- a/src/uxa/intel_uxa.c
+++ b/src/uxa/intel_uxa.c
@@ -1195,7 +1195,7 @@ intel_uxa_share_pixmap_backing(PixmapPtr ppix, ScreenPtr slave, void **fd_handle
 	drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
 
 	if (tiling == I915_TILING_X) {
-		if (priv->pinned & ~PIN_DRI)
+		if (priv->pinned)
 			return FALSE;
 
 	        tiling = I915_TILING_NONE;
@@ -1219,7 +1219,7 @@ intel_uxa_share_pixmap_backing(PixmapPtr ppix, ScreenPtr slave, void **fd_handle
 	}
 	drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
 	drm_intel_bo_gem_export_to_prime(bo, &handle);
-	priv->pinned |= PIN_DRI;
+	priv->pinned |= PIN_PRIME;
 
 	*fd_handle = (void *)(long)handle;
 	return TRUE;
commit f0021ab2a66fb7c84758ad482f47f023b862360b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Nov 22 12:07:06 2013 +0000

    sna: Tidy up fallback from render composite to blt composite
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 1a4c36a..3e90740 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1869,7 +1869,7 @@ gen2_render_composite(struct sna *sna,
 		return true;
 
 	if (gen2_composite_fallback(sna, src, mask, dst))
-		return false;
+		goto fallback;
 
 	if (need_tiling(sna, width, height))
 		return sna_tiling_composite(op, src, mask, dst,
@@ -1883,7 +1883,7 @@ gen2_render_composite(struct sna *sna,
 				       dst_x, dst_y, width, height)) {
 		DBG(("%s: unable to set render target\n",
 		     __FUNCTION__));
-		return false;
+		goto fallback;
 	}
 
 	tmp->op = op;
@@ -1894,7 +1894,7 @@ gen2_render_composite(struct sna *sna,
 		if (!sna_render_composite_redirect(sna, tmp,
 						   dst_x, dst_y, width, height,
 						   op > PictOpSrc || dst->pCompositeClip->data != NULL))
-			return false;
+			goto fallback;
 	}
 
 	switch (gen2_composite_picture(sna, src, &tmp->src,
@@ -2057,15 +2057,27 @@ gen2_render_composite(struct sna *sna,
 	return true;
 
 cleanup_mask:
-	if (tmp->mask.bo)
+	if (tmp->mask.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->mask.bo);
+		tmp->mask.bo = NULL;
+	}
 cleanup_src:
-	if (tmp->src.bo)
+	if (tmp->src.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->src.bo);
+		tmp->src.bo = NULL;
+	}
 cleanup_dst:
-	if (tmp->redirect.real_bo)
+	if (tmp->redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->dst.bo);
-	return false;
+		tmp->redirect.real_bo = NULL;
+	}
+fallback:
+	return (mask == NULL &&
+		sna_blt_composite(sna, op, src, dst,
+				  src_x, src_y,
+				  dst_x, dst_y,
+				  width, height,
+				  tmp, true));
 }
 
 fastcall static void
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 9d9f627..e841396 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3515,7 +3515,7 @@ gen3_render_composite(struct sna *sna,
 				       dst_x, dst_y, width, height)) {
 		DBG(("%s: unable to set render target\n",
 		     __FUNCTION__));
-		return false;
+		goto fallback;
 	}
 
 	tmp->op = op;
@@ -3819,14 +3819,20 @@ gen3_render_composite(struct sna *sna,
 	return true;
 
 cleanup_mask:
-	if (tmp->mask.bo)
+	if (tmp->mask.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->mask.bo);
+		tmp->mask.bo = NULL;
+	}
 cleanup_src:
-	if (tmp->src.bo)
+	if (tmp->src.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->src.bo);
+		tmp->src.bo = NULL;
+	}
 cleanup_dst:
-	if (tmp->redirect.real_bo)
+	if (tmp->redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->dst.bo);
+		tmp->redirect.real_bo = NULL;
+	}
 fallback:
 	return (mask == NULL &&
 		sna_blt_composite(sna,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index c6a1e6d..2da0137 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1864,7 +1864,7 @@ gen4_render_composite(struct sna *sna,
 		return true;
 
 	if (gen4_composite_fallback(sna, src, mask, dst))
-		return false;
+		goto fallback;
 
 	if (need_tiling(sna, width, height))
 		return sna_tiling_composite(op, src, mask, dst,
@@ -1878,7 +1878,7 @@ gen4_render_composite(struct sna *sna,
 				       dst_x, dst_y, width, height,
 				       op > PictOpSrc || dst->pCompositeClip->data)) {
 		DBG(("%s: failed to set composite target\n", __FUNCTION__));
-		return false;
+		goto fallback;
 	}
 
 	tmp->op = op;
@@ -1988,15 +1988,28 @@ gen4_render_composite(struct sna *sna,
 	return true;
 
 cleanup_mask:
-	if (tmp->mask.bo)
+	if (tmp->mask.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->mask.bo);
+		tmp->mask.bo = NULL;
+	}
 cleanup_src:
-	if (tmp->src.bo)
+	if (tmp->src.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->src.bo);
+		tmp->src.bo = NULL;
+	}
 cleanup_dst:
-	if (tmp->redirect.real_bo)
+	if (tmp->redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->dst.bo);
-	return false;
+		tmp->redirect.real_bo = NULL;
+	}
+fallback:
+	return (mask == NULL &&
+		sna_blt_composite(sna, op,
+				  src, dst,
+				  src_x, src_y,
+				  dst_x, dst_y,
+				  width, height,
+				  tmp, true));
 }
 
 #if !NO_COMPOSITE_SPANS
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 1e90413..247dc97 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1850,7 +1850,7 @@ gen5_render_composite(struct sna *sna,
 		return true;
 
 	if (gen5_composite_fallback(sna, src, mask, dst))
-		return false;
+		goto fallback;
 
 	if (need_tiling(sna, width, height))
 		return sna_tiling_composite(op, src, mask, dst,
@@ -1864,7 +1864,7 @@ gen5_render_composite(struct sna *sna,
 				       dst_x, dst_y, width, height,
 				       op > PictOpSrc || dst->pCompositeClip->data)) {
 		DBG(("%s: failed to set composite target\n", __FUNCTION__));
-		return false;
+		goto fallback;
 	}
 
 	DBG(("%s: preparing source\n", __FUNCTION__));
@@ -1970,15 +1970,28 @@ gen5_render_composite(struct sna *sna,
 	return true;
 
 cleanup_mask:
-	if (tmp->mask.bo)
+	if (tmp->mask.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->mask.bo);
+		tmp->mask.bo = NULL;
+	}
 cleanup_src:
-	if (tmp->src.bo)
+	if (tmp->src.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->src.bo);
+		tmp->src.bo = NULL;
+	}
 cleanup_dst:
-	if (tmp->redirect.real_bo)
+	if (tmp->redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->dst.bo);
-	return false;
+		tmp->redirect.real_bo = NULL;
+	}
+fallback:
+	return (mask == NULL &&
+		sna_blt_composite(sna, op,
+				  src, dst,
+				  src_x, src_y,
+				  dst_x, dst_y,
+				  width, height,
+				  tmp, true));
 }
 
 #if !NO_COMPOSITE_SPANS
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index f03b893..103b959 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2143,13 +2143,7 @@ gen6_render_composite(struct sna *sna,
 		return true;
 
 	if (gen6_composite_fallback(sna, src, mask, dst))
-		return (mask == NULL &&
-			sna_blt_composite(sna, op,
-					  src, dst,
-					  src_x, src_y,
-					  dst_x, dst_y,
-					  width, height,
-					  tmp, true));
+		goto fallback;
 
 	if (need_tiling(sna, width, height))
 		return sna_tiling_composite(op, src, mask, dst,
@@ -2165,7 +2159,7 @@ gen6_render_composite(struct sna *sna,
 	if (!gen6_composite_set_target(sna, tmp, dst,
 				       dst_x, dst_y, width, height,
 				       op > PictOpSrc || dst->pCompositeClip->data))
-		return false;
+		goto fallback;
 
 	switch (gen6_composite_picture(sna, src, &tmp->src,
 				       src_x, src_y,
@@ -2280,15 +2274,28 @@ gen6_render_composite(struct sna *sna,
 	return true;
 
 cleanup_mask:
-	if (tmp->mask.bo)
+	if (tmp->mask.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->mask.bo);
+		tmp->mask.bo = NULL;
+	}
 cleanup_src:
-	if (tmp->src.bo)
+	if (tmp->src.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->src.bo);
+		tmp->src.bo = NULL;
+	}
 cleanup_dst:
-	if (tmp->redirect.real_bo)
+	if (tmp->redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->dst.bo);
-	return false;
+		tmp->redirect.real_bo = NULL;
+	}
+fallback:
+	return (mask == NULL &&
+		sna_blt_composite(sna, op,
+				  src, dst,
+				  src_x, src_y,
+				  dst_x, dst_y,
+				  width, height,
+				  tmp, true));
 }
 
 #if !NO_COMPOSITE_SPANS
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 72861cc..65c7134 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2425,13 +2425,7 @@ gen7_render_composite(struct sna *sna,
 		return true;
 
 	if (gen7_composite_fallback(sna, src, mask, dst))
-		return (mask == NULL &&
-			sna_blt_composite(sna, op,
-					src, dst,
-					src_x, src_y,
-					dst_x, dst_y,
-					width, height,
-					tmp, true));
+		goto fallback;
 
 	if (need_tiling(sna, width, height))
 		return sna_tiling_composite(op, src, mask, dst,
@@ -2447,7 +2441,7 @@ gen7_render_composite(struct sna *sna,
 	if (!gen7_composite_set_target(sna, tmp, dst,
 				       dst_x, dst_y, width, height,
 				       op > PictOpSrc || dst->pCompositeClip->data))
-		return false;
+		goto fallback;
 
 	switch (gen7_composite_picture(sna, src, &tmp->src,
 				       src_x, src_y,
@@ -2562,15 +2556,28 @@ gen7_render_composite(struct sna *sna,
 	return true;
 
 cleanup_mask:
-	if (tmp->mask.bo)
+	if (tmp->mask.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->mask.bo);
+		tmp->mask.bo = NULL;
+	}
 cleanup_src:
-	if (tmp->src.bo)
+	if (tmp->src.bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->src.bo);
+		tmp->src.bo = NULL;
+	}
 cleanup_dst:
-	if (tmp->redirect.real_bo)
+	if (tmp->redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp->dst.bo);
-	return false;
+		tmp->redirect.real_bo = NULL;
+	}
+fallback:
+	return (mask == NULL &&
+		sna_blt_composite(sna, op,
+				  src, dst,
+				  src_x, src_y,
+				  dst_x, dst_y,
+				  width, height,
+				  tmp, true));
 }
 
 #if !NO_COMPOSITE_SPANS


More information about the xorg-commit mailing list