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

Connor Abbott cwabbott0 at gmail.com
Wed Jan 7 07:55:50 PST 2015


On Tue, Jan 6, 2015 at 6:36 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
>
>
> 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

Well, when I added nir_tex_src_sampler_index, it was more of a "I know
we'll need something like this eventually so I'll stick it here to
remind myself/other people when the time comes" thing, and I wasn't
sure which option would be better. So you can keep it and always set
sampler_index to 0 when it's indirect, or rename it - whatever's
easier to do, so long as it's consistent.

>
>>
>>
>> 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
>
>


More information about the mesa-dev mailing list