[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