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 | |
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>
-rw-r--r-- | src/sna/gen4_render.c | 7 | ||||
-rw-r--r-- | src/sna/gen5_render.c | 6 | ||||
-rw-r--r-- | src/sna/gen6_render.c | 14 | ||||
-rw-r--r-- | src/sna/gen7_render.c | 14 | ||||
-rw-r--r-- | src/sna/kgem.c | 6 | ||||
-rw-r--r-- | src/sna/sna_accel.c | 72 | ||||
-rw-r--r-- | src/sna/sna_blt.c | 28 | ||||
-rw-r--r-- | src/sna/sna_io.c | 12 |
8 files changed, 114 insertions, 45 deletions
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c index c3e452d7..6b3f864e 100644 --- a/src/sna/gen4_render.c +++ b/src/sna/gen4_render.c @@ -2704,8 +2704,11 @@ gen4_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, tmp.u.gen4.sf = 0; if (!kgem_check_bo(&sna->kgem, bo, NULL)) { - _kgem_submit(&sna->kgem); - assert(kgem_check_bo(&sna->kgem, bo, NULL)); + kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, bo, NULL)) { + kgem_bo_destroy(&sna->kgem, tmp.src.bo); + return false; + } } gen4_bind_surfaces(sna, &tmp); diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c index c86cc24c..eec2f836 100644 --- a/src/sna/gen5_render.c +++ b/src/sna/gen5_render.c @@ -2795,7 +2795,11 @@ gen5_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, tmp.u.gen5.ve_id = 1; if (!kgem_check_bo(&sna->kgem, bo, NULL)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, bo, NULL)) { + kgem_bo_destroy(&sna->kgem, tmp.src.bo); + return false; + } assert(kgem_check_bo(&sna->kgem, bo, NULL)); } diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index a4b5746f..8b1ae3c6 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -3236,8 +3236,11 @@ gen6_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, assert(GEN6_VERTEX(tmp.u.gen6.flags) == FILL_VERTEX); if (!kgem_check_bo(&sna->kgem, bo, NULL)) { - _kgem_submit(&sna->kgem); - assert(kgem_check_bo(&sna->kgem, bo, NULL)); + kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, bo, NULL)) { + kgem_bo_destroy(&sna->kgem, tmp.src.bo); + return false; + } } gen6_emit_fill_state(sna, &tmp); @@ -3319,8 +3322,11 @@ gen6_render_clear(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo) assert(GEN6_VERTEX(tmp.u.gen6.flags) == FILL_VERTEX); if (!kgem_check_bo(&sna->kgem, bo, NULL)) { - _kgem_submit(&sna->kgem); - assert(kgem_check_bo(&sna->kgem, bo, NULL)); + kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, bo, NULL)) { + kgem_bo_destroy(&sna->kgem, tmp.src.bo); + return false; + } } gen6_emit_fill_state(sna, &tmp); diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index badce91b..cd36c958 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -3318,8 +3318,11 @@ gen7_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, kgem_set_mode(&sna->kgem, KGEM_RENDER, bo); if (!kgem_check_bo(&sna->kgem, bo, NULL)) { - _kgem_submit(&sna->kgem); - assert(kgem_check_bo(&sna->kgem, bo, NULL)); + kgem_submit(&sna->kgem); + if (kgem_check_bo(&sna->kgem, bo, NULL)) { + kgem_bo_destroy(&sna->kgem, tmp.src.bo); + return false; + } } gen7_emit_fill_state(sna, &tmp); @@ -3399,8 +3402,11 @@ gen7_render_clear(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo) kgem_set_mode(&sna->kgem, KGEM_RENDER, bo); if (!kgem_check_bo(&sna->kgem, bo, NULL)) { - _kgem_submit(&sna->kgem); - assert(kgem_check_bo(&sna->kgem, bo, NULL)); + kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, bo, NULL)) { + kgem_bo_destroy(&sna->kgem, tmp.src.bo); + return false; + } } gen7_emit_fill_state(sna, &tmp); diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 26581ada..4a28de0f 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -5551,7 +5551,11 @@ kgem_replace_bo(struct kgem *kgem, if (!kgem_check_batch(kgem, 8) || !kgem_check_reloc(kgem, 2) || !kgem_check_many_bo_fenced(kgem, src, dst, NULL)) { - _kgem_submit(kgem); + kgem_submit(kgem); + if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) { + kgem_bo_destroy(kgem, dst); + return NULL; + } _kgem_set_mode(kgem, KGEM_BLT); } 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); } diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index fb560d5b..56025790 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -148,8 +148,9 @@ static bool sna_blt_fill_init(struct sna *sna, kgem_set_mode(kgem, KGEM_BLT, bo); if (!kgem_check_batch(kgem, 12) || !kgem_check_bo_fenced(kgem, bo)) { - _kgem_submit(kgem); - assert(kgem_check_bo_fenced(kgem, bo)); + kgem_submit(kgem); + if (!kgem_check_bo_fenced(kgem, bo)) + return false; _kgem_set_mode(kgem, KGEM_BLT); } @@ -291,7 +292,7 @@ static bool sna_blt_copy_init(struct sna *sna, kgem_set_mode(kgem, KGEM_BLT, dst); if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) { - _kgem_submit(kgem); + kgem_submit(kgem); if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) return false; _kgem_set_mode(kgem, KGEM_BLT); @@ -343,7 +344,7 @@ static bool sna_blt_alpha_fixup_init(struct sna *sna, kgem_set_mode(kgem, KGEM_BLT, dst); if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) { - _kgem_submit(kgem); + kgem_submit(kgem); if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) return false; _kgem_set_mode(kgem, KGEM_BLT); @@ -980,8 +981,10 @@ begin_blt(struct sna *sna, struct sna_composite_op *op) { if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo)) { - _kgem_submit(&sna->kgem); - assert(kgem_check_bo_fenced(&sna->kgem, op->dst.bo)); + kgem_submit(&sna->kgem); + if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo)) + return false; + _kgem_set_mode(&sna->kgem, KGEM_BLT); } @@ -1245,7 +1248,7 @@ prepare_blt_copy(struct sna *sna, } if (!kgem_check_many_bo_fenced(&sna->kgem, op->dst.bo, bo, NULL)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); if (!kgem_check_many_bo_fenced(&sna->kgem, op->dst.bo, bo, NULL)) { DBG(("%s: fallback -- no room in aperture\n", __FUNCTION__)); @@ -2041,7 +2044,7 @@ sna_blt_composite__convert(struct sna *sna, } if (!kgem_check_many_bo_fenced(&sna->kgem, tmp->dst.bo, tmp->src.bo, NULL)) { - _kgem_submit(&sna->kgem); + kgem_submit(&sna->kgem); if (!kgem_check_many_bo_fenced(&sna->kgem, tmp->dst.bo, tmp->src.bo, NULL)) { DBG(("%s: fallback -- no room in aperture\n", __FUNCTION__)); @@ -2267,7 +2270,7 @@ static bool sna_blt_fill_box(struct sna *sna, uint8_t alu, if (!kgem_check_batch(kgem, 6) || !kgem_check_reloc(kgem, 1) || !kgem_check_bo_fenced(kgem, bo)) { - _kgem_submit(kgem); + kgem_submit(kgem); assert(kgem_check_bo_fenced(&sna->kgem, bo)); _kgem_set_mode(kgem, KGEM_BLT); } @@ -2342,8 +2345,9 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu, kgem_set_mode(kgem, KGEM_BLT, bo); if (!kgem_check_batch(kgem, 12) || !kgem_check_bo_fenced(kgem, bo)) { - _kgem_submit(kgem); - assert(kgem_check_bo_fenced(&sna->kgem, bo)); + kgem_submit(kgem); + if (!kgem_check_bo_fenced(&sna->kgem, bo)) + return false; _kgem_set_mode(kgem, KGEM_BLT); } @@ -2516,7 +2520,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu, if (!kgem_check_batch(kgem, 8) || !kgem_check_reloc(kgem, 2) || !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) { - _kgem_submit(kgem); + kgem_submit(kgem); 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, diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c index 8b4c25ef..368d8801 100644 --- a/src/sna/sna_io.c +++ b/src/sna/sna_io.c @@ -382,7 +382,9 @@ fallback: if (!kgem_check_batch(kgem, 8) || !kgem_check_reloc_and_exec(kgem, 2) || !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) { - _kgem_submit(kgem); + kgem_submit(kgem); + if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) + goto fallback; _kgem_set_mode(kgem, KGEM_BLT); } @@ -837,7 +839,9 @@ tile: if (!kgem_check_batch(kgem, 8) || !kgem_check_reloc_and_exec(kgem, 2) || !kgem_check_bo_fenced(kgem, dst_bo)) { - _kgem_submit(kgem); + kgem_submit(kgem); + if (!kgem_check_bo_fenced(kgem, dst_bo)) + goto fallback; _kgem_set_mode(kgem, KGEM_BLT); } @@ -1206,7 +1210,9 @@ tile: if (!kgem_check_batch(kgem, 8) || !kgem_check_reloc_and_exec(kgem, 2) || !kgem_check_bo_fenced(kgem, dst_bo)) { - _kgem_submit(kgem); + kgem_submit(kgem); + if (!kgem_check_bo_fenced(kgem, dst_bo)) + goto fallback; _kgem_set_mode(kgem, KGEM_BLT); } |