glsl: allow any l-value of an input variable as interpolant in interpolateAt*
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 14 Jun 2017 10:43:10 +0000 (12:43 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 3 Nov 2017 13:30:08 +0000 (14:30 +0100)
commit4f42450b86ea30f9228309e02ca68755c389866f
tree419b0281c0f72e5191ee1310a0034c52ea862fdb
parent57372c5a42969afe6c7afd6a0389a92e3e1a5178
glsl: allow any l-value of an input variable as interpolant in interpolateAt*

The intended rule has been clarified in GLSL 4.60, Section 8.13.2
(Interpolation Functions):

   "For all of the interpolation functions, interpolant must be an l-value
    from an in declaration; this can include a variable, a block or
    structure member, an array element, or some combination of these.
    Component selection operators (e.g., .xy) may be used when specifying
    interpolant."

For members of interface blocks, var->data.must_be_shader_input must be
determined on-the-fly after lowering interface blocks, since we don't want
to disable varying packing for an entire block just because one input in it
is used in interpolateAt*.

v2: keep setting must_be_shader_input in ast_function (Ian)
v3: follow the relaxed rule of GLSL 4.60
v4: only apply the relaxed rules to desktop GL
    (the ES WG decided that the relaxed rules may apply in a future version
     but not retroactively; see also
     dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative.*)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101378
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> (v1)
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/ast_function.cpp
src/compiler/glsl/lower_named_interface_blocks.cpp