[Mesa-dev] [PATCH] tgsi/scan: don't set interp flags for inputs only used by INTERP instructions

Nicolai Hähnle nhaehnle at gmail.com
Mon Sep 12 12:10:05 UTC 2016


Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

On 09.09.2016 16:06, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> radeonsi depends on the interp flags a little bit too much.
>
> This fixes 9 randomly failing tests:
>   GL45-CTS.shader_multisample_interpolation.render.interpolate_at_centroid.*
> ---
>  src/gallium/auxiliary/tgsi/tgsi_scan.c | 105 ++++++++++++++++++---------------
>  1 file changed, 57 insertions(+), 48 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> index a3b0d9f..39e4dd9 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> @@ -95,20 +95,21 @@ computes_derivative(unsigned opcode)
>  }
>
>
>  static void
>  scan_instruction(struct tgsi_shader_info *info,
>                   const struct tgsi_full_instruction *fullinst,
>                   unsigned *current_depth)
>  {
>     unsigned i;
>     bool is_mem_inst = false;
> +   bool is_interp_instruction = false;
>
>     assert(fullinst->Instruction.Opcode < TGSI_OPCODE_LAST);
>     info->opcode_count[fullinst->Instruction.Opcode]++;
>
>     switch (fullinst->Instruction.Opcode) {
>     case TGSI_OPCODE_IF:
>     case TGSI_OPCODE_UIF:
>     case TGSI_OPCODE_BGNLOOP:
>        (*current_depth)++;
>        info->max_depth = MAX2(info->max_depth, *current_depth);
> @@ -120,20 +121,22 @@ scan_instruction(struct tgsi_shader_info *info,
>     default:
>        break;
>     }
>
>     if (fullinst->Instruction.Opcode == TGSI_OPCODE_INTERP_CENTROID ||
>         fullinst->Instruction.Opcode == TGSI_OPCODE_INTERP_OFFSET ||
>         fullinst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE) {
>        const struct tgsi_full_src_register *src0 = &fullinst->Src[0];
>        unsigned input;
>
> +      is_interp_instruction = true;
> +
>        if (src0->Register.Indirect && src0->Indirect.ArrayID)
>           input = info->input_array_first[src0->Indirect.ArrayID];
>        else
>           input = src0->Register.Index;
>
>        /* For the INTERP opcodes, the interpolation is always
>         * PERSPECTIVE unless LINEAR is specified.
>         */
>        switch (info->input_interpolate[input]) {
>        case TGSI_INTERPOLATE_COLOR:
> @@ -183,43 +186,91 @@ scan_instruction(struct tgsi_shader_info *info,
>           if (src->Register.Indirect) {
>              for (ind = 0; ind < info->num_inputs; ++ind) {
>                 info->input_usage_mask[ind] |= usage_mask;
>              }
>           } else {
>              assert(ind >= 0);
>              assert(ind < PIPE_MAX_SHADER_INPUTS);
>              info->input_usage_mask[ind] |= usage_mask;
>           }
>
> -         if (info->processor == PIPE_SHADER_FRAGMENT &&
> -             !src->Register.Indirect) {
> -            unsigned name =
> -               info->input_semantic_name[src->Register.Index];
> -            unsigned index =
> -               info->input_semantic_index[src->Register.Index];
> +         if (info->processor == PIPE_SHADER_FRAGMENT) {
> +            unsigned name, index, input;
> +
> +            if (src->Register.Indirect && src->Indirect.ArrayID)
> +               input = info->input_array_first[src->Indirect.ArrayID];
> +            else
> +               input = src->Register.Index;
> +
> +            name = info->input_semantic_name[input];
> +            index = info->input_semantic_index[input];
>
>              if (name == TGSI_SEMANTIC_POSITION &&
>                  (src->Register.SwizzleX == TGSI_SWIZZLE_Z ||
>                   src->Register.SwizzleY == TGSI_SWIZZLE_Z ||
>                   src->Register.SwizzleZ == TGSI_SWIZZLE_Z ||
>                   src->Register.SwizzleW == TGSI_SWIZZLE_Z))
>                 info->reads_z = TRUE;
>
>              if (name == TGSI_SEMANTIC_COLOR) {
>                 unsigned mask =
>                    (1 << src->Register.SwizzleX) |
>                    (1 << src->Register.SwizzleY) |
>                    (1 << src->Register.SwizzleZ) |
>                    (1 << src->Register.SwizzleW);
>
>                 info->colors_read |= mask << (index * 4);
>              }
> +
> +            /* Process only interpolated varyings. Don't include POSITION.
> +             * Don't include integer varyings, because they are not
> +             * interpolated. Don't process inputs interpolated by INTERP
> +             * opcodes. Those are tracked separately.
> +             */
> +            if ((!is_interp_instruction || i != 0) &&
> +                (name == TGSI_SEMANTIC_GENERIC ||
> +                 name == TGSI_SEMANTIC_TEXCOORD ||
> +                 name == TGSI_SEMANTIC_COLOR ||
> +                 name == TGSI_SEMANTIC_BCOLOR ||
> +                 name == TGSI_SEMANTIC_FOG ||
> +                 name == TGSI_SEMANTIC_CLIPDIST)) {
> +               switch (info->input_interpolate[index]) {
> +               case TGSI_INTERPOLATE_COLOR:
> +               case TGSI_INTERPOLATE_PERSPECTIVE:
> +                  switch (info->input_interpolate_loc[index]) {
> +                  case TGSI_INTERPOLATE_LOC_CENTER:
> +                     info->uses_persp_center = TRUE;
> +                     break;
> +                  case TGSI_INTERPOLATE_LOC_CENTROID:
> +                     info->uses_persp_centroid = TRUE;
> +                     break;
> +                  case TGSI_INTERPOLATE_LOC_SAMPLE:
> +                     info->uses_persp_sample = TRUE;
> +                     break;
> +                  }
> +                  break;
> +               case TGSI_INTERPOLATE_LINEAR:
> +                  switch (info->input_interpolate_loc[index]) {
> +                  case TGSI_INTERPOLATE_LOC_CENTER:
> +                     info->uses_linear_center = TRUE;
> +                     break;
> +                  case TGSI_INTERPOLATE_LOC_CENTROID:
> +                     info->uses_linear_centroid = TRUE;
> +                     break;
> +                  case TGSI_INTERPOLATE_LOC_SAMPLE:
> +                     info->uses_linear_sample = TRUE;
> +                     break;
> +                  }
> +                  break;
> +                  /* TGSI_INTERPOLATE_CONSTANT doesn't do any interpolation. */
> +               }
> +            }
>           }
>        }
>
>        /* check for indirect register reads */
>        if (src->Register.Indirect) {
>           info->indirect_files |= (1 << src->Register.File);
>           info->indirect_files_read |= (1 << src->Register.File);
>        }
>
>        /* Texture samplers */
> @@ -350,62 +401,20 @@ scan_declaration(struct tgsi_shader_info *info,
>           info->input_cylindrical_wrap[reg] = (ubyte)fulldecl->Interp.CylindricalWrap;
>
>           /* Vertex shaders can have inputs with holes between them. */
>           if (info->processor == PIPE_SHADER_VERTEX)
>              info->num_inputs = MAX2(info->num_inputs, reg + 1);
>           else {
>              info->num_inputs++;
>              assert(reg < info->num_inputs);
>           }
>
> -         /* Only interpolated varyings. Don't include POSITION.
> -          * Don't include integer varyings, because they are not
> -          * interpolated.
> -          */
> -         if (semName == TGSI_SEMANTIC_GENERIC ||
> -             semName == TGSI_SEMANTIC_TEXCOORD ||
> -             semName == TGSI_SEMANTIC_COLOR ||
> -             semName == TGSI_SEMANTIC_BCOLOR ||
> -             semName == TGSI_SEMANTIC_FOG ||
> -             semName == TGSI_SEMANTIC_CLIPDIST) {
> -            switch (fulldecl->Interp.Interpolate) {
> -            case TGSI_INTERPOLATE_COLOR:
> -            case TGSI_INTERPOLATE_PERSPECTIVE:
> -               switch (fulldecl->Interp.Location) {
> -               case TGSI_INTERPOLATE_LOC_CENTER:
> -                  info->uses_persp_center = TRUE;
> -                  break;
> -               case TGSI_INTERPOLATE_LOC_CENTROID:
> -                  info->uses_persp_centroid = TRUE;
> -                  break;
> -               case TGSI_INTERPOLATE_LOC_SAMPLE:
> -                  info->uses_persp_sample = TRUE;
> -                  break;
> -               }
> -               break;
> -            case TGSI_INTERPOLATE_LINEAR:
> -               switch (fulldecl->Interp.Location) {
> -               case TGSI_INTERPOLATE_LOC_CENTER:
> -                  info->uses_linear_center = TRUE;
> -                  break;
> -               case TGSI_INTERPOLATE_LOC_CENTROID:
> -                  info->uses_linear_centroid = TRUE;
> -                  break;
> -               case TGSI_INTERPOLATE_LOC_SAMPLE:
> -                  info->uses_linear_sample = TRUE;
> -                  break;
> -               }
> -               break;
> -               /* TGSI_INTERPOLATE_CONSTANT doesn't do any interpolation. */
> -            }
> -         }
> -
>           if (semName == TGSI_SEMANTIC_PRIMID)
>              info->uses_primid = TRUE;
>           else if (procType == PIPE_SHADER_FRAGMENT) {
>              if (semName == TGSI_SEMANTIC_POSITION)
>                 info->reads_position = TRUE;
>              else if (semName == TGSI_SEMANTIC_FACE)
>                 info->uses_frontface = TRUE;
>           }
>        }
>        else if (file == TGSI_FILE_SYSTEM_VALUE) {
>


More information about the mesa-dev mailing list