[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