summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-04-27 16:50:28 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-04-28 14:19:47 +0100
commitdaac9a1d036d80ccce83438b49115a236a16bfb6 (patch)
tree4fab32a298db3998959c97ce3567b0f1a6c4bafb
parent5967d76ca09a257ec9db66ea664158e1dfd083ba (diff)
sna: Micro-optimise common case of checking a single fenced bo
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c42
-rw-r--r--src/sna/kgem.h3
-rw-r--r--src/sna/sna_accel.c36
-rw-r--r--src/sna/sna_blt.c34
-rw-r--r--src/sna/sna_io.c6
5 files changed, 80 insertions, 41 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 4c4aa7c3..29f0e299 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2977,7 +2977,45 @@ bool kgem_check_bo(struct kgem *kgem, ...)
return true;
}
-bool kgem_check_bo_fenced(struct kgem *kgem, ...)
+bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
+{
+ uint32_t size;
+
+ if (bo->proxy)
+ bo = bo->proxy;
+ if (bo->exec) {
+ if (kgem->gen < 40 &&
+ bo->tiling != I915_TILING_NONE &&
+ (bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) {
+ if (kgem->nfence >= kgem->fence_max)
+ return false;
+
+ size = kgem->aperture_fenced;
+ size += kgem_bo_fenced_size(kgem, bo);
+ if (size > kgem->aperture_mappable)
+ return false;
+ }
+
+ return true;
+ }
+
+ if (kgem->aperture > kgem->aperture_low)
+ return false;
+
+ if (kgem->nexec >= KGEM_EXEC_SIZE(kgem) - 1)
+ return false;
+
+ if (kgem->gen < 40 &&
+ bo->tiling != I915_TILING_NONE &&
+ kgem->nfence >= kgem->fence_max)
+ return false;
+
+ size = kgem->aperture;
+ size += num_pages(bo);
+ return size <= kgem->aperture_high;
+}
+
+bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
{
va_list ap;
struct kgem_bo *bo;
@@ -4165,7 +4203,7 @@ kgem_replace_bo(struct kgem *kgem,
kgem_set_mode(kgem, KGEM_BLT);
if (!kgem_check_batch(kgem, 8) ||
!kgem_check_reloc(kgem, 2) ||
- !kgem_check_bo_fenced(kgem, src, dst, NULL)) {
+ !kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
}
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 1235b83f..4def6b16 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -344,7 +344,8 @@ static inline void kgem_advance_batch(struct kgem *kgem, int num_dwords)
}
bool kgem_check_bo(struct kgem *kgem, ...) __attribute__((sentinel(0)));
-bool kgem_check_bo_fenced(struct kgem *kgem, ...) __attribute__((sentinel(0)));
+bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo);
+bool kgem_check_many_bo_fenced(struct kgem *kgem, ...) __attribute__((sentinel(0)));
void _kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo);
static inline void kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo)
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index dc084f08..a5c1648b 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2975,7 +2975,7 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
void *ptr;
if (!kgem_check_batch(&sna->kgem, 8) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -3103,7 +3103,7 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
void *ptr;
if (!kgem_check_batch(&sna->kgem, 12) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -5117,7 +5117,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
if (src_stride <= 128) {
src_stride = ALIGN(src_stride, 8) / 4;
if (!kgem_check_batch(&sna->kgem, 7+src_stride) ||
- !kgem_check_bo_fenced(&sna->kgem, arg->bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -5159,7 +5159,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
void *ptr;
if (!kgem_check_batch(&sna->kgem, 8) ||
- !kgem_check_bo_fenced(&sna->kgem, arg->bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -5277,7 +5277,7 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr drawable, GCPtr gc,
sx, sy, bx1, bx2));
if (!kgem_check_batch(&sna->kgem, 8) ||
- !kgem_check_bo_fenced(&sna->kgem, arg->bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9195,7 +9195,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
__FUNCTION__, r->x + dx, r->y + dy, r->width, r->height));
if (!kgem_check_batch(&sna->kgem, 9) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9243,7 +9243,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
uint32_t *b;
if (!kgem_check_batch(&sna->kgem, 9) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9293,7 +9293,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
uint32_t *b;
if (!kgem_check_batch(&sna->kgem, 9) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9433,7 +9433,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
if (src_stride <= 128) {
src_stride = ALIGN(src_stride, 8) / 4;
if (!kgem_check_batch(&sna->kgem, 7+src_stride) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9475,7 +9475,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
void *ptr;
if (!kgem_check_batch(&sna->kgem, 8) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9575,7 +9575,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
if (src_stride <= 128) {
src_stride = ALIGN(src_stride, 8) / 4;
if (!kgem_check_batch(&sna->kgem, 7+src_stride) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9614,7 +9614,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
} while (--bh);
} else {
if (!kgem_check_batch(&sna->kgem, 8) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9715,7 +9715,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
if (src_stride <= 128) {
src_stride = ALIGN(src_stride, 8) / 4;
if (!kgem_check_batch(&sna->kgem, 7+src_stride) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9754,7 +9754,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
} while (--bh);
} else {
if (!kgem_check_batch(&sna->kgem, 8) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9856,7 +9856,7 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
len = bw*bh;
len = ALIGN(len, 8) / 4;
if (!kgem_check_batch(&sna->kgem, 7+len) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -10512,7 +10512,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
kgem_set_mode(&sna->kgem, KGEM_BLT);
if (!kgem_check_batch(&sna->kgem, 16) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -11180,7 +11180,7 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
kgem_set_mode(&sna->kgem, KGEM_BLT);
if (!kgem_check_batch(&sna->kgem, 16) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 1)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -11549,7 +11549,7 @@ sna_push_pixels_solid_blt(GCPtr gc,
void *ptr;
if (!kgem_check_batch(&sna->kgem, 8) ||
- !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+ !kgem_check_bo_fenced(&sna->kgem, bo) ||
!kgem_check_reloc(&sna->kgem, 2)) {
_kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_BLT);
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index a81a1454..82c61df6 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -151,10 +151,10 @@ static bool sna_blt_fill_init(struct sna *sna,
blt->bpp = bpp;
kgem_set_mode(kgem, KGEM_BLT);
- if (!kgem_check_bo_fenced(kgem, bo, NULL) ||
+ if (!kgem_check_bo_fenced(kgem, bo) ||
!kgem_check_batch(kgem, 12)) {
_kgem_submit(kgem);
- assert(kgem_check_bo_fenced(kgem, bo, NULL));
+ assert(kgem_check_bo_fenced(kgem, bo));
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -293,9 +293,9 @@ static Bool sna_blt_copy_init(struct sna *sna,
}
kgem_set_mode(kgem, KGEM_BLT);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL)) {
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
_kgem_submit(kgem);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL))
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
return FALSE;
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -345,9 +345,9 @@ static Bool sna_blt_alpha_fixup_init(struct sna *sna,
blt->pixel = alpha;
kgem_set_mode(kgem, KGEM_BLT);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL)) {
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
_kgem_submit(kgem);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL))
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
return FALSE;
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -1103,10 +1103,10 @@ prepare_blt_copy(struct sna *sna,
if (!kgem_bo_can_blt(&sna->kgem, priv->gpu_bo))
return FALSE;
- if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo, priv->gpu_bo, NULL)) {
+ if (!kgem_check_many_bo_fenced(&sna->kgem, op->dst.bo, priv->gpu_bo, NULL)) {
_kgem_submit(&sna->kgem);
- if (!kgem_check_bo_fenced(&sna->kgem,
- op->dst.bo, priv->gpu_bo, NULL))
+ if (!kgem_check_many_bo_fenced(&sna->kgem,
+ op->dst.bo, priv->gpu_bo, NULL))
return FALSE;
_kgem_set_mode(&sna->kgem, KGEM_BLT);
}
@@ -1577,9 +1577,9 @@ sna_blt_composite(struct sna *sna,
if (width && height)
reduce_damage(tmp, dst_x, dst_y, width, height);
- if (!kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo, NULL)) {
+ if (!kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo)) {
_kgem_submit(&sna->kgem);
- assert(kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo, NULL));
+ assert(kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo));
_kgem_set_mode(&sna->kgem, KGEM_BLT);
}
@@ -1884,9 +1884,9 @@ static bool sna_blt_fill_box(struct sna *sna, uint8_t alu,
kgem_set_mode(kgem, KGEM_BLT);
if (!kgem_check_batch(kgem, 6) ||
!kgem_check_reloc(kgem, 1) ||
- !kgem_check_bo_fenced(kgem, bo, NULL)) {
+ !kgem_check_bo_fenced(kgem, bo)) {
_kgem_submit(kgem);
- assert(kgem_check_bo_fenced(&sna->kgem, bo, NULL));
+ assert(kgem_check_bo_fenced(&sna->kgem, bo));
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -1957,10 +1957,10 @@ Bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
}
kgem_set_mode(kgem, KGEM_BLT);
- if (!kgem_check_bo_fenced(kgem, bo, NULL) ||
+ if (!kgem_check_bo_fenced(kgem, bo) ||
!kgem_check_batch(kgem, 12)) {
_kgem_submit(kgem);
- assert(kgem_check_bo_fenced(&sna->kgem, bo, NULL));
+ assert(kgem_check_bo_fenced(&sna->kgem, bo));
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -2122,9 +2122,9 @@ Bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
kgem_set_mode(kgem, KGEM_BLT);
if (!kgem_check_batch(kgem, 8) ||
!kgem_check_reloc(kgem, 2) ||
- !kgem_check_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
+ !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
_kgem_submit(kgem);
- if (!kgem_check_bo_fenced(kgem, dst_bo, src_bo, NULL))
+ if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL))
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_io.c b/src/sna/sna_io.c
index 02a5c759..2539518b 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -360,7 +360,7 @@ fallback:
if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) ||
kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) ||
!kgem_check_batch(kgem, 8) ||
- !kgem_check_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
+ !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -732,7 +732,7 @@ tile:
if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) ||
kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) ||
!kgem_check_batch(kgem, 8) ||
- !kgem_check_bo_fenced(kgem, dst_bo, NULL)) {
+ !kgem_check_bo_fenced(kgem, dst_bo)) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -969,7 +969,7 @@ fallback:
if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) ||
kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) ||
!kgem_check_batch(kgem, 8) ||
- !kgem_check_bo_fenced(kgem, dst_bo, NULL)) {
+ !kgem_check_bo_fenced(kgem, dst_bo)) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
}