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:
parent
93193aaf7d
commit
f3225fcb38
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue