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.

On Tue, Dec 16, 2014 at 1:13 AM, Jason Ekstrand <ja...@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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to