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