[Mesa-dev] [PATCH 118/133] nir: Add a sampler index indirect to nir_tex_instr

Jason Ekstrand jason at jlekstrand.net
Tue Jan 6 15:36:53 PST 2015


On Mon, Jan 5, 2015 at 10:45 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:

> I created nir_tex_src_sampler_index for exactly this purpose, which
> fits in with the "stick all the sources in an array so we can easily
> iterate over them" philosophy. If you decide to keep with this
> solution, though, at least remove that.
>

Sorry, I completely missed that.  My only gripe is that it doesn't really
follow the rest of our base_offset + indirect philosophy.  Is that the way
you were intending to use it?  i.e. direct just has sampler_index and
indirect is sampler_index + nir_tex_src_sampler_index.  If so, maybe we
should rename it to nir_tex_src_sampler_indirect.

I'm 100% ok with that, It just isn't at all clear how the two work together.
--Jason


>
> On Tue, Dec 16, 2014 at 1:13 AM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> > ---
> >  src/glsl/nir/nir.c          | 11 +++++++++++
> >  src/glsl/nir/nir.h          | 10 ++++++++++
> >  src/glsl/nir/nir_print.c    |  4 ++++
> >  src/glsl/nir/nir_validate.c |  3 +++
> >  4 files changed, 28 insertions(+)
> >
> > diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
> > index 60c9cff..8bcc64a 100644
> > --- a/src/glsl/nir/nir.c
> > +++ b/src/glsl/nir/nir.c
> > @@ -461,6 +461,13 @@ nir_tex_instr_create(void *mem_ctx, unsigned
> num_srcs)
> >     instr->has_predicate = false;
> >     src_init(&instr->predicate);
> >
> > +   instr->sampler_index = 0;
> > +   instr->has_sampler_indirect = false;
> > +   src_init(&instr->sampler_indirect);
> > +   instr->sampler_indirect_max = 0;
> > +
> > +   instr->sampler = NULL;
> > +
> >     return instr;
> >  }
> >
> > @@ -1529,6 +1536,10 @@ visit_tex_src(nir_tex_instr *instr,
> nir_foreach_src_cb cb, void *state)
> >        if (!visit_src(&instr->predicate, cb, state))
> >           return false;
> >
> > +   if (instr->has_sampler_indirect)
> > +      if (!visit_src(&instr->sampler_indirect, cb, state))
> > +         return false;
> > +
> >     if (instr->sampler != NULL)
> >        if (!visit_deref_src(instr->sampler, cb, state))
> >           return false;
> > diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
> > index 32bf634..bc7a226 100644
> > --- a/src/glsl/nir/nir.h
> > +++ b/src/glsl/nir/nir.h
> > @@ -838,7 +838,17 @@ typedef struct {
> >     /* gather component selector */
> >     unsigned component : 2;
> >
> > +   /** The sampler index
> > +    *
> > +    * If has_indirect is true, then the sampler index is given by
> > +    * sampler_index + sampler_indirect where sampler_indirect has a
> maximum
> > +    * possible value of sampler_indirect_max.
> > +    */
> >     unsigned sampler_index;
> > +   bool has_sampler_indirect;
> > +   nir_src sampler_indirect;
> > +   unsigned sampler_indirect_max;
> > +
> >     nir_deref_var *sampler; /* if this is NULL, use sampler_index
> instead */
> >  } nir_tex_instr;
> >
> > diff --git a/src/glsl/nir/nir_print.c b/src/glsl/nir/nir_print.c
> > index 962e408..67df9a5 100644
> > --- a/src/glsl/nir/nir_print.c
> > +++ b/src/glsl/nir/nir_print.c
> > @@ -498,6 +498,10 @@ print_tex_instr(nir_tex_instr *instr,
> print_var_state *state, FILE *fp)
> >        print_deref(instr->sampler, state, fp);
> >     } else {
> >        fprintf(fp, "%u", instr->sampler_index);
> > +      if (instr->has_sampler_indirect) {
> > +         fprintf(fp, " + ");
> > +         print_src(&instr->sampler_indirect, fp);
> > +      }
> >     }
> >
> >     fprintf(fp, " (sampler)");
> > diff --git a/src/glsl/nir/nir_validate.c b/src/glsl/nir/nir_validate.c
> > index e565b3c..ed6e482 100644
> > --- a/src/glsl/nir/nir_validate.c
> > +++ b/src/glsl/nir/nir_validate.c
> > @@ -399,6 +399,9 @@ validate_tex_instr(nir_tex_instr *instr,
> validate_state *state)
> >        validate_src(&instr->src[i], state);
> >     }
> >
> > +   if (instr->has_sampler_indirect)
> > +      validate_src(&instr->sampler_indirect, state);
> > +
> >     if (instr->sampler != NULL)
> >        validate_deref_var(instr->sampler, state);
> >  }
> > --
> > 2.2.0
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150106/08bb251f/attachment-0001.html>


More information about the mesa-dev mailing list