[Mesa-dev] [PATCH v2] nir: fix sampler lowering pass for arrays

Jason Ekstrand jason at jlekstrand.net
Mon May 11 11:45:24 PDT 2015


On Mon, May 11, 2015 at 4:50 AM, Tapani Pälli <tapani.palli at intel.com> wrote:
> This fixes bugs with special cases where we have arrays of
> structures containing samplers or arrays of samplers.
>
> I've verified that patch results in calculating same index value as
> returned by _mesa_get_sampler_uniform_value for IR. Patch makes
> following ES3 conformance test pass:
>
>         ES3-CTS.shaders.struct.uniform.sampler_array_fragment
>
> v2: remove unnecessary comment (Topi)
>     simplify changes and the overall code (Jason)

This looks way better!  Thanks for working on this Tapani!  Assuming
this passes piglit,

Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90114
> ---
>  src/glsl/nir/nir_lower_samplers.cpp | 31 ++++++++++++-------------------
>  1 file changed, 12 insertions(+), 19 deletions(-)
>
> diff --git a/src/glsl/nir/nir_lower_samplers.cpp b/src/glsl/nir/nir_lower_samplers.cpp
> index 8fc5909..7a0b0a0 100644
> --- a/src/glsl/nir/nir_lower_samplers.cpp
> +++ b/src/glsl/nir/nir_lower_samplers.cpp
> @@ -70,19 +70,22 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
>        case nir_deref_type_array: {
>           nir_deref_array *deref_array = nir_deref_as_array(deref->child);
>
> +         assert(deref_array->deref_array_type != nir_deref_array_type_wildcard);
> +
> +         if (deref_array->deref.child) {
> +            ralloc_asprintf_append(&name, "[%u]",
> +               deref_array->deref_array_type == nir_deref_array_type_direct ?
> +                  deref_array->base_offset : 0);
> +         } else {
> +            assert(deref->child->type->base_type == GLSL_TYPE_SAMPLER);
> +            instr->sampler_index = deref_array->base_offset;
> +         }
> +
>           /* XXX: We're assuming here that the indirect is the last array
>            * thing we have.  This should be ok for now as we don't support
>            * arrays_of_arrays yet.
>            */
> -
> -         instr->sampler_index *= glsl_get_length(deref->type);
> -         switch (deref_array->deref_array_type) {
> -         case nir_deref_array_type_direct:
> -            instr->sampler_index += deref_array->base_offset;
> -            if (deref_array->deref.child)
> -               ralloc_asprintf_append(&name, "[%u]", deref_array->base_offset);
> -            break;
> -         case nir_deref_array_type_indirect: {
> +         if (deref_array->deref_array_type == nir_deref_array_type_indirect) {
>              /* First, we have to resize the array of texture sources */
>              nir_tex_src *new_srcs = rzalloc_array(instr, nir_tex_src,
>                                                    instr->num_srcs + 1);
> @@ -106,16 +109,6 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
>                                 &deref_array->indirect);
>
>              instr->sampler_array_size = glsl_get_length(deref->type);
> -
> -            if (deref_array->deref.child)
> -               ralloc_strcat(&name, "[0]");
> -            break;
> -         }
> -
> -         case nir_deref_array_type_wildcard:
> -            unreachable("Cannot copy samplers");
> -         default:
> -            unreachable("Invalid deref array type");
>           }
>           break;
>        }
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list