Matt Turner <matts...@gmail.com> writes: > On Fri, Oct 2, 2015 at 2:52 AM, Francisco Jerez <curroje...@riseup.net> wrote: >> Jason Ekstrand <ja...@jlekstrand.net> writes: >> >>> On Oct 1, 2015 12:18 PM, "Matt Turner" <matts...@gmail.com> wrote: >>>> >>>> On Fri, Aug 7, 2015 at 9:31 AM, Neil Roberts <n...@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 <matts...@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. >>> >> >> Heh, I hadn't noticed this series until now and happen to have started >> to sketch such an analysis pass just this week, with a completely >> unrelated purpose in mind (enable a restricted form of GCM for texturing >> ops with implicit derivatives). Any volunteers to write it (Neil?) or >> shall I go ahead with it? > > Interesting. In case you haven't seen it, Connor added nir_opt_gcm() > some time ago, but it's not enabled because it hurts many things. > Presumably you can reuse its code to implement your idea. > Yeah, I had seen Connor's pass and it seems like a good starting point, thanks.
> I suspect you should go ahead and write the uniform analysis pass. > > Thanks!
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev