ctx->b.initial_gfx_cs_size = ctx->b.rings.gfx.cs->cdw;
si_invalidate_draw_sh_constants(ctx);
+ ctx->last_primitive_restart_en = -1;
+ ctx->last_restart_index = SI_RESTART_INDEX_UNKNOWN;
}
#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 restart 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. */
#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
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 */
}
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,