summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-12-05 15:13:24 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2016-12-05 21:37:49 +0000
commit4acd4a7d3d2f41227022fa7581cfb85a0b124eae (patch)
treee232e639eb23362ad4fb3cb1728515dc52bbba8e
parent9ac7a3370ab265d4cbdbbf3dc588af88c37048e1 (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.c16
-rw-r--r--src/sna/sna_render.h1
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 {