From f3225fcb38686f3b9701725bf3a11ecf1c100c3f Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 5 Nov 2013 08:38:22 +0000 Subject: [PATCH] sna: Be move conservative with tiling sizes for older fenced gen The older generations have stricter requirements for alignment of fenced GPU surfaces, so accommodate this by reducing our estimate available space for the temporary tile. Signed-off-by: Chris Wilson --- src/sna/kgem.c | 72 +++++++++++++++++++++++++++++--------------- src/sna/sna_blt.c | 1 + src/sna/sna_tiling.c | 2 ++ 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 21f958c9..00d0723b 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -4830,20 +4830,28 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo) if (kgem->nfence >= kgem->fence_max) return false; - size = 3*kgem->aperture_fenced; - if (kgem->aperture_total == kgem->aperture_mappable) - size += kgem->aperture; - if (size > kgem->aperture_mappable && - kgem_ring_is_idle(kgem, kgem->ring)) - return false; + if (kgem->aperture_fenced) { + size = 3*kgem->aperture_fenced; + if (kgem->aperture_total == kgem->aperture_mappable) + size += kgem->aperture; + if (size > kgem->aperture_mappable && + kgem_ring_is_idle(kgem, kgem->ring)) { + DBG(("%s: opportunistic fence flush\n", __FUNCTION__)); + return false; + } + } size = kgem->aperture_fenced; size += kgem_bo_fenced_size(kgem, bo); - size *= 2; + if (kgem->gen < 033) + size *= 2; if (kgem->aperture_total == kgem->aperture_mappable) size += kgem->aperture; - if (size > kgem->aperture_mappable) + if (size > kgem->aperture_mappable) { + DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n", + __FUNCTION__, size, kgem->aperture_mappable)); return false; + } } return true; @@ -4866,20 +4874,28 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo) if (kgem->nfence >= kgem->fence_max) return false; - size = 3*kgem->aperture_fenced; - if (kgem->aperture_total == kgem->aperture_mappable) - size += kgem->aperture; - if (size > kgem->aperture_mappable && - kgem_ring_is_idle(kgem, kgem->ring)) - return false; + if (kgem->aperture_fenced) { + size = 3*kgem->aperture_fenced; + if (kgem->aperture_total == kgem->aperture_mappable) + size += kgem->aperture; + if (size > kgem->aperture_mappable && + kgem_ring_is_idle(kgem, kgem->ring)) { + DBG(("%s: opportunistic fence flush\n", __FUNCTION__)); + return false; + } + } size = kgem->aperture_fenced; size += kgem_bo_fenced_size(kgem, bo); - size *= 2; + if (kgem->gen < 033) + size *= 2; if (kgem->aperture_total == kgem->aperture_mappable) size += kgem->aperture; - if (size > kgem->aperture_mappable) + if (size > kgem->aperture_mappable) { + DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n", + __FUNCTION__, size, kgem->aperture_mappable)); return false; + } } if (kgem->aperture + kgem->aperture_fenced + num_pages(bo) > kgem->aperture_high) { @@ -4948,20 +4964,28 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...) if (kgem->nfence + num_fence > kgem->fence_max) return false; - size = 3*kgem->aperture_fenced; - if (kgem->aperture_total == kgem->aperture_mappable) - size += kgem->aperture; - if (size > kgem->aperture_mappable && - kgem_ring_is_idle(kgem, kgem->ring)) - return false; + if (kgem->aperture_fenced) { + size = 3*kgem->aperture_fenced; + if (kgem->aperture_total == kgem->aperture_mappable) + size += kgem->aperture; + if (size > kgem->aperture_mappable && + kgem_ring_is_idle(kgem, kgem->ring)) { + DBG(("%s: opportunistic fence flush\n", __FUNCTION__)); + return false; + } + } size = kgem->aperture_fenced; size += fenced_size; - size *= 2; + if (kgem->gen < 033) + size *= 2; if (kgem->aperture_total == kgem->aperture_mappable) size += kgem->aperture; - if (size > kgem->aperture_mappable) + if (size > kgem->aperture_mappable) { + DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n", + __FUNCTION__, size, kgem->aperture_mappable)); return false; + } } if (num_pages == 0) diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index 576b7856..39ff0f6e 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -3282,6 +3282,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu, !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) { kgem_submit(kgem); if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) + DBG(("%s: not enough room in aperture, fallback to tiling copy\n", __FUNCTION__)); return sna_tiling_blt_copy_boxes(sna, alu, src_bo, src_dx, src_dy, dst_bo, dst_dx, dst_dy, diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c index 3bbcec70..b0a48dd3 100644 --- a/src/sna/sna_tiling.c +++ b/src/sna/sna_tiling.c @@ -718,6 +718,8 @@ bool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu, } if (max_size > sna->kgem.max_copy_tile_size) max_size = sna->kgem.max_copy_tile_size; + if (sna->kgem.gen < 033) + max_size /= 2; /* accommodate fence alignment */ pixman_region_init_rects(®ion, box, nbox);