[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