[Piglit] [PATCH 3/3] arb_gpu_shader5: interpolateAt* must reject inputs in structs
Nicolai Hähnle
nhaehnle at gmail.com
Tue Jun 20 13:58:03 UTC 2017
On 20.06.2017 13:32, Nicolai Hähnle wrote:
> On 19.06.2017 23:46, Ian Romanick wrote:
>> That's actually a little surprising... do other drivers reject this? If
>> so, I'll agree with Timothy that a spec quote would be nice.
>
> So, I guess I was going off of what was in the Mesa source already, plus
> the spec part of Section 8.13.2 (Interpolation Functions) of GLSL 4.50
> which says:
>
> "For all of the interpolation functions, interpolant must be an
> input variable or an element of an input variable declared as an
> array. Component selection operators (e.g., .xy) may be used when
> specifying interpolant."
>
> ... and if you go out of your way to explicitly say that it *can* be an
> element of an array, one kind of expects that it *cannot* be an element
> of a struct. But maybe that's an artifact of how the spec evolved?
> Actually, now that I re-read it, our rejection of swizzles also looks
> incorrect.
>
> As for compilers I can test:
>
> glslangValidator: accepts swizzles and struct elements
> amdgpu-pro: accepts struct elements but rejects swizzles; it does accept
> non-swizzling individual component selection, which seems like a spec
> misunderstanding given how "component selection" is defined in Section
> 5.5 (Vector and Scalar Components and Length).
> Mesa: rejects swizzles and struct elements
>
> Going back to the ARB_gpu_shader5 spec, it explicitly forbids swizzles
> (there's an additional "not" in the sentence quoted above). So that
> seems to have changed at some point and we simply missed it. More
> digging needed...
So, the "not" was removed in GLSL 4.40, but there's no mention of this
change in the changelog.
On the matter of struct elements: Consider that they cannot have
flat/centroid/noperspective qualifiers, so there's actually a good
reason forbidding them.
I've opened a spec bug about this anyway:
https://gitlab.khronos.org/opengl/GLSL/issues/8
Cheers,
Nicolai
>
> Honestly, I'd interpret the spec language above in a way that forbids
> using struct elements. The other compilers I can test disagree, but both
> of them aren't exactly known for their high quality...
>
> Cheers,
> Nicolai
>
>>
>> On 06/16/2017 01:34 PM, Nicolai Hähnle wrote:
>>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>>
>>> ---
>>> .../fs-interpolateAtCentroid-struct.frag | 17
>>> +++++++++++++++++
>>> .../fs-interpolateAtOffset-struct.frag | 17
>>> +++++++++++++++++
>>> .../fs-interpolateAtSampler-struct.frag | 17
>>> +++++++++++++++++
>>> 3 files changed, 51 insertions(+)
>>> create mode 100644
>>> tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtCentroid-struct.frag
>>>
>>> create mode 100644
>>> tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtOffset-struct.frag
>>>
>>> create mode 100644
>>> tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtSampler-struct.frag
>>>
>>>
>>> diff --git
>>> a/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtCentroid-struct.frag
>>> b/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtCentroid-struct.frag
>>>
>>> new file mode 100644
>>> index 0000000..453c2db
>>> --- /dev/null
>>> +++
>>> b/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtCentroid-struct.frag
>>>
>>> @@ -0,0 +1,17 @@
>>> +// [config]
>>> +// expect_result: fail
>>> +// glsl_version: 1.50
>>> +// require_extensions: GL_ARB_gpu_shader5
>>> +// [end config]
>>> +
>>> +#version 150
>>> +#extension GL_ARB_gpu_shader5: require
>>> +
>>> +in struct {
>>> + vec4 a;
>>> +} a;
>>> +
>>> +void main()
>>> +{
>>> + interpolateAtCentroid(a.a);
>>> +}
>>> diff --git
>>> a/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtOffset-struct.frag
>>> b/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtOffset-struct.frag
>>>
>>> new file mode 100644
>>> index 0000000..9b7ee7e
>>> --- /dev/null
>>> +++
>>> b/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtOffset-struct.frag
>>>
>>> @@ -0,0 +1,17 @@
>>> +// [config]
>>> +// expect_result: fail
>>> +// glsl_version: 1.50
>>> +// require_extensions: GL_ARB_gpu_shader5
>>> +// [end config]
>>> +
>>> +#version 150
>>> +#extension GL_ARB_gpu_shader5: require
>>> +
>>> +in struct {
>>> + vec4 a;
>>> +} a;
>>> +
>>> +void main()
>>> +{
>>> + interpolateAtOffset(a.a, vec2(0));
>>> +}
>>> diff --git
>>> a/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtSampler-struct.frag
>>> b/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtSampler-struct.frag
>>>
>>> new file mode 100644
>>> index 0000000..78a844e
>>> --- /dev/null
>>> +++
>>> b/tests/spec/arb_gpu_shader5/compiler/builtin-functions/fs-interpolateAtSampler-struct.frag
>>>
>>> @@ -0,0 +1,17 @@
>>> +// [config]
>>> +// expect_result: fail
>>> +// glsl_version: 1.50
>>> +// require_extensions: GL_ARB_gpu_shader5
>>> +// [end config]
>>> +
>>> +#version 150
>>> +#extension GL_ARB_gpu_shader5: require
>>> +
>>> +in struct {
>>> + vec4 a;
>>> +} a;
>>> +
>>> +void main()
>>> +{
>>> + interpolateAtSample(a.a, 0);
>>> +}
>>>
>>
>
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the Piglit
mailing list