diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-04-27 16:50:28 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-04-28 14:19:47 +0100 |
commit | daac9a1d036d80ccce83438b49115a236a16bfb6 (patch) | |
tree | 4fab32a298db3998959c97ce3567b0f1a6c4bafb | |
parent | 5967d76ca09a257ec9db66ea664158e1dfd083ba (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.c | 42 | ||||
-rw-r--r-- | src/sna/kgem.h | 3 | ||||
-rw-r--r-- | src/sna/sna_accel.c | 36 | ||||
-rw-r--r-- | src/sna/sna_blt.c | 34 | ||||
-rw-r--r-- | src/sna/sna_io.c | 6 |
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); } |