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

Jason Ekstrand jason at jlekstrand.net
Thu Oct 1 19:33:43 PDT 2015


On Oct 1, 2015 12:18 PM, "Matt Turner" <mattst88 at gmail.com> wrote:
>
> 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?

That was more-or-less my plan. We should probably have a proper pass that
handles things like phi nodes and ALU operations.

--Jason
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151001/6c9a6ff7/attachment-0001.html>


More information about the mesa-dev mailing list