radeonsi: don't emit PA_SC_LINE_STIPPLE after every rasterizer state change
authorMarek Olšák <marek.olsak@amd.com>
Sun, 15 Mar 2015 18:21:31 +0000 (19:21 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 16 Mar 2015 11:54:19 +0000 (12:54 +0100)
Do it only when the line stipple state is changed.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeonsi/si_hw_context.c
src/gallium/drivers/radeonsi/si_pipe.h
src/gallium/drivers/radeonsi/si_state.c
src/gallium/drivers/radeonsi/si_state_draw.c

index 30bf41f..313ced7 100644 (file)
@@ -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;
 }
index 8cfaf70..29f01f3 100644 (file)
@@ -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 */
index e3e6fa4..4bb6f2b 100644 (file)
@@ -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)
index b68e493..7523c2a 100644 (file)
@@ -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,