radeonsi: don't interpolate colors if flatshading is enabled
authorMarek Olšák <marek.olsak@amd.com>
Thu, 30 Jun 2016 11:28:49 +0000 (13:28 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 4 Jul 2016 22:47:12 +0000 (00:47 +0200)
use v_interp_mov for those

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader.h
src/gallium/drivers/radeonsi/si_state_shaders.c

index abd5885..423eed1 100644 (file)
@@ -1528,6 +1528,11 @@ static void declare_input_fs(
                interp_param = get_interp_param(ctx, interp_param_idx);
        }
 
+       if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR &&
+           decl->Interp.Interpolate == TGSI_INTERPOLATE_COLOR &&
+           ctx->shader->key.ps.prolog.flatshade_colors)
+               interp_param = NULL; /* load the constant color */
+
        interp_fs_input(ctx, input_index, decl->Semantic.Name,
                        decl->Semantic.Index, shader->selector->info.num_inputs,
                        shader->selector->info.colors_read, interp_param,
@@ -6443,6 +6448,7 @@ void si_dump_shader_key(unsigned shader, union si_shader_key *key, FILE *f)
 
        case PIPE_SHADER_FRAGMENT:
                fprintf(f, "  prolog.color_two_side = %u\n", key->ps.prolog.color_two_side);
+               fprintf(f, "  prolog.flatshade_colors = %u\n", key->ps.prolog.flatshade_colors);
                fprintf(f, "  prolog.poly_stipple = %u\n", key->ps.prolog.poly_stipple);
                fprintf(f, "  prolog.force_persp_sample_interp = %u\n", key->ps.prolog.force_persp_sample_interp);
                fprintf(f, "  prolog.force_linear_sample_interp = %u\n", key->ps.prolog.force_linear_sample_interp);
@@ -7585,6 +7591,7 @@ static bool si_shader_select_ps_parts(struct si_screen *sscreen,
                }
 
                for (i = 0; i < 2; i++) {
+                       unsigned interp = info->input_interpolate[color[i]];
                        unsigned location = info->input_interpolate_loc[color[i]];
 
                        if (!(info->colors_read & (0xf << i*4)))
@@ -7592,7 +7599,11 @@ static bool si_shader_select_ps_parts(struct si_screen *sscreen,
 
                        prolog_key.ps_prolog.color_attr_index[i] = color[i];
 
-                       switch (info->input_interpolate[color[i]]) {
+                       if (shader->key.ps.prolog.flatshade_colors &&
+                           interp == TGSI_INTERPOLATE_COLOR)
+                               interp = TGSI_INTERPOLATE_CONSTANT;
+
+                       switch (interp) {
                        case TGSI_INTERPOLATE_CONSTANT:
                                prolog_key.ps_prolog.color_interp_vgpr_index[i] = -1;
                                break;
index 3b7b3e1..14ef4e7 100644 (file)
@@ -311,7 +311,7 @@ struct si_tcs_epilog_bits {
 /* Common PS bits between the shader key and the prolog key. */
 struct si_ps_prolog_bits {
        unsigned        color_two_side:1;
-       /* TODO: add a flatshade bit that skips interpolation for colors */
+       unsigned        flatshade_colors:1;
        unsigned        poly_stipple:1;
        unsigned        force_persp_sample_interp:1;
        unsigned        force_linear_sample_interp:1;
index dc4f187..f78d082 100644 (file)
@@ -917,6 +917,7 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
                        bool is_line = !is_poly && sctx->current_rast_prim != PIPE_PRIM_POINTS;
 
                        key->ps.prolog.color_two_side = rs->two_side && sel->info.colors_read;
+                       key->ps.prolog.flatshade_colors = rs->flatshade && sel->info.colors_read;
 
                        if (sctx->queued.named.blend) {
                                key->ps.epilog.alpha_to_one = sctx->queued.named.blend->alpha_to_one &&