[Mesa-dev] [PATCH] glsl: don't allow invariant qualifiers for interface blocks

Eduardo Lima Mitev elima at igalia.com
Tue Dec 9 02:52:31 PST 2014


From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>

GLSL 1.50 and GLSL 4.40 specs, they both say the same in
"Interface Blocks" section:

"If no optional qualifier is used in a member-declaration, the qualification of
the member includes all in, out, patch, uniform, or buffer as determined by
interface-qualifier. If optional qualifiers are used, they can include
interpolation qualifiers, auxiliary storage qualifiers, and storage qualifiers
and they must declare an input, output, or uniform member consistent with the
interface qualifier of the block"

>From GLSL ES 3.0, chapter 4.3.7 "Interface Blocks", page 38:

"GLSL ES 3.0 does not support interface blocks for shader inputs or outputs."

and from GLSL ES 3.0, chapter 4.6.1 "The invariant qualifier", page 52.

"Only variables output from a shader can be candidates for invariance. This
includes user-defined output variables and the built-in output variables. As
only outputs can be declared as invariant, an invariant output from one shader
stage will still match an input of a subsequent stage without the input being
declared as invariant."

>From GLSL ES 1.0, chapter 4.6.1 "The invariant qualifier", page 37.

"Only the following variables may be declared as invariant:
* Built-in special variables output from the vertex shader
* Varying variables output from the vertex shader
* Built-in special variables input to the fragment shader
* Varying variables input to the fragment shader
* Built-in special variables output from the fragment shader."

This patch fixes the following dEQP tests:

dEQP-GLES3.functional.shaders.declarations.invalid_declarations.invariant_uniform_block_2_vertex
dEQP-GLES3.functional.shaders.declarations.invalid_declarations.invariant_uniform_block_2_fragment

No piglit regressions.

Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>

v2:

- Enable this check for GLSL.

Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
---
 src/glsl/glsl_parser.yy | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 7fb8c38..9f2a0a3 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -2539,6 +2539,41 @@ basic_interface_block:
                              "interface block member does not match "
                              "the interface block");
          }
+         /* From GLSL ES 3.0, chapter 4.3.7 "Interface Blocks", page 38:
+          *
+          * "GLSL ES 3.0 does not support interface blocks for shader inputs or
+          * outputs."
+          *
+          * And from GLSL ES 3.0, chapter 4.6.1 "The invariant qualifier", page 52.
+          *
+          * "Only variables output from a shader can be candidates for
+          * invariance. This includes user-defined output variables and the
+          * built-in output variables. As only outputs can be declared as
+          * invariant, an invariant output from one shader stage will
+          * still match an input of a subsequent stage without the input being
+          * declared as invariant."
+          *
+          * From GLSL ES 1.0, chapter 4.6.1 "The invariant qualifier", page 37.
+          *
+          * "Only the following variables may be declared as invariant:
+          *  * Built-in special variables output from the vertex shader
+          *  * Varying variables output from the vertex shader
+          *  * Built-in special variables input to the fragment shader
+          *  * Varying variables input to the fragment shader
+          *  * Built-in special variables output from the fragment shader."
+          *
+          * From GLSL 4.40 and GLSL 1.50, section "Interface Blocks":
+          *
+          * "If no optional qualifier is used in a member-declaration, the
+          * qualification of the member includes all in, out, patch, uniform,
+          * or buffer as determined by interface-qualifier. If optional
+          * qualifiers are used, they can include interpolation qualifiers,
+          * auxiliary storage qualifiers, and storage qualifiers and they must
+          * declare an input, output, or uniform member consistent with the
+          * interface qualifier of the block"
+          */
+         if (qualifier.flags.q.invariant)
+            _mesa_glsl_error(&@1, state, "invariant qualifiers cannot be used with interface blocks members");
       }
 
       $$ = block;
-- 
2.1.3



More information about the mesa-dev mailing list