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

Ian Romanick idr at freedesktop.org
Sat Dec 1 11:40:46 PST 2012


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.
>



More information about the mesa-dev mailing list