From 1f4bb3826464e2ce1d3f47183c96e6e7fde9a1d7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 15 Mar 2015 19:21:31 +0100 Subject: [PATCH] radeonsi: don't emit PA_SC_LINE_STIPPLE after every rasterizer state change MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Do it only when the line stipple state is changed. Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_hw_context.c | 1 + src/gallium/drivers/radeonsi/si_pipe.h | 2 +- src/gallium/drivers/radeonsi/si_state.c | 4 ---- src/gallium/drivers/radeonsi/si_state_draw.c | 7 +++++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c b/src/gallium/drivers/radeonsi/si_hw_context.c index 30bf41f..313ced7 100644 --- a/src/gallium/drivers/radeonsi/si_hw_context.c +++ b/src/gallium/drivers/radeonsi/si_hw_context.c @@ -161,5 +161,6 @@ void si_begin_new_cs(struct si_context *ctx) ctx->last_prim = -1; ctx->last_multi_vgt_param = -1; ctx->last_rast_prim = -1; + ctx->last_sc_line_stipple = ~0; ctx->emit_scratch_reloc = true; } diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 8cfaf70..29f01f3 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -162,7 +162,6 @@ struct si_context { struct si_framebuffer framebuffer; struct si_vertex_element *vertex_elements; - unsigned pa_sc_line_stipple; /* for saving when using blitter */ struct pipe_stencil_ref stencil_ref; /* shaders */ @@ -227,6 +226,7 @@ struct si_context { int last_prim; int last_multi_vgt_param; int last_rast_prim; + unsigned last_sc_line_stipple; int current_rast_prim; /* primitive type after TES, GS */ /* Scratch buffer */ diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index e3e6fa4..4bb6f2b 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -705,9 +705,6 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state) if (state == NULL) return; - // TODO - sctx->pa_sc_line_stipple = rs->pa_sc_line_stipple; - if (sctx->framebuffer.nr_samples > 1 && (!old_rs || old_rs->multisample_enable != rs->multisample_enable)) sctx->db_render_state.dirty = true; @@ -716,7 +713,6 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state) si_update_fb_rs_state(sctx); sctx->clip_regs.dirty = true; - sctx->last_rast_prim = -1; /* reset this so that it gets updated */ } static void si_delete_rs_state(struct pipe_context *ctx, void *state) diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index b68e493..7523c2a 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -154,16 +154,19 @@ static void si_emit_rasterizer_prim_state(struct si_context *sctx) { struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs; unsigned rast_prim = sctx->current_rast_prim; + struct si_state_rasterizer *rs = sctx->emitted.named.rasterizer; - if (rast_prim == sctx->last_rast_prim) + if (rast_prim == sctx->last_rast_prim && + rs->pa_sc_line_stipple == sctx->last_sc_line_stipple) return; r600_write_context_reg(cs, R_028A0C_PA_SC_LINE_STIPPLE, - sctx->pa_sc_line_stipple | + rs->pa_sc_line_stipple | S_028A0C_AUTO_RESET_CNTL(rast_prim == PIPE_PRIM_LINES ? 1 : rast_prim == PIPE_PRIM_LINE_STRIP ? 2 : 0)); sctx->last_rast_prim = rast_prim; + sctx->last_sc_line_stipple = rs->pa_sc_line_stipple; } static void si_emit_draw_registers(struct si_context *sctx, -- 2.7.4