diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_hw_context.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_pipe.h | 9 | ||||
-rw-r--r-- | 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 6c2734eac29..0bbc381bc9c 100644 --- a/src/gallium/drivers/radeonsi/si_hw_context.c +++ b/src/gallium/drivers/radeonsi/si_hw_context.c @@ -156,4 +156,6 @@ void si_begin_new_cs(struct si_context *ctx) 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; } diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index e3cc09a0b85..471a55440d6 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 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 @@ -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 f9ff0e34c17..40a55c50fe9 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, |