From 82e6d41c2f4f343bd1854d3d8ee4b624b5d68971 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 31 Oct 2013 13:35:59 +0000 Subject: [PATCH] sna/gen6: Tweak flush around CC state changes In order to fix some font corruption, it appears that we need an extra flush in the Sandybridge pipeline when we change the CC stage and the render cache is dirty. We previously triggered a full pipeline stall for this case. Signed-off-by: Chris Wilson --- src/sna/gen6_render.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index f271cf8..9797ef9 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -866,21 +866,22 @@ gen6_emit_state(struct sna *sna, const struct sna_composite_op *op, uint16_t wm_binding_table) { - bool need_stall = wm_binding_table & 1; + bool need_flush, need_stall; assert(op->dst.bo->exec); - if (gen6_emit_cc(sna, GEN6_BLEND(op->u.gen6.flags))) - need_stall = false; + need_flush = + gen6_emit_cc(sna, GEN6_BLEND(op->u.gen6.flags)) && + wm_binding_table & 1; gen6_emit_sampler(sna, GEN6_SAMPLER(op->u.gen6.flags)); gen6_emit_sf(sna, GEN6_VERTEX(op->u.gen6.flags) >> 2); gen6_emit_wm(sna, GEN6_KERNEL(op->u.gen6.flags), GEN6_VERTEX(op->u.gen6.flags) >> 2); gen6_emit_vertex_elements(sna, op); - need_stall |= gen6_emit_binding_table(sna, wm_binding_table & ~1); + need_stall = gen6_emit_binding_table(sna, wm_binding_table & ~1); if (gen6_emit_drawing_rectangle(sna, op)) need_stall = false; - if (kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo)) { + if (need_flush || kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo)) { gen6_emit_flush(sna); kgem_clear_dirty(&sna->kgem); assert(op->dst.bo->exec); -- 2.7.4