diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-05 15:13:24 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-05 21:37:49 +0000 |
commit | 4acd4a7d3d2f41227022fa7581cfb85a0b124eae (patch) | |
tree | e232e639eb23362ad4fb3cb1728515dc52bbba8e | |
parent | 9ac7a3370ab265d4cbdbbf3dc588af88c37048e1 (diff) |
sna/gen9: Emit a dummy primitive between VertexElements
References: https://bugs.freedesktop.org/show_bug.cgi?id=98999
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/gen9_render.c | 16 | ||||
-rw-r--r-- | src/sna/sna_render.h | 1 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/sna/gen9_render.c b/src/sna/gen9_render.c index 56c1b8d1..5f6b5428 100644 --- a/src/sna/gen9_render.c +++ b/src/sna/gen9_render.c @@ -1101,6 +1101,17 @@ gen9_emit_vertex_elements(struct sna *sna, return; render->ve_id = id; + if (render->ve_dirty) { + /* dummy primitive to flush vertex before change? */ + OUT_BATCH(GEN9_3DPRIMITIVE | (7 - 2)); + OUT_BATCH(0); /* ignored, see VF_TOPOLOGY */ + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(1); /* single instance */ + OUT_BATCH(0); /* start instance location */ + OUT_BATCH(0); /* index buffer offset, ignored */ + } + /* The VUE layout * dword 0-3: pad (0.0, 0.0, 0.0. 0.0) * dword 4-7: position (x, y, 1.0, 1.0), @@ -1198,6 +1209,8 @@ gen9_emit_vertex_elements(struct sna *sna, offset << VE_OFFSET_SHIFT); OUT_BATCH(dw); } + + render->ve_dirty = true; } inline static void @@ -1322,6 +1335,7 @@ static bool gen9_magic_ca_pass(struct sna *sna, OUT_BATCH(0); /* index buffer offset, ignored */ state->last_primitive = sna->kgem.nbatch; + state->ve_dirty = false; return true; } @@ -1508,6 +1522,7 @@ static void gen9_emit_primitive(struct sna *sna) sna->render.vertex_start = sna->render.vertex_index; sna->render_state.gen9.last_primitive = sna->kgem.nbatch; + sna->render_state.gen9.ve_dirty = false; } static bool gen9_rectangle_begin(struct sna *sna, @@ -3967,6 +3982,7 @@ static void gen9_render_reset(struct sna *sna) sna->render_state.gen9.emit_flush = false; sna->render_state.gen9.needs_invariant = true; sna->render_state.gen9.ve_id = 3 << 2; + sna->render_state.gen9.ve_dirty = false; sna->render_state.gen9.last_primitive = -1; sna->render_state.gen9.num_sf_outputs = 0; diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h index aa2e6766..4ba345a7 100644 --- a/src/sna/sna_render.h +++ b/src/sna/sna_render.h @@ -623,6 +623,7 @@ struct gen9_render_state { bool needs_invariant; bool emit_flush; + bool ve_dirty; }; struct sna_static_stream { |