[Mesa-dev] [PATCH v2] tgsi/scan: add uses_derivatives (v2)

Roland Scheidegger sroland at vmware.com
Wed Jun 1 17:20:36 UTC 2016


Reviewed-by: Roland Scheidegger <sroland at vmware.com>

Am 01.06.2016 um 17:32 schrieb Nicolai Hähnle:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
> 
> v2:
> - TG4 does not calculate derivatives (Ilia)
> - also handle SAMPLE* instructions (Roland)
> 
> Cc: 12.0 <mesa-stable at lists.freedesktop.org>
> Reviewed-by: Marek Olšák <marek.olsak at amd.com> (v1)
> Reviewed-by: Brian Paul <brianp at vmware.com> (v1)
> --
> This looks increasingly like something that might better live in the opcode
> info table. Maybe in a separate cleanup so as not to churn stable too much.
> ---
>  src/gallium/auxiliary/tgsi/tgsi_scan.c | 30 ++++++++++++++++++++++++++++++
>  src/gallium/auxiliary/tgsi/tgsi_scan.h |  1 +
>  2 files changed, 31 insertions(+)
> 
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> index 1baf031..98d86fc 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> @@ -68,6 +68,33 @@ is_texture_inst(unsigned opcode)
>             tgsi_get_opcode_info(opcode)->is_tex);
>  }
>  
> +
> +/**
> + * Is the opcode an instruction which computes a derivative explicitly or
> + * implicitly?
> + */
> +static bool
> +computes_derivative(unsigned opcode)
> +{
> +   if (tgsi_get_opcode_info(opcode)->is_tex) {
> +      return opcode != TGSI_OPCODE_TG4 &&
> +             opcode != TGSI_OPCODE_TXD &&
> +             opcode != TGSI_OPCODE_TXF &&
> +             opcode != TGSI_OPCODE_TXL &&
> +             opcode != TGSI_OPCODE_TXL2 &&
> +             opcode != TGSI_OPCODE_TXQ &&
> +             opcode != TGSI_OPCODE_TXQ_LZ &&
> +             opcode != TGSI_OPCODE_TXQS;
> +   }
> +
> +   return opcode == TGSI_OPCODE_DDX || opcode == TGSI_OPCODE_DDX_FINE ||
> +          opcode == TGSI_OPCODE_DDY || opcode == TGSI_OPCODE_DDY_FINE ||
> +          opcode == TGSI_OPCODE_SAMPLE ||
> +          opcode == TGSI_OPCODE_SAMPLE_B ||
> +          opcode == TGSI_OPCODE_SAMPLE_C;
> +}
> +
> +
>  static void
>  scan_instruction(struct tgsi_shader_info *info,
>                   const struct tgsi_full_instruction *fullinst,
> @@ -263,6 +290,9 @@ scan_instruction(struct tgsi_shader_info *info,
>     if (is_mem_inst)
>        info->num_memory_instructions++;
>  
> +   if (computes_derivative(fullinst->Instruction.Opcode))
> +      info->uses_derivatives = true;
> +
>     info->num_instructions++;
>  }
>       
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h
> index 31adce7..f7eefa4 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h
> @@ -115,6 +115,7 @@ struct tgsi_shader_info
>     boolean writes_memory; /**< contains stores or atomics to buffers or images */
>     boolean is_msaa_sampler[PIPE_MAX_SAMPLERS];
>     boolean uses_doubles; /**< uses any of the double instructions */
> +   boolean uses_derivatives;
>     unsigned clipdist_writemask;
>     unsigned culldist_writemask;
>     unsigned num_written_culldistance;
> 



More information about the mesa-dev mailing list