[Mesa-dev] [PATCH 2/2] nir: Expose nir_remove_unused_io_vars().

Timothy Arceri tarceri at itsqueeze.com
Wed Oct 3 00:27:09 UTC 2018


On 29/9/18 5:52 am, Eric Anholt wrote:
> For gallium drivers where you want to do some linking at variant compile
> time, you don't have the other producer/consumer shader on hand to modify.
> By exposing the inner function, the driver can have the used varyings in
> the compiled shader cache key and still do linking.
> 
> This is also useful for V3D, where the binning shader wants to only output
> position and TF varyings.  We've been removing those after nir_lower_io,
> but this will be less driver-specific code and let more of the shader get
> DCEed early in NIR.
> ---
>   src/compiler/nir/nir.h                 |  3 +++
>   src/compiler/nir/nir_linking_helpers.c | 32 +++++++++++++++++++-------
>   2 files changed, 27 insertions(+), 8 deletions(-)
> 
> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> index e0df95c391c9..387efc8595e4 100644
> --- a/src/compiler/nir/nir.h
> +++ b/src/compiler/nir/nir.h
> @@ -2755,6 +2755,9 @@ void nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
>   
>   /* Some helpers to do very simple linking */
>   bool nir_remove_unused_varyings(nir_shader *producer, nir_shader *consumer);
> +bool nir_remove_unused_io_vars(nir_shader *shader, struct exec_list *var_list,
> +                               uint64_t *used_by_other_stage,
> +                               uint64_t *used_by_other_stage_patches);
>   void nir_compact_varyings(nir_shader *producer, nir_shader *consumer,
>                             bool default_to_smooth_interp);
>   
> diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c
> index 7446bb826f97..85677b7c176a 100644
> --- a/src/compiler/nir/nir_linking_helpers.c
> +++ b/src/compiler/nir/nir_linking_helpers.c
> @@ -92,10 +92,26 @@ tcs_add_output_reads(nir_shader *shader, uint64_t *read, uint64_t *patches_read)
>      }
>   }
>   
> -static bool
> -remove_unused_io_vars(nir_shader *shader, struct exec_list *var_list,
> -                      uint64_t *used_by_other_stage,
> -                      uint64_t *used_by_other_stage_patches)
> +/**
> + * Helper for removing unused shader I/O variables, by demoting them to global
> + * variables (which may then by dead code eliminated).
> + *
> + * Example usage is:
> + *
> + * progress = nir_remove_unused_io_vars(producer,
> + *                                      &producer->outputs,
> + *                                      read, patches_read) ||
> + *                                      progress;
> + *
> + * The "used" should be an array of 4 uint64_ts (probably of VARYING_BIT_*)
> + * representing each .location_frac used.  Note that for vector variables,
> + * only the first channel (.location_frac) is examined for deciding if the
> + * variable is used!

Yeah we depend on the lower to scalar passes and array splitting to get 
the most out of this function.

Series:

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>

> + */
> +bool
> +nir_remove_unused_io_vars(nir_shader *shader, struct exec_list *var_list,
> +                          uint64_t *used_by_other_stage,
> +                          uint64_t *used_by_other_stage_patches)
>   {
>      bool progress = false;
>      uint64_t *used;
> @@ -169,11 +185,11 @@ nir_remove_unused_varyings(nir_shader *producer, nir_shader *consumer)
>         tcs_add_output_reads(producer, read, patches_read);
>   
>      bool progress = false;
> -   progress = remove_unused_io_vars(producer, &producer->outputs, read,
> -                                    patches_read);
> +   progress = nir_remove_unused_io_vars(producer, &producer->outputs, read,
> +                                        patches_read);
>   
> -   progress = remove_unused_io_vars(consumer, &consumer->inputs, written,
> -                                    patches_written) || progress;
> +   progress = nir_remove_unused_io_vars(consumer, &consumer->inputs, written,
> +                                        patches_written) || progress;
>   
>      return progress;
>   }
> 


More information about the mesa-dev mailing list