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; + } 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 + * 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) -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev