For example fragment shader containing: invariant gl_FragColor; Or: invariant out highp vec4 test; Causes similar error: error: `gl_FragColor' cannot be marked invariant; interfaces between shader stages only. However in all GLSL ES specs there is no restriction on usage of "invariant" with output variables in fragment shader. From Section 4.6.1 ("The Invariant Qualifier") GLSL ES 1.00 spec: "Only the following variables may be declared as invariant: ... - Built-in special variables output from the fragment shader." From Section 4.6.1 ("The Invariant Qualifier") GLSL ES 3.00 spec: "Only variables output from a shader can be candidates for invariance."
I've sent a small patch to Mesa - https://patchwork.freedesktop.org/patch/247340/ Also I want to add Piglit tests but got confused where to place them: There are glsl-es-1.00/compiler tests where I can add folder with tests for "invariant" qualifier, however there are tests similar to what I want in glslparsertest/glsl2 but they are seem to be created for desktop GL. Is there a way to test "invariant" qualifier without creating duplicate tests for GL ES?
There was some question at one point as to whether invariant could be implemented as spec'd and I have no idea if that was ever resolved. Curro was looking into it and I've cc'd him.
The issue I have reported and made the patch for seems to be just a small oversight in code. In Desktop GL (in certain versions) it is allowed to have outputs from fragment shader as invariant and it works in Mesa; in GL ES it is always allowed as mentioned in cited spec but in Mesa the check for the version in which it is allowed didn't take into account GL ES. So from my pov this issue is a trivial one, on the other hand there is a more tricky bug https://bugs.freedesktop.org/show_bug.cgi?id=100316 which I attempted to fix.
I was mis-remembering, it was "volatile" not "invariant" that was broken by design. sorry for the confusion. The only way you can avoid that kind of duplication (as of this moment): 1) write a C test that is compiled multiple times, once for each API you want to test 2) use a python generator to create the tests.
Fixed by: commit a2db6b4254462c62fe60dcc62645da6901986690 Author: Danylo Piliaiev <danylo.piliaiev@globallogic.com> Date: Wed Sep 5 15:26:48 2018 +0300 glsl: Make invariant outputs in ES fragment shader not to cause error In all GLSL ES versions output variables in fragment shader are allowed to be invariant. From Section 4.6.1 ("The Invariant Qualifier") GLSL ES 1.00 spec: "Only the following variables may be declared as invariant: ... - Built-in special variables output from the fragment shader." From Section 4.6.1 ("The Invariant Qualifier") GLSL ES 3.00 spec: "Only variables output from a shader can be candidates for invariance." Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107842
Piglit-test: commit 41b01e6b8c4a8e4c8949a13743125458100ff152 Author: Danylo Piliaiev <danylo.piliaiev@gmail.com> Date: Thu Jan 10 12:13:52 2019 +0200 Test that ES frag shader with invariant outputs compiles In all GLSL ES versions output variables in fragment shader are allowed to be invariant. From Section 4.6.1 ("The Invariant Qualifier") GLSL ES 1.00 spec: "Only the following variables may be declared as invariant: ... - Built-in special variables output from the fragment shader." From Section 4.6.1 ("The Invariant Qualifier") GLSL ES 3.00 spec: "Only variables output from a shader can be candidates for invariance." v2: moved new tests to tests/spec/glsl-es folders Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com> Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107842
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.