From: Nicolai Hähnle <[email protected]>

We will merge other derived state information into this register.
---
 src/gallium/drivers/radeonsi/si_hw_context.c |  1 +
 src/gallium/drivers/radeonsi/si_pipe.h       |  2 ++
 src/gallium/drivers/radeonsi/si_shader.h     |  5 +++++
 src/gallium/drivers/radeonsi/si_state.c      |  6 ++++--
 src/gallium/drivers/radeonsi/si_state.h      |  1 +
 src/gallium/drivers/radeonsi/si_state_draw.c | 14 ++++++++++++++
 6 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c 
b/src/gallium/drivers/radeonsi/si_hw_context.c
index c80b884..e51abfc 100644
--- a/src/gallium/drivers/radeonsi/si_hw_context.c
+++ b/src/gallium/drivers/radeonsi/si_hw_context.c
@@ -250,17 +250,18 @@ void si_begin_new_cs(struct si_context *ctx)
         * the first draw call. */
        si_invalidate_draw_sh_constants(ctx);
        ctx->last_index_size = -1;
        ctx->last_primitive_restart_en = -1;
        ctx->last_restart_index = SI_RESTART_INDEX_UNKNOWN;
        ctx->last_gs_out_prim = -1;
        ctx->last_prim = -1;
        ctx->last_multi_vgt_param = -1;
        ctx->last_rast_prim = -1;
        ctx->last_sc_line_stipple = ~0;
