[Mesa-dev] [PATCH 09/26] glsl: parse GLSL ES 3.00 keywords correctly.

Kenneth Graunke kenneth at whitecape.org
Sat Dec 1 12:35:32 PST 2012


On 12/01/2012 11:40 AM, Ian Romanick wrote:
> On 11/30/2012 03:47 PM, Kenneth Graunke wrote:
>> On 11/30/2012 10:07 AM, Ian Romanick wrote:
>>> From: Paul Berry <stereotype441 at gmail.com>
>>>
>>> GLSL ES 3.00 adds the following keywords over GLSL 1.00: uint,
>>> uvec[2-4], matNxM, centroid, flat, smooth, various samplers, layout,
>>> switch, default, and case.
>>>
>>> Additionally, it reserves a large number of keywords, some of which
>>> were already reserved in versions of desktop GL that Mesa supports,
>>> some of which are new to Mesa.
>>>
>>> A few of the reserved keywords in GLSL ES 3.00 are keywords that are
>>> supported in all other versions of GLSL: attribute, varying,
>>> sampler1D, sampler1DShador, sampler2DRect, and sampler2DRectShadow.
>>>
>>> This patch updates the lexer to handle all of the new keywords
>>> correctly when the language being parsed is GLSL 3.00 ES.
>>>
>>> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
>>> ---
>>>   src/glsl/glsl_lexer.ll  | 189
>>> ++++++++++++++++++++++++++++--------------------
>>>   src/glsl/glsl_parser.yy |   3 +
>>>   2 files changed, 114 insertions(+), 78 deletions(-)
>>>
>>> diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll
>>> index ef1402b..e667e71 100644
>>> --- a/src/glsl/glsl_lexer.ll
>>> +++ b/src/glsl/glsl_lexer.ll
>>> @@ -85,6 +85,21 @@ static int classify_identifier(struct
>>> _mesa_glsl_parse_state *, const char *);
>>>         }                                    \
>>>      } while (0)
>>>
>>> +/**
>>> + * A macro for handling keywords that have been present in GLSL since
>>> + * its origin, but were changed into reserved words in GLSL 3.00 ES.
>>> + */
>>> +#define DEPRECATED_ES_KEYWORD(token)                    \
>>> +   do {                                    \
>>> +      if (yyextra->is_version(0, 300)) {                \
>>> +     _mesa_glsl_error(yylloc, yyextra,                \
>>> +              "Illegal use of reserved word `%s'", yytext);    \
>>> +     return ERROR_TOK;                        \
>>> +      } else {                                \
>>> +         return token;                            \
>>> +      }                                    \
>>> +   } while (0)
>>> +
>>>   static int
>>>   literal_integer(char *text, int len, struct _mesa_glsl_parse_state
>>> *state,
>>>           YYSTYPE *lval, YYLTYPE *lloc, int base)
>>> @@ -223,12 +238,12 @@ HASH        ^{SPC}#{SPC}
>>>
>>>   \n        { yylineno++; yycolumn = 0; }
>>>
>>> -attribute    return ATTRIBUTE;
>>> +attribute    DEPRECATED_ES_KEYWORD(ATTRIBUTE);
>>>   const        return CONST_TOK;
>>>   bool        return BOOL_TOK;
>>>   float        return FLOAT_TOK;
>>>   int        return INT_TOK;
>>> -uint        KEYWORD(130, 0, 130, 0, UINT_TOK);
>>> +uint        KEYWORD(130, 300, 130, 300, UINT_TOK);
>>>
>>>   break        return BREAK;
>>>   continue    return CONTINUE;
>>> @@ -246,59 +261,59 @@ bvec4        return BVEC4;
>>>   ivec2        return IVEC2;
>>>   ivec3        return IVEC3;
>>>   ivec4        return IVEC4;
>>> -uvec2        KEYWORD(130, 0, 130, 0, UVEC2);
>>> -uvec3        KEYWORD(130, 0, 130, 0, UVEC3);
>>> -uvec4        KEYWORD(130, 0, 130, 0, UVEC4);
>>> +uvec2        KEYWORD(130, 300, 130, 300, UVEC2);
>>> +uvec3        KEYWORD(130, 300, 130, 300, UVEC3);
>>> +uvec4        KEYWORD(130, 300, 130, 300, UVEC4);
>>>   vec2        return VEC2;
>>>   vec3        return VEC3;
>>>   vec4        return VEC4;
>>>   mat2        return MAT2X2;
>>>   mat3        return MAT3X3;
>>>   mat4        return MAT4X4;
>>> -mat2x2        KEYWORD(120, 0, 120, 0, MAT2X2);
>>> -mat2x3        KEYWORD(120, 0, 120, 0, MAT2X3);
>>> -mat2x4        KEYWORD(120, 0, 120, 0, MAT2X4);
>>> -mat3x2        KEYWORD(120, 0, 120, 0, MAT3X2);
>>> -mat3x3        KEYWORD(120, 0, 120, 0, MAT3X3);
>>> -mat3x4        KEYWORD(120, 0, 120, 0, MAT3X4);
>>> -mat4x2        KEYWORD(120, 0, 120, 0, MAT4X2);
>>> -mat4x3        KEYWORD(120, 0, 120, 0, MAT4X3);
>>> -mat4x4        KEYWORD(120, 0, 120, 0, MAT4X4);
>>> +mat2x2        KEYWORD(120, 300, 120, 300, MAT2X2);
>>> +mat2x3        KEYWORD(120, 300, 120, 300, MAT2X3);
>>> +mat2x4        KEYWORD(120, 300, 120, 300, MAT2X4);
>>> +mat3x2        KEYWORD(120, 300, 120, 300, MAT3X2);
>>> +mat3x3        KEYWORD(120, 300, 120, 300, MAT3X3);
>>> +mat3x4        KEYWORD(120, 300, 120, 300, MAT3X4);
>>> +mat4x2        KEYWORD(120, 300, 120, 300, MAT4X2);
>>> +mat4x3        KEYWORD(120, 300, 120, 300, MAT4X3);
>>> +mat4x4        KEYWORD(120, 300, 120, 300, MAT4X4);
>>>
>>>   in        return IN_TOK;
>>>   out        return OUT_TOK;
>>>   inout        return INOUT_TOK;
>>>   uniform        return UNIFORM;
>>> -varying        return VARYING;
>>> -centroid    KEYWORD(120, 0, 120, 0, CENTROID);
>>> +varying        DEPRECATED_ES_KEYWORD(VARYING);
>>> +centroid    KEYWORD(120, 300, 120, 300, CENTROID);
>>>   invariant    KEYWORD(120, 100, 120, 100, INVARIANT);
>>> -flat        KEYWORD(130, 100, 130, 0, FLAT);
>>> -smooth        KEYWORD(130, 0, 130, 0, SMOOTH);
>>> -noperspective    KEYWORD(130, 0, 130, 0, NOPERSPECTIVE);
>>> +flat        KEYWORD(130, 100, 130, 300, FLAT);
>>> +smooth        KEYWORD(130, 300, 130, 300, SMOOTH);
>>> +noperspective    KEYWORD(130, 300, 130, 0, NOPERSPECTIVE);
>>>
>>> -sampler1D    return SAMPLER1D;
>>> +sampler1D    DEPRECATED_ES_KEYWORD(SAMPLER1D);
>>>   sampler2D    return SAMPLER2D;
>>>   sampler3D    return SAMPLER3D;
>>>   samplerCube    return SAMPLERCUBE;
>>> -sampler1DArray    KEYWORD(130, 0, 130, 0, SAMPLER1DARRAY);
>>> -sampler2DArray    KEYWORD(130, 0, 130, 0, SAMPLER2DARRAY);
>>> -sampler1DShadow    return SAMPLER1DSHADOW;
>>> +sampler1DArray    KEYWORD(130, 300, 130, 0, SAMPLER1DARRAY);
>>> +sampler2DArray    KEYWORD(130, 300, 130, 300, SAMPLER2DARRAY);
>>> +sampler1DShadow    DEPRECATED_ES_KEYWORD(SAMPLER1DSHADOW);
>>>   sampler2DShadow    return SAMPLER2DSHADOW;
>>> -samplerCubeShadow    KEYWORD(130, 0, 130, 0, SAMPLERCUBESHADOW);
>>> -sampler1DArrayShadow    KEYWORD(130, 0, 130, 0, SAMPLER1DARRAYSHADOW);
>>> -sampler2DArrayShadow    KEYWORD(130, 0, 130, 0, SAMPLER2DARRAYSHADOW);
>>> -isampler1D        KEYWORD(130, 0, 130, 0, ISAMPLER1D);
>>> -isampler2D        KEYWORD(130, 0, 130, 0, ISAMPLER2D);
>>> -isampler3D        KEYWORD(130, 0, 130, 0, ISAMPLER3D);
>>> -isamplerCube        KEYWORD(130, 0, 130, 0, ISAMPLERCUBE);
>>> -isampler1DArray        KEYWORD(130, 0, 130, 0, ISAMPLER1DARRAY);
>>> -isampler2DArray        KEYWORD(130, 0, 130, 0, ISAMPLER2DARRAY);
>>> -usampler1D        KEYWORD(130, 0, 130, 0, USAMPLER1D);
>>> -usampler2D        KEYWORD(130, 0, 130, 0, USAMPLER2D);
>>> -usampler3D        KEYWORD(130, 0, 130, 0, USAMPLER3D);
>>> -usamplerCube        KEYWORD(130, 0, 130, 0, USAMPLERCUBE);
>>> -usampler1DArray        KEYWORD(130, 0, 130, 0, USAMPLER1DARRAY);
>>> -usampler2DArray        KEYWORD(130, 0, 130, 0, USAMPLER2DARRAY);
>>> +samplerCubeShadow    KEYWORD(130, 300, 130, 300, SAMPLERCUBESHADOW);
>>> +sampler1DArrayShadow    KEYWORD(130, 300, 130, 0,
>>> SAMPLER1DARRAYSHADOW);
>>> +sampler2DArrayShadow    KEYWORD(130, 300, 130, 300,
>>> SAMPLER2DARRAYSHADOW);
>>> +isampler1D        KEYWORD(130, 300, 130, 0, ISAMPLER1D);
>>> +isampler2D        KEYWORD(130, 300, 130, 300, ISAMPLER2D);
>>> +isampler3D        KEYWORD(130, 300, 130, 300, ISAMPLER3D);
>>> +isamplerCube        KEYWORD(130, 300, 130, 300, ISAMPLERCUBE);
>>> +isampler1DArray        KEYWORD(130, 300, 130, 0, ISAMPLER1DARRAY);
>>> +isampler2DArray        KEYWORD(130, 300, 130, 300, ISAMPLER2DARRAY);
>>> +usampler1D        KEYWORD(130, 300, 130, 0, USAMPLER1D);
>>> +usampler2D        KEYWORD(130, 300, 130, 300, USAMPLER2D);
>>> +usampler3D        KEYWORD(130, 300, 130, 300, USAMPLER3D);
>>> +usamplerCube        KEYWORD(130, 300, 130, 300, USAMPLERCUBE);
>>> +usampler1DArray        KEYWORD(130, 300, 130, 0, USAMPLER1DARRAY);
>>> +usampler2DArray        KEYWORD(130, 300, 130, 300, USAMPLER2DARRAY);
>>>
>>>   samplerCubeArray    {
>>>                 if (yyextra->ARB_texture_cube_map_array_enable)
>>> @@ -337,7 +352,7 @@ struct        return STRUCT;
>>>   void        return VOID_TOK;
>>>
>>>   layout        {
>>> -          if ((yyextra->is_version(140, 0))
>>> +          if ((yyextra->is_version(140, 300))
>>>                 || yyextra->AMD_conservative_depth_enable
>>>                 || yyextra->ARB_conservative_depth_enable
>>>                 || yyextra->ARB_explicit_attrib_location_enable
>>> @@ -424,8 +439,8 @@ template    KEYWORD(110, 100, 0, 0, TEMPLATE);
>>>   this        KEYWORD(110, 100, 0, 0, THIS);
>>>   packed        KEYWORD_WITH_ALT(110, 100, 140, 0,
>>> yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK);
>>>   goto        KEYWORD(110, 100, 0, 0, GOTO);
>>> -switch        KEYWORD(110, 100, 130, 0, SWITCH);
>>> -default        KEYWORD(110, 100, 130, 0, DEFAULT);
>>> +switch        KEYWORD(110, 100, 130, 300, SWITCH);
>>> +default        KEYWORD(110, 100, 130, 300, DEFAULT);
>>>   inline        KEYWORD(110, 100, 0, 0, INLINE_TOK);
>>>   noinline    KEYWORD(110, 100, 0, 0, NOINLINE);
>>>   volatile    KEYWORD(110, 100, 0, 0, VOLATILE);
>>> @@ -451,9 +466,9 @@ dvec4        KEYWORD(110, 100, 400, 0, DVEC4);
>>>   fvec2        KEYWORD(110, 100, 0, 0, FVEC2);
>>>   fvec3        KEYWORD(110, 100, 0, 0, FVEC3);
>>>   fvec4        KEYWORD(110, 100, 0, 0, FVEC4);
>>> -sampler2DRect        return SAMPLER2DRECT;
>>> +sampler2DRect        DEPRECATED_ES_KEYWORD(SAMPLER2DRECT);
>>>   sampler3DRect        KEYWORD(110, 100, 0, 0, SAMPLER3DRECT);
>>> -sampler2DRectShadow    return SAMPLER2DRECTSHADOW;
>>> +sampler2DRectShadow    DEPRECATED_ES_KEYWORD(SAMPLER2DRECTSHADOW);
>>
>> I don't think the handling of sampler2DRect/sampler2DRectShadow is
>> correct.  It should be accepted if ARB_texture_rectangle is enabled or
>> 1.40+.  Otherwise, it's always been reserved.
>
> It's a special case.  The GL_ARB_texture_rectangle extension predates
> the invention of the #extension mechanism.  A number of shipping drivers
> and, supposedly, shipping applications use it without any #extension.
> It's only reserved (generates an error) if the implementation doesn't
> support the extension.  In Mesa, this gets handled elsewhere, but I
> think every driver that supports GLSL also supports this extension.
>
>> Otherwise this looks okay.

Oh, right.  But it's actually reserved on ES.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>



More information about the mesa-dev mailing list