diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index 2d8f2960..2ecfd641 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -1069,6 +1069,7 @@ gen7_emit_pipe_invalidate(struct sna *sna) GEN7_PIPE_CONTROL_CS_STALL); OUT_BATCH(0); OUT_BATCH(0); + sna->render_state.gen7.pipe_controls_since_stall = 0; } inline static void @@ -1077,9 +1078,11 @@ gen7_emit_pipe_flush(struct sna *sna, bool need_stall) unsigned stall; stall = 0; - if (need_stall) - stall = (GEN7_PIPE_CONTROL_CS_STALL | - GEN7_PIPE_CONTROL_STALL_AT_SCOREBOARD); + if (need_stall) { + stall = GEN7_PIPE_CONTROL_CS_STALL; + sna->render_state.gen7.pipe_controls_since_stall = 0; + } else + sna->render_state.gen7.pipe_controls_since_stall++; OUT_BATCH(GEN7_PIPE_CONTROL | (4 - 2)); OUT_BATCH(GEN7_PIPE_CONTROL_WC_FLUSH | stall); @@ -1095,6 +1098,7 @@ gen7_emit_pipe_stall(struct sna *sna) GEN7_PIPE_CONTROL_STALL_AT_SCOREBOARD); OUT_BATCH(0); OUT_BATCH(0); + sna->render_state.gen7.pipe_controls_since_stall = 0; } static void @@ -1124,6 +1128,9 @@ gen7_emit_state(struct sna *sna, need_stall &= gen7_emit_drawing_rectangle(sna, op); if (ALWAYS_STALL) need_stall = true; + if (sna->kgem.gen < 075 && + sna->render_state.gen7.pipe_controls_since_stall >= 3) + need_stall = true; if (need_invalidate) { gen7_emit_pipe_invalidate(sna); @@ -3746,6 +3753,7 @@ gen7_render_clear(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo) } static void gen7_render_reset(struct sna *sna) { + sna->render_state.gen7.pipe_controls_since_stall = 0; sna->render_state.gen7.emit_flush = false; sna->render_state.gen7.needs_invariant = true; sna->render_state.gen7.ve_id = 3 << 2; diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h index 823b86cc..6e1fa480 100644 --- a/src/sna/sna_render.h +++ b/src/sna/sna_render.h @@ -508,6 +508,7 @@ struct gen7_render_state { uint16_t last_primitive; int16_t floats_per_vertex; uint16_t surface_table; + uint16_t pipe_controls_since_stall; bool needs_invariant; bool emit_flush;