diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-11-05 08:38:22 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-11-05 08:38:22 +0000 |
commit | f3225fcb38686f3b9701725bf3a11ecf1c100c3f (patch) | |
tree | 0878f7a31ca0bac96d9666fd1b1de755ae1166ac /src/sna | |
parent | 93193aaf7d0fc4e3a3b9be1632bfd36331b47d2e (diff) |
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 <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/sna')
-rw-r--r-- | src/sna/kgem.c | 72 | ||||
-rw-r--r-- | src/sna/sna_blt.c | 1 | ||||
-rw-r--r-- | 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); |