From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeonsi/si_hw_context.c |  2 ++
 src/gallium/drivers/radeonsi/si_pipe.h       |  9 ++++++---
 src/gallium/drivers/radeonsi/si_state_draw.c | 16 ++++++++++++++--
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c 
b/src/gallium/drivers/radeonsi/si_hw_context.c
index 5d46365..a7e29b1 100644
--- a/src/gallium/drivers/radeonsi/si_hw_context.c
+++ b/src/gallium/drivers/radeonsi/si_hw_context.c
@@ -158,4 +158,6 @@ void si_begin_new_cs(struct si_context *ctx)
        ctx->last_base_vertex = SI_BASE_VERTEX_UNKNOWN;
        ctx->last_start_instance = -1; /* reset to an unknown value */
        ctx->last_sh_base_reg = -1; /* reset to an unknown value */
+       ctx->last_primitive_restart_en = -1;
+       ctx->last_restart_index = SI_RESTART_INDEX_UNKNOWN;
 }
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index cc497af..b4a1ea0 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -34,10 +34,11 @@
 #define SI_BIG_ENDIAN 0
 #endif
 
-/* The base vertex can be any number, but we must pick one which
- * will mean "unknown" for the purpose of state tracking and the number
- * shouldn't be a commonly-used one. */
+/* The base vertex and primitive restartcan be any number, but we must pick
+ * one which will mean "unknown" for the purpose of state tracking and
+ * the number shouldn't be a commonly-used one. */
 #define SI_BASE_VERTEX_UNKNOWN INT_MIN
+#define SI_RESTART_INDEX_UNKNOWN INT_MIN
 
 #define SI_TRACE_CS 0
 #define SI_TRACE_CS_DWORDS             6
@@ -179,6 +180,8 @@ struct si_context {
        int                     last_base_vertex;
        int                     last_start_instance;
        int                     last_sh_base_reg;
+       int                     last_primitive_restart_en;
+       int                     last_restart_index;
 };
 
 /* si_blit.c */
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c 
b/src/gallium/drivers/radeonsi/si_state_draw.c
index 3e581ab..fedf19b 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -193,8 +193,20 @@ static void si_emit_draw_registers(struct si_context *sctx,
        }
 
        r600_write_context_reg(cs, R_028A6C_VGT_GS_OUT_PRIM_TYPE, gs_out_prim);
-       r600_write_context_reg(cs, R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX, 
info->restart_index);
-       r600_write_context_reg(cs, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, 
info->primitive_restart);
+
+       /* Primitive restart. */
+       if (info->primitive_restart != sctx->last_primitive_restart_en) {
+               r600_write_context_reg(cs, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, 
info->primitive_restart);
+               sctx->last_primitive_restart_en = info->primitive_restart;
+
+               if (info->primitive_restart &&
+                   (info->restart_index != sctx->last_restart_index ||
+                    sctx->last_restart_index == SI_RESTART_INDEX_UNKNOWN)) {
+                       r600_write_context_reg(cs, 
R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX,
+                                              info->restart_index);
+                       sctx->last_restart_index = info->restart_index;
+               }
+       }
 }
 
 static void si_emit_draw_packets(struct si_context *sctx,
-- 
2.1.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to