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