radeonsi: emit primitive restart only if it changes

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
Marek Olšák
2014-12-07 20:14:41 +01:00
parent 3382036946
commit 34350131de
3 changed files with 22 additions and 5 deletions
@@ -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;
}
+6 -3
View File
@@ -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 */
+14 -2
View File
@@ -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,