diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-14 14:12:25 +0000 |
|---|---|---|
| committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-14 18:13:48 +0000 |
| commit | 295a22d2709b2442b5254968437f897dac22a0ec (patch) | |
| tree | 2705021951b14a809e24c05658f33dd96eb539bf | |
| parent | 0d2a50772200d868d094f90dc1d30c1b4d7930ba (diff) | |
sna: Ensure that the batch mode is always declared before emitting dwords
Initially, the batch->mode was only set upon an actual mode switch,
batch submission would not reset the mode. However, to facilitate fast
ring switching with semaphores, reseting the mode upon batch submission
is desired which means that if we submit the batch in the middle of an
operation we must redeclare its mode before continuing.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
| -rw-r--r-- | src/sna/gen2_render.c | 1 | ||||
| -rw-r--r-- | src/sna/gen3_render.c | 3 | ||||
| -rw-r--r-- | src/sna/gen6_render.c | 20 | ||||
| -rw-r--r-- | src/sna/gen7_render.c | 20 | ||||
| -rw-r--r-- | src/sna/kgem.h | 2 | ||||
| -rw-r--r-- | src/sna/sna_blt.c | 19 | ||||
| -rw-r--r-- | src/sna/sna_render_inline.h | 1 |
7 files changed, 40 insertions, 26 deletions
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c index ef32f011..2513307e 100644 --- a/src/sna/gen2_render.c +++ b/src/sna/gen2_render.c @@ -976,6 +976,7 @@ inline static int gen2_get_rectangles(struct sna *sna, if (rem < need + size) { gen2_vertex_flush(sna, op); kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); return 0; } diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c index 883e6223..8b7dbbdc 100644 --- a/src/sna/gen3_render.c +++ b/src/sna/gen3_render.c @@ -3540,6 +3540,7 @@ gen3_video_get_batch(struct sna *sna) __FUNCTION__, batch_space(sna), 120)); kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); } if (sna->kgem.nreloc + 4 > KGEM_RELOC_SIZE(&sna->kgem)) { @@ -3548,6 +3549,7 @@ gen3_video_get_batch(struct sna *sna) sna->kgem.nreloc + 4, (int)KGEM_RELOC_SIZE(&sna->kgem))); kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); } if (sna->kgem.nexec + 2 > KGEM_EXEC_SIZE(&sna->kgem)) { @@ -3556,6 +3558,7 @@ gen3_video_get_batch(struct sna *sna) sna->kgem.nexec + 2, (int)KGEM_EXEC_SIZE(&sna->kgem))); kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); } if (sna->render_state.gen3.need_invariant) diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index 1e9d9304..c6fa134c 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -1939,8 +1939,10 @@ gen6_render_video(struct sna *sna, tmp.u.gen6.ve_id = 1; kgem_set_mode(&sna->kgem, KGEM_RENDER); - if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) + if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(frame->bo)) kgem_emit_flush(&sna->kgem); @@ -2539,8 +2541,10 @@ gen6_render_composite(struct sna *sna, kgem_set_mode(&sna->kgem, KGEM_RENDER); if (!kgem_check_bo(&sna->kgem, tmp->dst.bo, tmp->src.bo, tmp->mask.bo, - NULL)) + NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) kgem_emit_flush(&sna->kgem); @@ -2939,8 +2943,10 @@ gen6_render_composite_spans(struct sna *sna, kgem_set_mode(&sna->kgem, KGEM_RENDER); if (!kgem_check_bo(&sna->kgem, tmp->base.dst.bo, tmp->base.src.bo, - NULL)) + NULL)){ kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(tmp->base.src.bo)) kgem_emit_flush(&sna->kgem); @@ -3113,8 +3119,10 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu, tmp.u.gen6.ve_id = 1; kgem_set_mode(&sna->kgem, KGEM_RENDER); - if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) + if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(src_bo)) kgem_emit_flush(&sna->kgem); @@ -3260,8 +3268,10 @@ gen6_render_copy(struct sna *sna, uint8_t alu, op->base.u.gen6.ve_id = 1; kgem_set_mode(&sna->kgem, KGEM_RENDER); - if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) + if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(src_bo)) kgem_emit_flush(&sna->kgem); diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index b14bc708..a2ec7153 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -2031,8 +2031,10 @@ gen7_render_video(struct sna *sna, tmp.u.gen7.ve_id = 1; kgem_set_mode(&sna->kgem, KGEM_RENDER); - if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) + if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(frame->bo)) kgem_emit_flush(&sna->kgem); @@ -2624,8 +2626,10 @@ gen7_render_composite(struct sna *sna, kgem_set_mode(&sna->kgem, KGEM_RENDER); if (!kgem_check_bo(&sna->kgem, tmp->dst.bo, tmp->src.bo, tmp->mask.bo, - NULL)) + NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) kgem_emit_flush(&sna->kgem); @@ -2935,8 +2939,10 @@ gen7_render_composite_spans(struct sna *sna, kgem_set_mode(&sna->kgem, KGEM_RENDER); if (!kgem_check_bo(&sna->kgem, tmp->base.dst.bo, tmp->base.src.bo, - NULL)) + NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(tmp->base.src.bo)) kgem_emit_flush(&sna->kgem); @@ -3072,8 +3078,10 @@ gen7_render_copy_boxes(struct sna *sna, uint8_t alu, tmp.u.gen7.ve_id = 1; kgem_set_mode(&sna->kgem, KGEM_RENDER); - if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) + if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(src_bo)) kgem_emit_flush(&sna->kgem); @@ -3219,8 +3227,10 @@ gen7_render_copy(struct sna *sna, uint8_t alu, op->base.u.gen7.ve_id = 1; kgem_set_mode(&sna->kgem, KGEM_RENDER); - if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) + if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); + _kgem_set_mode(&sna->kgem, KGEM_RENDER); + } if (kgem_bo_is_dirty(src_bo)) kgem_emit_flush(&sna->kgem); diff --git a/src/sna/kgem.h b/src/sna/kgem.h index a455c6a0..363c7f99 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -285,6 +285,8 @@ static inline void kgem_set_mode(struct kgem *kgem, enum kgem_mode mode) static inline void _kgem_set_mode(struct kgem *kgem, enum kgem_mode mode) { + assert(kgem->mode == KGEM_NONE); + kgem->context_switch(kgem, mode); kgem->mode = mode; } diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index eda952f5..6607b118 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -96,14 +96,6 @@ static void nop_done(struct sna *sna, const struct sna_composite_op *op) (void)op; } -static void blt_done(struct sna *sna, const struct sna_composite_op *op) -{ - struct kgem *kgem = &sna->kgem; - - _kgem_set_mode(kgem, KGEM_BLT); - (void)op; -} - static void gen6_blt_copy_done(struct sna *sna, const struct sna_composite_op *op) { struct kgem *kgem = &sna->kgem; @@ -114,8 +106,6 @@ static void gen6_blt_copy_done(struct sna *sna, const struct sna_composite_op *o b[1] = b[2] = 0; kgem->nbatch += 3; } - - _kgem_set_mode(kgem, KGEM_BLT); (void)op; } @@ -919,7 +909,7 @@ prepare_blt_clear(struct sna *sna, op->box = blt_composite_fill_box_no_offset; op->boxes = blt_composite_fill_boxes_no_offset; } - op->done = blt_done; + op->done = nop_done; return sna_blt_fill_init(sna, &op->u.blt, op->dst.bo, @@ -942,7 +932,7 @@ prepare_blt_fill(struct sna *sna, op->box = blt_composite_fill_box_no_offset; op->boxes = blt_composite_fill_boxes_no_offset; } - op->done = blt_done; + op->done = nop_done; return sna_blt_fill_init(sna, &op->u.blt, op->dst.bo, op->dst.pixmap->drawable.bitsPerPixel, @@ -1129,7 +1119,7 @@ prepare_blt_copy(struct sna *sna, if (sna->kgem.gen >= 60) op->done = gen6_blt_copy_done; else - op->done = blt_done; + op->done = nop_done; if (alpha_fixup) { op->blt = blt_composite_copy_with_alpha; @@ -1158,7 +1148,6 @@ static void blt_vmap_done(struct sna *sna, const struct sna_composite_op *op) { struct kgem_bo *bo = (struct kgem_bo *)op->u.blt.src_pixmap; - blt_done(sna, op); if (bo) kgem_bo_destroy(&sna->kgem, bo); } @@ -1740,7 +1729,6 @@ fastcall static void sna_blt_fill_op_boxes(struct sna *sna, static void sna_blt_fill_op_done(struct sna *sna, const struct sna_fill_op *fill) { - blt_done(sna, &fill->base); } bool sna_blt_fill(struct sna *sna, uint8_t alu, @@ -1786,7 +1774,6 @@ static void sna_blt_copy_op_blt(struct sna *sna, static void sna_blt_copy_op_done(struct sna *sna, const struct sna_copy_op *op) { - blt_done(sna, &op->base); } static void gen6_blt_copy_op_done(struct sna *sna, diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h index 27f4909b..c9d2b5f0 100644 --- a/src/sna/sna_render_inline.h +++ b/src/sna/sna_render_inline.h @@ -52,6 +52,7 @@ static inline int batch_space(struct sna *sna) static inline void batch_emit(struct sna *sna, uint32_t dword) { + assert(sna->kgem.mode != KGEM_NONE); assert(sna->kgem.nbatch + KGEM_BATCH_RESERVED < sna->kgem.surface); sna->kgem.batch[sna->kgem.nbatch++] = dword; } |
