[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