nir: Fix gl_nir_lower_samplers_as_deref's structure type handling.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 4 Jan 2019 00:12:20 +0000 (16:12 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 7 Jan 2019 22:25:04 +0000 (14:25 -0800)
We recurse to remove structures, and at each step, re-modify the
resulting type for our link in the deref chain.  For arrays, the
result of recursion is the new underlying type - so we wrap it with
the array dimensionality again.  For structs, we want to simply use
the new underlying type, skipping the struct altogether.

The correct way to do this is to do nothing at all.  Previously, we
had reset type to next->type, which is the /old/ field type, not the
new field type we obtained by recursing.  This undid our recursive work.

Fixes about 338 tests with nested structs, such as:

dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.sampler2D_samplerCube_fragment

Note that currently only radeonsi uses this pass, and NIR support is
disabled there by default, so the breakage was likely not seen by most
people.  The next commit uses this pass for more drivers, so this fix
prevents regressions from that change.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Acked-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/glsl/gl_nir_lower_samplers_as_deref.c

index 9ff5708f503e990dc5372cf65c390995c9db8c47..0c12dea3e900af1d4ebcbbf518bf07df258eff7f 100644 (file)
@@ -109,9 +109,6 @@ remove_struct_derefs_prep(nir_deref_instr **p, char **name,
                              glsl_get_struct_elem_name(cur->type, next->strct.index));
 
       remove_struct_derefs_prep(&p[1], name, location, type);
-
-      /* skip over the struct type: */
-      *type = next->type;
       break;
    }