[Mesa-dev] [PATCH 1/2] nir: Add a function to determine if a source is dynamically uniform

Matt Turner mattst88 at gmail.com
Thu Oct 1 12:18:37 PDT 2015


On Fri, Aug 7, 2015 at 9:31 AM, Neil Roberts <neil at linux.intel.com> wrote:
> Adds nir_src_is_dynamically_uniform which returns true if the source
> is known to be dynamically uniform. This will be used in a later patch
> to add a workaround for cases that only work with dynamically uniform
> sources. Note that the function is not definitive, it can return false
> negatives (but not false positives). Currently it only detects
> constants and uniform accesses. It could easily be extended to include
> more cases.
> ---
>  src/glsl/nir/nir.c | 29 +++++++++++++++++++++++++++++
>  src/glsl/nir/nir.h |  1 +
>  2 files changed, 30 insertions(+)
>
> diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
> index 78ff886..242f0b4 100644
> --- a/src/glsl/nir/nir.c
> +++ b/src/glsl/nir/nir.c
> @@ -1784,6 +1784,35 @@ nir_src_as_const_value(nir_src src)
>     return &load->value;
>  }
>
> +/**
> + * Returns true if the source is known to be dynamically uniform. Otherwise it
> + * returns false which means it may or may not be dynamically uniform but it
> + * can't be determined.
> + */
> +bool
> +nir_src_is_dynamically_uniform(nir_src src)
> +{
> +   if (!src.is_ssa)
> +      return false;
> +
> +   /* Constants are trivially dynamically uniform */
> +   if (src.ssa->parent_instr->type == nir_instr_type_load_const)
> +      return true;
> +
> +   /* As are uniform variables */
> +   if (src.ssa->parent_instr->type == nir_instr_type_intrinsic) {
> +      nir_intrinsic_instr *intr = nir_instr_as_intrinsic(src.ssa->parent_instr);
> +
> +      if (intr->intrinsic == nir_intrinsic_load_uniform)
> +         return true;
> +   }
> +
> +   /* XXX: this could have many more tests, such as when a sampler function is
> +    * called with dynamically uniform arguments.
> +    */
> +   return false;
> +}

This functions seems correct as-is, so it gets a

Reviewed-by: Matt Turner <mattst88 at gmail.com>

On top of being useful for fixing the nonconst/nonuniform piglit
tests, knowing which values are uniform can allow better optimization
and knowing which branches are uniform would allow us to enable Single
Program Flow.

Cc'ing Jason for a discussion about how we'd like to handle this kind
of information in NIR. Add a bool is_uniform or something to
nir_ssa_def and hook into the metadata system?


More information about the mesa-dev mailing list