From: Constantine Kharlamov Date: Sun, 2 Apr 2017 17:33:06 +0000 (+0300) Subject: r600g: check rasterizer primitive states like in radeonsi X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6ee486899b7fac43fc97a5a80bc090db349d374f;p=mesa.git r600g: check rasterizer primitive states like in radeonsi Specifically, non-line primitives skipped, and defaulting to reset on each packet. The skip of non-line primitives saves ≈110 resetting of PA_SC_LINE_STIPPLE register per frame in Kane&Lynch2. Signed-off-by: Constantine Kharlamov Signed-off-by: Marek Olšák Tested-by: Dieter Nützel --- diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index e4d16609339..4de2a7344b2 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -1670,19 +1670,24 @@ void r600_emit_clip_misc_state(struct r600_context *rctx, struct r600_atom *atom static inline void r600_emit_rasterizer_prim_state(struct r600_context *rctx) { struct radeon_winsys_cs *cs = rctx->b.gfx.cs; - unsigned ls_mask = 0; enum pipe_prim_type rast_prim = rctx->current_rast_prim; - if (rast_prim == rctx->last_rast_prim) + + /* Skip this if not rendering lines. */ + if (rast_prim != PIPE_PRIM_LINES && + rast_prim != PIPE_PRIM_LINE_LOOP && + rast_prim != PIPE_PRIM_LINE_STRIP && + rast_prim != PIPE_PRIM_LINES_ADJACENCY && + rast_prim != PIPE_PRIM_LINE_STRIP_ADJACENCY) return; - if (rast_prim == PIPE_PRIM_LINES) - ls_mask = 1; - else if (rast_prim == PIPE_PRIM_LINE_STRIP || - rast_prim == PIPE_PRIM_LINE_LOOP) - ls_mask = 2; + if (rast_prim == rctx->last_rast_prim) + return; + /* For lines, reset the stipple pattern at each primitive. Otherwise, + * reset the stipple pattern at each packet (line strips, line loops). + */ radeon_set_context_reg(cs, R_028A0C_PA_SC_LINE_STIPPLE, - S_028A0C_AUTO_RESET_CNTL(ls_mask) | + S_028A0C_AUTO_RESET_CNTL(rast_prim == PIPE_PRIM_LINES ? 1 : 2) | (rctx->rasterizer ? rctx->rasterizer->pa_sc_line_stipple : 0)); rctx->last_rast_prim = rast_prim; }