summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-09-29 14:29:06 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2013-09-29 14:39:56 +0100
commit81d00c51018464929cdb3755adb334cb9a89d166 (patch)
treee6be40d446d17b7835e5ceffa13e1555def41f54
parenta0bb41d16f75901bc18b7024679e2b3a35fc14f6 (diff)
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@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c6
-rw-r--r--src/sna/kgem.h2
-rw-r--r--src/sna/sna_render.c9
3 files changed, 9 insertions, 8 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 215d6076..c3d28ee7 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 83d9c744..b1ac8d7b 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 c0236294..f584ee4d 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);