xf86-video-intel: src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_dri.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Feb 20 10:55:48 PST 2013


 src/sna/kgem.c      |   14 ++------------
 src/sna/sna_accel.c |   16 +++++++++++-----
 src/sna/sna_dri.c   |    9 +++++++++
 3 files changed, 22 insertions(+), 17 deletions(-)

New commits:
commit b7a96df9b0872867c823dc945add5be04d51c30a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Feb 20 18:46:01 2013 +0000

    sna: Honour LinearFramebuffer
    
    The Option was untested, and unsurprisingly was broken.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index e0f804e..c9b2011 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1208,14 +1208,6 @@ inline static uint32_t kgem_pitch_alignment(struct kgem *kgem, unsigned flags)
 	return kgem->min_alignment;
 }
 
-static uint32_t kgem_untiled_pitch(struct kgem *kgem,
-				   uint32_t width, uint32_t bpp,
-				   unsigned flags)
-{
-	width = ALIGN(width, 2) * bpp >> 3;
-	return ALIGN(width, kgem_pitch_alignment(kgem, flags));
-}
-
 void kgem_get_tile_size(struct kgem *kgem, int tiling,
 			int *tile_width, int *tile_height, int *tile_size)
 {
@@ -3473,7 +3465,7 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
 {
 	struct list *cache;
 	struct kgem_bo *bo;
-	uint32_t pitch, untiled_pitch, tiled_height, size;
+	uint32_t pitch, tiled_height, size;
 	uint32_t handle;
 	int i, bucket, retry;
 
@@ -3535,7 +3527,6 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
 			goto large_inactive;
 
 		tiled_height = kgem_aligned_height(kgem, height, tiling);
-		untiled_pitch = kgem_untiled_pitch(kgem, width, bpp, flags);
 
 		list_for_each_entry(bo, &kgem->large, list) {
 			assert(!bo->purged);
@@ -3800,7 +3791,6 @@ search_again:
 	}
 
 	if ((flags & CREATE_EXACT) == 0) { /* allow an active near-miss? */
-		untiled_pitch = kgem_untiled_pitch(kgem, width, bpp, flags);
 		i = tiling;
 		while (--i >= 0) {
 			tiled_height = kgem_surface_size(kgem, kgem->has_relaxed_fencing, flags,
@@ -3822,7 +3812,7 @@ search_again:
 						continue;
 					}
 				} else
-					bo->pitch = untiled_pitch;
+					bo->pitch = pitch;
 
 				if (bo->pitch * tiled_height > bytes(bo))
 					continue;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index a577af6..802fd19 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -557,7 +557,7 @@ pure static uint32_t sna_pixmap_choose_tiling(PixmapPtr pixmap,
 		tiling = default_tiling(pixmap, tiling);
 		bit = SNA_TILING_2D;
 	}
-	if ((sna->tiling && (1 << bit)) == 0)
+	if ((sna->tiling & bit) == 0)
 		tiling = I915_TILING_NONE;
 
 	/* Also adjust tiling if it is not supported or likely to
@@ -1372,6 +1372,7 @@ sna_pixmap_create_mappable_gpu(PixmapPtr pixmap)
 {
 	struct sna *sna = to_sna_from_pixmap(pixmap);
 	struct sna_pixmap *priv = sna_pixmap(pixmap);;
+	unsigned create;
 
 	if (wedged(sna))
 		return false;
@@ -1383,13 +1384,18 @@ sna_pixmap_create_mappable_gpu(PixmapPtr pixmap)
 
 	assert(priv->gpu_damage == NULL);
 	assert(priv->gpu_bo == NULL);
+
+	create = CREATE_GTT_MAP | CREATE_INACTIVE;
+	if (pixmap->usage_hint == SNA_CREATE_FB)
+		create |= CREATE_EXACT | CREATE_SCANOUT;
+
 	priv->gpu_bo =
 		kgem_create_2d(&sna->kgem,
 			       pixmap->drawable.width,
 			       pixmap->drawable.height,
 			       pixmap->drawable.bitsPerPixel,
 			       sna_pixmap_choose_tiling(pixmap, DEFAULT_TILING),
-			       CREATE_GTT_MAP | CREATE_INACTIVE);
+			       create);
 
 	return priv->gpu_bo && kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo);
 }
@@ -3096,10 +3102,10 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 			tiling = sna_pixmap_choose_tiling(pixmap, tiling);
 
 			create = 0;
-			if (priv->cpu_damage && priv->cpu_bo == NULL)
-				create = CREATE_GTT_MAP | CREATE_INACTIVE;
-			if (flags & MOVE_INPLACE_HINT)
+			if (flags & MOVE_INPLACE_HINT || (priv->cpu_damage && priv->cpu_bo == NULL))
 				create = CREATE_GTT_MAP | CREATE_INACTIVE;
+			if (pixmap->usage_hint == SNA_CREATE_FB)
+				create |= CREATE_EXACT | CREATE_SCANOUT;
 
 			priv->gpu_bo =
 				kgem_create_2d(&sna->kgem,
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 6979a30..31edf8c 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1321,6 +1321,15 @@ can_exchange(struct sna * sna,
 	}
 	assert(get_private(back)->size == get_private(front)->size);
 
+	/* prevent an implicit tiling mode change */
+	if (get_private(front)->bo->tiling != get_private(back)->bo->tiling) {
+		DBG(("%s -- no, tiling mismatch: front %d, back=%d\n",
+		     __FUNCTION__,
+		     get_private(front)->bo->tiling,
+		     get_private(back)->bo->tiling));
+		return false;
+	}
+
 	return true;
 }
 


More information about the xorg-commit mailing list