xf86-video-intel: src/sna/kgem.c src/sna/kgem.h src/sna/sna_render.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Sep 29 06:40:43 PDT 2013


 src/sna/kgem.c       |    6 +++++-
 src/sna/kgem.h       |    2 +-
 src/sna/sna_render.c |    9 +++------
 3 files changed, 9 insertions(+), 8 deletions(-)

New commits:
commit 81d00c51018464929cdb3755adb334cb9a89d166
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 29 14:29:06 2013 +0100

    sna: Apply the non-relaxed fencing partial paranoia everywhere
    
    This is required to ensure that the tiled offsets are tile-row aligned.
    
    Bugzilla: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1232546
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 215d607..c3d28ee 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1404,7 +1404,7 @@ inline static uint32_t kgem_pitch_alignment(struct kgem *kgem, unsigned flags)
 	return kgem->min_alignment;
 }
 
-void kgem_get_tile_size(struct kgem *kgem, int tiling,
+void kgem_get_tile_size(struct kgem *kgem, int tiling, int pitch,
 			int *tile_width, int *tile_height, int *tile_size)
 {
 	if (kgem->gen <= 030) {
@@ -1441,6 +1441,10 @@ void kgem_get_tile_size(struct kgem *kgem, int tiling,
 		*tile_size = 4096;
 		break;
 	}
+
+	/* Force offset alignment to tile-row */
+	if (tiling && kgem->gen < 033)
+		*tile_width = pitch;
 }
 
 static uint32_t kgem_surface_size(struct kgem *kgem,
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 83d9c74..b1ac8d7 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -467,7 +467,7 @@ bool kgem_bo_write(struct kgem *kgem, struct kgem_bo *bo,
 		   const void *data, int length);
 
 int kgem_bo_fenced_size(struct kgem *kgem, struct kgem_bo *bo);
-void kgem_get_tile_size(struct kgem *kgem, int tiling,
+void kgem_get_tile_size(struct kgem *kgem, int tiling, int pitch,
 			int *tile_width, int *tile_height, int *tile_size);
 
 static inline int __kgem_buffer_size(struct kgem_bo *bo)
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index c023629..f584ee4 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -917,14 +917,11 @@ sna_render_pixmap_partial(struct sna *sna,
 	if (bo->tiling) {
 		int tile_width, tile_height, tile_size;
 
-		kgem_get_tile_size(&sna->kgem, bo->tiling,
+		kgem_get_tile_size(&sna->kgem, bo->tiling, bo->pitch,
 				   &tile_width, &tile_height, &tile_size);
 		DBG(("%s: tile size for tiling %d: %dx%d, size=%d\n",
 		     __FUNCTION__, bo->tiling, tile_width, tile_height, tile_size));
 
-		if (sna->kgem.gen < 033)
-			tile_width = bo->pitch;
-
 		/* Ensure we align to an even tile row */
 		box.y1 = box.y1 & ~(2*tile_height - 1);
 		box.y2 = ALIGN(box.y2, 2*tile_height);
@@ -1048,7 +1045,7 @@ sna_render_picture_partial(struct sna *sna,
 	if (bo->tiling) {
 		int tile_width, tile_height, tile_size;
 
-		kgem_get_tile_size(&sna->kgem, bo->tiling,
+		kgem_get_tile_size(&sna->kgem, bo->tiling, bo->pitch,
 				   &tile_width, &tile_height, &tile_size);
 
 		DBG(("%s: tiling=%d, size=%dx%d, chunk=%d\n",
@@ -1966,7 +1963,7 @@ sna_render_composite_redirect(struct sna *sna,
 		if (op->dst.bo->tiling) {
 			int tile_width, tile_height, tile_size;
 
-			kgem_get_tile_size(&sna->kgem, op->dst.bo->tiling,
+			kgem_get_tile_size(&sna->kgem, op->dst.bo->tiling, op->dst.bo->pitch,
 					   &tile_width, &tile_height, &tile_size);
 
 			box.y1 = box.y1 & ~(2*tile_height - 1);


More information about the xorg-commit mailing list