[Mesa-dev] [PATCH 07/10] glsl: don't allow invariant qualifiers for interface blocks in GLSL ES

Samuel Iglesias Gonsálvez siglesias at igalia.com
Wed Dec 3 03:06:17 PST 2014


On Tuesday, December 02, 2014 12:57:24 PM Ian Romanick wrote:
> On 12/01/2014 05:04 AM, Eduardo Lima Mitev wrote:
> > From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> > 
> > 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
> I'm pretty sure you can't have an invariant uniform block in desktop
> OpenGL either.  Should this change also apply universally to desktop OpenGL?

OK, I checked 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"

I'm going to do apply this change  to desktop OpenGL and add this paragraph to 
both the commit log and the comment bellow. 

Thanks!

Sam

> > No piglit regressions.
> > 
> > Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> > ---
> > 
> >  src/glsl/glsl_parser.yy | 25 +++++++++++++++++++++++++
> >  1 file changed, 25 insertions(+)
> > 
> > diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> > index 55b3a7d..489d3af 100644
> > --- a/src/glsl/glsl_parser.yy
> > +++ b/src/glsl/glsl_parser.yy
> > 
> > @@ -2519,6 +2519,31 @@ 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." +          */
> > +         if (state->es_shader && qualifier.flags.q.invariant)
> > +            _mesa_glsl_error(&@1, state, "invariant qualifiers cannot be
> > used with interface blocks in GLSL ES");> 
> >        }
> >        
> >        $$ = block;
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141203/cff4447d/attachment.sig>


More information about the mesa-dev mailing list