[Mesa-dev] [RFCv3 04/11] nir: allow pre-resolved sampler uniform locations
Rob Clark
robdclark at gmail.com
Tue Mar 22 14:01:09 UTC 2016
So I've been looking a bit more at this, and skipping the
shader_program->UniformStorage[location].opaque[stage].index offset
is, I think, not the right thing to do.
The original issue I was having with this seems to be a disagreement
about location idx into UniformStorage. In
parcel_out_uniform_storage::handle_samplers we end up w/
&prog->UniformStorage[id] where id comes from UniformHash, but id
doesn't match up with var->data.location in NIR (at least in some
cases, seems to work sometimes but that might just be a happy
accident, ie. when both just happen to be zero).
BR,
-R
On Sun, Jan 31, 2016 at 3:16 PM, Rob Clark <robdclark at gmail.com> wrote:
> From: Rob Clark <robclark at 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.
>
> Signed-off-by: Rob Clark <robclark at freedesktop.org>
> ---
> src/compiler/nir/nir_lower_samplers.c | 23 ++++++++++++++++-------
> 1 file changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/src/compiler/nir/nir_lower_samplers.c b/src/compiler/nir/nir_lower_samplers.c
> index 96e8291..c95a474 100644
> --- a/src/compiler/nir/nir_lower_samplers.c
> +++ b/src/compiler/nir/nir_lower_samplers.c
> @@ -129,14 +129,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;
> }
> @@ -176,6 +180,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
>
More information about the mesa-dev
mailing list