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>
This commit is contained in:
Chris Wilson 2013-11-05 08:38:22 +00:00
parent 93193aaf7d
commit f3225fcb38
3 changed files with 51 additions and 24 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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(&region, box, nbox);