+       ctx->last_vs_state = ~0;
        ctx->last_ls = NULL;
        ctx->last_tcs = NULL;
        ctx->last_tes_sh_base = -1;
        ctx->last_num_tcs_input_cp = -1;
 
        ctx->cs_shader_state.initialized = false;
 }
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index daf2932..0978831 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -341,20 +341,22 @@ struct si_context {
        int                     last_start_instance;
        int                     last_drawid;
        int                     last_sh_base_reg;
        int                     last_primitive_restart_en;
        int                     last_restart_index;
        int                     last_gs_out_prim;
        int                     last_prim;
        int                     last_multi_vgt_param;
        int                     last_rast_prim;
        unsigned                last_sc_line_stipple;
+       unsigned                current_vs_state;
+       unsigned                last_vs_state;
        enum pipe_prim_type     current_rast_prim; /* primitive type after TES, 
GS */
        bool                    gs_tri_strip_adj_fix;
 
        /* Scratch buffer */
        struct r600_atom        scratch_state;
        struct r600_resource    *scratch_buffer;
        unsigned                scratch_waves;
        unsigned                spi_tmpring_size;
 
        struct r600_resource    *compute_scratch_buffer;
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index 17ffc5d..4a0f270 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -219,20 +219,25 @@ enum {
 
        /* CS only parameters */
        SI_PARAM_GRID_SIZE = SI_NUM_RESOURCE_PARAMS,
        SI_PARAM_BLOCK_SIZE,
        SI_PARAM_BLOCK_ID,
        SI_PARAM_THREAD_ID,
 
        SI_NUM_PARAMS = SI_PARAM_POS_FIXED_PT + 9, /* +8 for COLOR[0..1] */
 };
 
+/* Fields of driver-defined VS state SGPR. */
+/* Clamp vertex color output (only used in VS as VS). */
+#define S_VS_STATE_CLAMP_VERTEX_COLOR(x)       (((unsigned)(x) & 0x1) << 0)
+#define C_VS_STATE_CLAMP_VERTEX_COLOR          0xFFFFFFFE
+
 /* SI-specific system values. */
 enum {
        TGSI_SEMANTIC_DEFAULT_TESSOUTER_SI = TGSI_SEMANTIC_COUNT,
        TGSI_SEMANTIC_DEFAULT_TESSINNER_SI,
 };
 
 /* For VS shader key fix_fetch. */
 enum {
        SI_FIX_FETCH_NONE = 0,
        SI_FIX_FETCH_A2_SNORM,
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index 4a6b615..a55f024 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -789,20 +789,21 @@ static void *si_create_rs_state(struct pipe_context *ctx,
        rs->multisample_enable = state->multisample;
        rs->force_persample_interp = state->force_persample_interp;
        rs->clip_plane_enable = state->clip_plane_enable;
        rs->line_stipple_enable = state->line_stipple_enable;
        rs->poly_stipple_enable = state->poly_stipple_enable;
        rs->line_smooth = state->line_smooth;
        rs->poly_smooth = state->poly_smooth;
        rs->uses_poly_offset = state->offset_point || state->offset_line ||
                               state->offset_tri;
        rs->clamp_fragment_color = state->clamp_fragment_color;
+       rs->clamp_vertex_color = state->clamp_vertex_color;
        rs->flatshade = state->flatshade;
        rs->sprite_coord_enable = state->sprite_coord_enable;
        rs->rasterizer_discard = state->rasterizer_discard;
        rs->pa_sc_line_stipple = state->line_stipple_enable ?
                                
S_028A0C_LINE_PATTERN(state->line_stipple_pattern) |
                                
S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0;
        rs->pa_cl_clip_cntl =
                S_028810_DX_CLIP_SPACE_DEF(state->clip_halfz) |
                S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
                S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
@@ -855,22 +856,20 @@ static void *si_create_rs_state(struct pipe_context *ctx,
                S_028814_CULL_FRONT((state->cull_face & PIPE_FACE_FRONT) ? 1 : 
0) |
                S_028814_CULL_BACK((state->cull_face & PIPE_FACE_BACK) ? 1 : 0) 
|
                S_028814_FACE(!state->front_ccw) |
                S_028814_POLY_OFFSET_FRONT_ENABLE(util_get_offset(state, 
state->fill_front)) |
                S_028814_POLY_OFFSET_BACK_ENABLE(util_get_offset(state, 
state->fill_back)) |
                S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_point || 
state->offset_line) |
                S_028814_POLY_MODE(state->fill_front != PIPE_POLYGON_MODE_FILL 
||
                                   state->fill_back != PIPE_POLYGON_MODE_FILL) |
                
S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) |
                
S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back)));
-       si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0 +
-                      SI_SGPR_VS_STATE_BITS * 4, state->clamp_vertex_color);
 
        /* Precalculate polygon offset states for 16-bit, 24-bit, and 32-bit 
zbuffers. */
        for (i = 0; i < 3; i++) {
                struct si_pm4_state *pm4 = &rs->pm4_poly_offset[i];
                float offset_units = state->offset_units;
                float offset_scale = state->offset_scale * 16.0f;
                uint32_t pa_su_poly_offset_db_fmt_cntl = 0;
 
                if (!state->offset_units_unscaled) {
                        switch (i) {
@@ -919,20 +918,23 @@ static void si_bind_rs_state(struct pipe_context *ctx, 
void *state)
 
        if (!old_rs || old_rs->multisample_enable != rs->multisample_enable) {
                si_mark_atom_dirty(sctx, &sctx->db_render_state);
 
                /* Update the small primitive filter workaround if necessary. */
                if (sctx->screen->has_msaa_sample_loc_bug &&
                    sctx->framebuffer.nr_samples > 1)
                        si_mark_atom_dirty(sctx, &sctx->msaa_sample_locs.atom);
        }
 
+       sctx->current_vs_state &= C_VS_STATE_CLAMP_VERTEX_COLOR;
+       sctx->current_vs_state |= 
S_VS_STATE_CLAMP_VERTEX_COLOR(rs->clamp_vertex_color);
+
        r600_viewport_set_rast_deps(&sctx->b, rs->scissor_enable, 
rs->clip_halfz);
 
        si_pm4_bind_state(sctx, rasterizer, rs);
        si_update_poly_offset_state(sctx);
 
        si_mark_atom_dirty(sctx, &sctx->clip_regs);
        sctx->ia_multi_vgt_param_key.u.line_stipple_enabled =
                rs->line_stipple_enable;
        sctx->do_update_shaders = true;
 }
diff --git a/src/gallium/drivers/radeonsi/si_state.h 
b/src/gallium/drivers/radeonsi/si_state.h
index aad1c83..6257299 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -67,20 +67,21 @@ struct si_state_rasterizer {
        bool                    line_stipple_enable;
        unsigned                sprite_coord_enable;
        unsigned                pa_sc_line_stipple;
        unsigned                pa_cl_clip_cntl;
        unsigned                clip_plane_enable;
        bool                    poly_stipple_enable;
        bool                    line_smooth;
        bool                    poly_smooth;
        bool                    uses_poly_offset;
        bool                    clamp_fragment_color;
+       bool                    clamp_vertex_color;
        bool                    rasterizer_discard;
        bool                    scissor_enable;
        bool                    clip_halfz;
 };
 
 struct si_dsa_stencil_ref_part {
        uint8_t                 valuemask[2];
        uint8_t                 writemask[2];
 };
 
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c 
b/src/gallium/drivers/radeonsi/si_state_draw.c
index 65b33ce..54e02d2 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -487,20 +487,33 @@ static void si_emit_rasterizer_prim_state(struct 
si_context *sctx)
         * reset the stipple pattern at each packet (line strips, line loops).
         */
        radeon_set_context_reg(cs, R_028A0C_PA_SC_LINE_STIPPLE,
                rs->pa_sc_line_stipple |
                S_028A0C_AUTO_RESET_CNTL(rast_prim == PIPE_PRIM_LINES ? 1 : 2));
 
        sctx->last_rast_prim = rast_prim;
        sctx->last_sc_line_stipple = rs->pa_sc_line_stipple;
 }
 
+static void si_emit_vs_state(struct si_context *sctx)
+{
+       if (sctx->current_vs_state != sctx->last_vs_state) {
+               struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
+
+               radeon_set_sh_reg(cs,
+                       R_00B130_SPI_SHADER_USER_DATA_VS_0 + 
SI_SGPR_VS_STATE_BITS * 4,
+                       sctx->current_vs_state);
+
+               sctx->last_vs_state = sctx->current_vs_state;
+       }
+}
+
 static void si_emit_draw_registers(struct si_context *sctx,
                                   const struct pipe_draw_info *info,
                                   unsigned num_patches)
 {
        struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
        unsigned prim = si_conv_pipe_prim(info->mode);
        unsigned gs_out_prim = si_conv_prim_to_gs_out(sctx->current_rast_prim);
        unsigned ia_multi_vgt_param;
 
        ia_multi_vgt_param = si_get_ia_multi_vgt_param(sctx, info, num_patches);
@@ -1284,20 +1297,21 @@ void si_draw_vbo(struct pipe_context *ctx, const struct 
pipe_draw_info *info)
                        continue;
 
                si_pm4_emit(sctx, state);
                sctx->emitted.array[i] = state;
        }
        sctx->dirty_states = 0;
 
        si_emit_rasterizer_prim_state(sctx);
        if (sctx->tes_shader.cso)
                si_emit_derived_tess_state(sctx, info, &num_patches);
+       si_emit_vs_state(sctx);
        si_emit_draw_registers(sctx, info, num_patches);
 
        si_ce_pre_draw_synchronization(sctx);
        si_emit_draw_packets(sctx, info, ib);
        si_ce_post_draw_synchronization(sctx);
 
        if (sctx->trace_buf)
                si_trace_emit(sctx);
 
        /* Workaround for a VGT hang when streamout is enabled.
-- 
2.9.3

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to