diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-01-12 08:15:13 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-01-12 08:18:04 +0000 |
commit | d111c464bfbae57bb7141872810c88b88f30c087 (patch) | |
tree | f3fb5b2dacaf7ba6e444ae88910e3bcf3c112eac /src/sna/sna_accel.c | |
parent | ec77a07b41f1062b941774f3782b51d21e7824dd (diff) |
sna: After a size check, double check the batch before flushing
As we may fail the size check with an empty batch and a pair of large
bo, we need to check before submitting that batch in order to not run
afoul of our internal sanity checks.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/sna/sna_accel.c')
-rw-r--r-- | src/sna/sna_accel.c | 72 |
1 files changed, 54 insertions, 18 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index b828cbf8..b0f66c76 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -3824,7 +3824,9 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region, if (!kgem_check_batch(&sna->kgem, 8) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -3952,7 +3954,9 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region, if (!kgem_check_batch(&sna->kgem, 12) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -6187,7 +6191,9 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, if (!kgem_check_batch(&sna->kgem, 7+src_stride) || !kgem_check_bo_fenced(&sna->kgem, arg->bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, arg->bo)) + return; /* XXX fallback? */ _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -6229,7 +6235,9 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, if (!kgem_check_batch(&sna->kgem, 8) || !kgem_check_bo_fenced(&sna->kgem, arg->bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, arg->bo)) + return; /* XXX fallback? */ _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -6348,7 +6356,9 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr drawable, GCPtr gc, if (!kgem_check_batch(&sna->kgem, 8) || !kgem_check_bo_fenced(&sna->kgem, arg->bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, arg->bo)) + return; /* XXX fallback? */ _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -9923,7 +9933,9 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 8+2*3) || !kgem_check_reloc(&sna->kgem, 2) || !kgem_check_bo_fenced(&sna->kgem, bo)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -10557,7 +10569,9 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 9 + 2*3) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -10867,7 +10881,9 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 7+src_stride) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -10909,7 +10925,9 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 8) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -11009,7 +11027,9 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 7+src_stride) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -11048,7 +11068,9 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 8) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -11149,7 +11171,9 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 7+src_stride) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -11188,7 +11212,9 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable, if (!kgem_check_batch(&sna->kgem, 8) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -11298,7 +11324,9 @@ sna_poly_fill_rect_stippled_n_box__imm(struct sna *sna, if (!kgem_check_batch(&sna->kgem, 7+len) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return; /* XXX fallback? */ _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -11402,7 +11430,9 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna, if (!kgem_check_batch(&sna->kgem, 7+len) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return; /* XXX fallback? */ _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -12315,7 +12345,9 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc, if (!kgem_check_batch(&sna->kgem, 16) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -12960,7 +12992,9 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc, if (!kgem_check_batch(&sna->kgem, 16) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc(&sna->kgem, 1)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -13356,7 +13390,9 @@ sna_push_pixels_solid_blt(GCPtr gc, if (!kgem_check_batch(&sna->kgem, 8) || !kgem_check_bo_fenced(&sna->kgem, bo) || !kgem_check_reloc_and_exec(&sna->kgem, 2)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(&sna->kgem, KGEM_BLT); } |