summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/vc4/vc4_context.c6
-rw-r--r--src/gallium/drivers/vc4/vc4_draw.c5
2 files changed, 11 insertions, 0 deletions
diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c
index bcbb0049fb9..205f81d5c89 100644
--- a/src/gallium/drivers/vc4/vc4_context.c
+++ b/src/gallium/drivers/vc4/vc4_context.c
@@ -319,6 +319,12 @@ vc4_flush(struct pipe_context *pctx)
vc4->needs_flush = false;
vc4->draw_call_queued = false;
+
+ /* We have no hardware context saved between our draw calls, so we
+ * need to flag the next draw as needing all state emitted. Emitting
+ * all state at the start of our draws is also what ensures that we
+ * return to the state we need after a previous tile has finished.
+ */
vc4->dirty = ~0;
vc4->resolve = 0;
vc4->cleared = 0;
diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c
index 0938a76e000..f3c225de399 100644
--- a/src/gallium/drivers/vc4/vc4_draw.c
+++ b/src/gallium/drivers/vc4/vc4_draw.c
@@ -78,6 +78,11 @@ vc4_start_draw(struct vc4_context *vc4)
VC4_BIN_CONFIG_ALLOC_BLOCK_SIZE_32 |
VC4_BIN_CONFIG_ALLOC_INIT_BLOCK_SIZE_32);
+ /* START_TILE_BINNING resets the statechange counters in the hardware,
+ * which are what is used when a primitive is binned to a tile to
+ * figure out what new state packets need to be written to that tile's
+ * command list.
+ */
cl_u8(&vc4->bcl, VC4_PACKET_START_TILE_BINNING);
vc4->needs_flush = true;