summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-16 13:35:05 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-16 13:37:45 +0000
commit8b2bb666662305ab88aad8198ad69b1c98407d75 (patch)
tree2d819a5ec35a0af09fcebef728eb1b8ad2e279eb
parenta11b22d172898ebfc657339a9ca56102ae92592f (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.c16
-rw-r--r--src/sna/sna_render.h1
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;