diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-16 13:35:05 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-16 13:37:45 +0000 |
commit | 8b2bb666662305ab88aad8198ad69b1c98407d75 (patch) | |
tree | 2d819a5ec35a0af09fcebef728eb1b8ad2e279eb | |
parent | a11b22d172898ebfc657339a9ca56102ae92592f (diff) |
sna/gen6: Restore the non-pipelined op after every WM binding table update
The hw wants it as demonstrated by the '>' in KDE's menus. Why is it
always KDE that demonstrates coherency problems...
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/gen6_render.c | 16 | ||||
-rw-r--r-- | src/sna/sna_render.h | 1 |
2 files changed, 8 insertions, 9 deletions
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index dd880133..0801e04d 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -708,11 +708,11 @@ gen6_emit_wm(struct sna *sna, unsigned int kernel, int nr_surfaces, int nr_input OUT_BATCH(0); } -static void +static bool gen6_emit_binding_table(struct sna *sna, uint16_t offset) { if (sna->render_state.gen6.surface_table == offset) - return; + return false; /* Binding table pointers */ OUT_BATCH(GEN6_3DSTATE_BINDING_TABLE_POINTERS | @@ -724,6 +724,7 @@ gen6_emit_binding_table(struct sna *sna, uint16_t offset) OUT_BATCH(offset*4); sna->render_state.gen6.surface_table = offset; + return true; } static void @@ -734,8 +735,6 @@ gen6_emit_drawing_rectangle(struct sna *sna, uint32_t limit = (op->dst.height - 1) << 16 | (op->dst.width - 1); uint32_t offset = (uint16_t)op->dst.y << 16 | (uint16_t)op->dst.x; - force |= sna->render_state.gen6.target != op->dst.bo->handle; - if (!force && sna->render_state.gen6.drawrect_limit == limit && sna->render_state.gen6.drawrect_offset == offset) @@ -743,7 +742,6 @@ gen6_emit_drawing_rectangle(struct sna *sna, sna->render_state.gen6.drawrect_offset = offset; sna->render_state.gen6.drawrect_limit = limit; - sna->render_state.gen6.target = op->dst.bo->handle; OUT_BATCH(GEN6_3DSTATE_DRAWING_RECTANGLE | (4 - 2)); OUT_BATCH(0); @@ -864,8 +862,11 @@ gen6_emit_state(struct sna *sna, op->u.gen6.nr_inputs); gen6_emit_vertex_elements(sna, op); - /* XXX updating the binding table requires a non-pipelined cmd? */ - gen6_emit_binding_table(sna, wm_binding_table); + /* XXX updating the binding table requires a non-pipelined cmd? + * The '>' in KDE menus suggest that every binding table update + * requires a subsequent non-pipelined op, or maybe a pipelined flush? + */ + need_flush |= gen6_emit_binding_table(sna, wm_binding_table); gen6_emit_drawing_rectangle(sna, op, need_flush & !flushed); } @@ -3901,7 +3902,6 @@ static void gen6_render_reset(struct sna *sna) sna->render_state.gen6.samplers = -1; sna->render_state.gen6.blend = -1; sna->render_state.gen6.kernel = -1; - sna->render_state.gen6.target = -1; sna->render_state.gen6.drawrect_offset = -1; sna->render_state.gen6.drawrect_limit = -1; sna->render_state.gen6.surface_table = -1; diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h index 04543dec..4346196d 100644 --- a/src/sna/sna_render.h +++ b/src/sna/sna_render.h @@ -391,7 +391,6 @@ struct gen6_render_state { uint32_t blend; uint32_t samplers; uint32_t kernel; - uint32_t target; uint16_t num_sf_outputs; uint16_t vb_id; |