On Sun, 2015-11-08 at 15:12 -0500, Rob Clark wrote:
> From: Rob Clark <robcl...@freedesktop.org>
> 
> With TGSI, the ir_variable::data.location gets fixed up to be a stage
> local location (rather than program global).  In this case we need to
> skip the UniformStorage[location] lookup.
> ---
>  src/glsl/nir/nir_lower_samplers.c | 23 ++++++++++++++++-------
>  1 file changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/src/glsl/nir/nir_lower_samplers.c
> b/src/glsl/nir/nir_lower_samplers.c
> index 5df79a6..d99ba4c 100644
> --- a/src/glsl/nir/nir_lower_samplers.c
> +++ b/src/glsl/nir/nir_lower_samplers.c
> @@ -130,14 +130,18 @@ lower_sampler(nir_tex_instr *instr, const struct
> gl_shader_program *shader_progr
>        instr->sampler_array_size = array_elements;
>     }
>  
> -   if (location > shader_program->NumUniformStorage - 1 ||
> -       !shader_program->UniformStorage[location].opaque[stage].active) {
> -      assert(!"cannot return a sampler");
> -      return;
> -   }
> +   if (!shader_program) {
> +      instr->sampler_index = location;
> +   } else {
> +      if (location > shader_program->NumUniformStorage - 1 ||
> +          !shader_program->UniformStorage[location].opaque[stage].active) {
> +         assert(!"cannot return a sampler");
> +         return;
> +      }
>  
> -   instr->sampler_index +=
> -      shader_program->UniformStorage[location].opaque[stage].index;
> +      instr->sampler_index =
> +         shader_program->UniformStorage[location].opaque[stage].index;

Hi Rob,

This will break arrays as instr->sampler_index is increamented inside
 calc_sampler_offsets()

calc_sampler_offsets() also modifies the value of location is this what you
want? I would assume not as we are counting uniforms not just samplers here.

The other thing to note is that glsl to tgsi doesn't handle indirects on
structs or arrays of arrays correctly (Ilia was trying to fix this).

Tim
 


> +   }
>  
>     instr->sampler = NULL;
>  }
> @@ -177,6 +181,11 @@ lower_impl(nir_function_impl *impl, const struct
> gl_shader_program *shader_progr
>     nir_foreach_block(impl, lower_block_cb, &state);
>  }
>  
> +/* Call with a null 'shader_program' if uniform locations are

uniform locations -> sampler indices?

> + * already local to the shader, ie. skipping the
> + * shader_program->UniformStorage[location].opaque[stage].index
> + * lookup
> + */
>  void
>  nir_lower_samplers(nir_shader *shader,
>                     const struct gl_shader_program *shader_program)
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to