diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-09-29 14:29:06 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-09-29 14:39:56 +0100 |
commit | 81d00c51018464929cdb3755adb334cb9a89d166 (patch) | |
tree | e6be40d446d17b7835e5ceffa13e1555def41f54 | |
parent | a0bb41d16f75901bc18b7024679e2b3a35fc14f6 (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.c | 6 | ||||
-rw-r--r-- | src/sna/kgem.h | 2 | ||||
-rw-r--r-- | src/sna/sna_render.c | 9 |
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); |