summaryrefslogtreecommitdiff
path: root/src/sna/sna_accel.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-01-12 08:15:13 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2013-01-12 08:18:04 +0000
commitd111c464bfbae57bb7141872810c88b88f30c087 (patch)
treef3fb5b2dacaf7ba6e444ae88910e3bcf3c112eac /src/sna/sna_accel.c
parentec77a07b41f1062b941774f3782b51d21e7824dd (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.c72
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);
}