glsl: Assign locations for uniforms in UBOs using the std140 rules.
[profile/ivi/mesa.git] / src / glsl / glsl_lexer.ll
1 %{
2 /*
3  * Copyright © 2008, 2009 Intel Corporation
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 #include <ctype.h>
25 #include <limits.h>
26 #include "strtod.h"
27 #include "ast.h"
28 #include "glsl_parser_extras.h"
29 #include "glsl_parser.h"
30
31 static int classify_identifier(struct _mesa_glsl_parse_state *, const char *);
32
33 #ifdef _MSC_VER
34 #define YY_NO_UNISTD_H
35 #endif
36
37 #define YY_USER_ACTION                                          \
38    do {                                                         \
39       yylloc->source = 0;                                       \
40       yylloc->first_column = yycolumn + 1;                      \
41       yylloc->first_line = yylineno + 1;                        \
42       yycolumn += yyleng;                                       \
43    } while(0);
44
45 #define YY_USER_INIT yylineno = 0; yycolumn = 0;
46
47 /* A macro for handling reserved words and keywords across language versions.
48  *
49  * Certain words start out as identifiers, become reserved words in
50  * later language revisions, and finally become language keywords.
51  *
52  * For example, consider the following lexer rule:
53  * samplerBuffer       KEYWORD(130, 140, SAMPLERBUFFER)
54  *
55  * This means that "samplerBuffer" will be treated as:
56  * - a keyword (SAMPLERBUFFER token)         ...in GLSL >= 1.40
57  * - a reserved word - error                 ...in GLSL >= 1.30
58  * - an identifier                           ...in GLSL <  1.30
59  */
60 #define KEYWORD(reserved_version, allowed_version, token)               \
61    do {                                                                 \
62       if (yyextra->language_version >= allowed_version) {               \
63          return token;                                                  \
64       } else if (yyextra->language_version >= reserved_version) {       \
65          _mesa_glsl_error(yylloc, yyextra,                              \
66                           "Illegal use of reserved word `%s'", yytext); \
67          return ERROR_TOK;                                              \
68       } else {                                                          \
69          yylval->identifier = strdup(yytext);                           \
70          return classify_identifier(yyextra, yytext);                   \
71       }                                                                 \
72    } while (0)
73
74 /* The ES macro can be used in KEYWORD checks:
75  *
76  *    word      KEYWORD(110 || ES, 400, TOKEN)
77  * ...means the word is reserved in GLSL ES 1.00, while
78  *
79  *    word      KEYWORD(110, 130 || ES, TOKEN)
80  * ...means the word is a legal keyword in GLSL ES 1.00.
81  */
82 #define ES yyextra->es_shader
83
84 static int
85 literal_integer(char *text, int len, struct _mesa_glsl_parse_state *state,
86                 YYSTYPE *lval, YYLTYPE *lloc, int base)
87 {
88    bool is_uint = (text[len - 1] == 'u' ||
89                    text[len - 1] == 'U');
90    const char *digits = text;
91
92    /* Skip "0x" */
93    if (base == 16)
94       digits += 2;
95
96 #ifdef _MSC_VER
97    unsigned __int64 value = _strtoui64(digits, NULL, base);
98 #else
99    unsigned long long value = strtoull(digits, NULL, base);
100 #endif
101
102    lval->n = (int)value;
103
104    if (value > UINT_MAX) {
105       /* Note that signed 0xffffffff is valid, not out of range! */
106       if (state->language_version >= 130) {
107          _mesa_glsl_error(lloc, state,
108                           "Literal value `%s' out of range", text);
109       } else {
110          _mesa_glsl_warning(lloc, state,
111                             "Literal value `%s' out of range", text);
112       }
113    } else if (base == 10 && !is_uint && (unsigned)value > (unsigned)INT_MAX + 1) {
114       /* Tries to catch unintentionally providing a negative value.
115        * Note that -2147483648 is parsed as -(2147483648), so we don't
116        * want to warn for INT_MAX.
117        */
118       _mesa_glsl_warning(lloc, state,
119                          "Signed literal value `%s' is interpreted as %d",
120                          text, lval->n);
121    }
122    return is_uint ? UINTCONSTANT : INTCONSTANT;
123 }
124
125 #define LITERAL_INTEGER(base) \
126    literal_integer(yytext, yyleng, yyextra, yylval, yylloc, base)
127
128 %}
129
130 %option bison-bridge bison-locations reentrant noyywrap
131 %option nounput noyy_top_state
132 %option never-interactive
133 %option prefix="_mesa_glsl_"
134 %option extra-type="struct _mesa_glsl_parse_state *"
135
136 %x PP PRAGMA
137
138 DEC_INT         [1-9][0-9]*
139 HEX_INT         0[xX][0-9a-fA-F]+
140 OCT_INT         0[0-7]*
141 INT             ({DEC_INT}|{HEX_INT}|{OCT_INT})
142 SPC             [ \t]*
143 SPCP            [ \t]+
144 HASH            ^{SPC}#{SPC}
145 %%
146
147 [ \r\t]+                ;
148
149     /* Preprocessor tokens. */ 
150 ^[ \t]*#[ \t]*$                 ;
151 ^[ \t]*#[ \t]*version           { BEGIN PP; return VERSION_TOK; }
152 ^[ \t]*#[ \t]*extension         { BEGIN PP; return EXTENSION; }
153 {HASH}line{SPCP}{INT}{SPCP}{INT}{SPC}$ {
154                                    /* Eat characters until the first digit is
155                                     * encountered
156                                     */
157                                    char *ptr = yytext;
158                                    while (!isdigit(*ptr))
159                                       ptr++;
160
161                                    /* Subtract one from the line number because
162                                     * yylineno is zero-based instead of
163                                     * one-based.
164                                     */
165                                    yylineno = strtol(ptr, &ptr, 0) - 1;
166                                    yylloc->source = strtol(ptr, NULL, 0);
167                                 }
168 {HASH}line{SPCP}{INT}{SPC}$     {
169                                    /* Eat characters until the first digit is
170                                     * encountered
171                                     */
172                                    char *ptr = yytext;
173                                    while (!isdigit(*ptr))
174                                       ptr++;
175
176                                    /* Subtract one from the line number because
177                                     * yylineno is zero-based instead of
178                                     * one-based.
179                                     */
180                                    yylineno = strtol(ptr, &ptr, 0) - 1;
181                                 }
182 ^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}on{SPC}\) {
183                                   BEGIN PP;
184                                   return PRAGMA_DEBUG_ON;
185                                 }
186 ^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}off{SPC}\) {
187                                   BEGIN PP;
188                                   return PRAGMA_DEBUG_OFF;
189                                 }
190 ^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}on{SPC}\) {
191                                   BEGIN PP;
192                                   return PRAGMA_OPTIMIZE_ON;
193                                 }
194 ^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}off{SPC}\) {
195                                   BEGIN PP;
196                                   return PRAGMA_OPTIMIZE_OFF;
197                                 }
198 ^{SPC}#{SPC}pragma{SPCP}STDGL{SPCP}invariant{SPC}\({SPC}all{SPC}\) {
199                                   BEGIN PP;
200                                   return PRAGMA_INVARIANT_ALL;
201                                 }
202 ^{SPC}#{SPC}pragma{SPCP}        { BEGIN PRAGMA; }
203
204 <PRAGMA>\n                      { BEGIN 0; yylineno++; yycolumn = 0; }
205 <PRAGMA>.                       { }
206
207 <PP>\/\/[^\n]*                  { }
208 <PP>[ \t\r]*                    { }
209 <PP>:                           return COLON;
210 <PP>[_a-zA-Z][_a-zA-Z0-9]*      {
211                                    yylval->identifier = strdup(yytext);
212                                    return IDENTIFIER;
213                                 }
214 <PP>[1-9][0-9]*                 {
215                                     yylval->n = strtol(yytext, NULL, 10);
216                                     return INTCONSTANT;
217                                 }
218 <PP>\n                          { BEGIN 0; yylineno++; yycolumn = 0; return EOL; }
219
220 \n              { yylineno++; yycolumn = 0; }
221
222 attribute       return ATTRIBUTE;
223 const           return CONST_TOK;
224 bool            return BOOL_TOK;
225 float           return FLOAT_TOK;
226 int             return INT_TOK;
227 uint            KEYWORD(130, 130, UINT_TOK);
228
229 break           return BREAK;
230 continue        return CONTINUE;
231 do              return DO;
232 while           return WHILE;
233 else            return ELSE;
234 for             return FOR;
235 if              return IF;
236 discard         return DISCARD;
237 return          return RETURN;
238
239 bvec2           return BVEC2;
240 bvec3           return BVEC3;
241 bvec4           return BVEC4;
242 ivec2           return IVEC2;
243 ivec3           return IVEC3;
244 ivec4           return IVEC4;
245 uvec2           KEYWORD(130, 130, UVEC2);
246 uvec3           KEYWORD(130, 130, UVEC3);
247 uvec4           KEYWORD(130, 130, UVEC4);
248 vec2            return VEC2;
249 vec3            return VEC3;
250 vec4            return VEC4;
251 mat2            return MAT2X2;
252 mat3            return MAT3X3;
253 mat4            return MAT4X4;
254 mat2x2          KEYWORD(120, 120, MAT2X2);
255 mat2x3          KEYWORD(120, 120, MAT2X3);
256 mat2x4          KEYWORD(120, 120, MAT2X4);
257 mat3x2          KEYWORD(120, 120, MAT3X2);
258 mat3x3          KEYWORD(120, 120, MAT3X3);
259 mat3x4          KEYWORD(120, 120, MAT3X4);
260 mat4x2          KEYWORD(120, 120, MAT4X2);
261 mat4x3          KEYWORD(120, 120, MAT4X3);
262 mat4x4          KEYWORD(120, 120, MAT4X4);
263
264 in              return IN_TOK;
265 out             return OUT_TOK;
266 inout           return INOUT_TOK;
267 uniform         return UNIFORM;
268 varying         return VARYING;
269 centroid        KEYWORD(120, 120, CENTROID);
270 invariant       KEYWORD(120 || ES, 120 || ES, INVARIANT);
271 flat            KEYWORD(130 || ES, 130, FLAT);
272 smooth          KEYWORD(130, 130, SMOOTH);
273 noperspective   KEYWORD(130, 130, NOPERSPECTIVE);
274
275 sampler1D       return SAMPLER1D;
276 sampler2D       return SAMPLER2D;
277 sampler3D       return SAMPLER3D;
278 samplerCube     return SAMPLERCUBE;
279 sampler1DArray  KEYWORD(130, 130, SAMPLER1DARRAY);
280 sampler2DArray  KEYWORD(130, 130, SAMPLER2DARRAY);
281 sampler1DShadow return SAMPLER1DSHADOW;
282 sampler2DShadow return SAMPLER2DSHADOW;
283 samplerCubeShadow       KEYWORD(130, 130, SAMPLERCUBESHADOW);
284 sampler1DArrayShadow    KEYWORD(130, 130, SAMPLER1DARRAYSHADOW);
285 sampler2DArrayShadow    KEYWORD(130, 130, SAMPLER2DARRAYSHADOW);
286 isampler1D              KEYWORD(130, 130, ISAMPLER1D);
287 isampler2D              KEYWORD(130, 130, ISAMPLER2D);
288 isampler3D              KEYWORD(130, 130, ISAMPLER3D);
289 isamplerCube            KEYWORD(130, 130, ISAMPLERCUBE);
290 isampler1DArray         KEYWORD(130, 130, ISAMPLER1DARRAY);
291 isampler2DArray         KEYWORD(130, 130, ISAMPLER2DARRAY);
292 usampler1D              KEYWORD(130, 130, USAMPLER1D);
293 usampler2D              KEYWORD(130, 130, USAMPLER2D);
294 usampler3D              KEYWORD(130, 130, USAMPLER3D);
295 usamplerCube            KEYWORD(130, 130, USAMPLERCUBE);
296 usampler1DArray         KEYWORD(130, 130, USAMPLER1DARRAY);
297 usampler2DArray         KEYWORD(130, 130, USAMPLER2DARRAY);
298
299 samplerExternalOES      {
300                           if (yyextra->OES_EGL_image_external_enable)
301                              return SAMPLEREXTERNALOES;
302                           else
303                              return IDENTIFIER;
304                         }
305
306
307 struct          return STRUCT;
308 void            return VOID_TOK;
309
310 layout          {
311                   if ((yyextra->language_version >= 140)
312                       || yyextra->AMD_conservative_depth_enable
313                       || yyextra->ARB_conservative_depth_enable
314                       || yyextra->ARB_explicit_attrib_location_enable
315                       || yyextra->ARB_uniform_buffer_object_enable
316                       || yyextra->ARB_fragment_coord_conventions_enable) {
317                       return LAYOUT_TOK;
318                    } else {
319                       yylval->identifier = strdup(yytext);
320                       return IDENTIFIER;
321                    }
322                 }
323
324 \+\+            return INC_OP;
325 --              return DEC_OP;
326 \<=             return LE_OP;
327 >=              return GE_OP;
328 ==              return EQ_OP;
329 !=              return NE_OP;
330 &&              return AND_OP;
331 \|\|            return OR_OP;
332 "^^"            return XOR_OP;
333 "<<"            return LEFT_OP;
334 ">>"            return RIGHT_OP;
335
336 \*=             return MUL_ASSIGN;
337 \/=             return DIV_ASSIGN;
338 \+=             return ADD_ASSIGN;
339 \%=             return MOD_ASSIGN;
340 \<\<=           return LEFT_ASSIGN;
341 >>=             return RIGHT_ASSIGN;
342 &=              return AND_ASSIGN;
343 "^="            return XOR_ASSIGN;
344 \|=             return OR_ASSIGN;
345 -=              return SUB_ASSIGN;
346
347 [1-9][0-9]*[uU]?        {
348                             return LITERAL_INTEGER(10);
349                         }
350 0[xX][0-9a-fA-F]+[uU]?  {
351                             return LITERAL_INTEGER(16);
352                         }
353 0[0-7]*[uU]?            {
354                             return LITERAL_INTEGER(8);
355                         }
356
357 [0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?   {
358                             yylval->real = glsl_strtod(yytext, NULL);
359                             return FLOATCONSTANT;
360                         }
361 \.[0-9]+([eE][+-]?[0-9]+)?[fF]?         {
362                             yylval->real = glsl_strtod(yytext, NULL);
363                             return FLOATCONSTANT;
364                         }
365 [0-9]+\.([eE][+-]?[0-9]+)?[fF]?         {
366                             yylval->real = glsl_strtod(yytext, NULL);
367                             return FLOATCONSTANT;
368                         }
369 [0-9]+[eE][+-]?[0-9]+[fF]?              {
370                             yylval->real = glsl_strtod(yytext, NULL);
371                             return FLOATCONSTANT;
372                         }
373 [0-9]+[fF]              {
374                             yylval->real = glsl_strtod(yytext, NULL);
375                             return FLOATCONSTANT;
376                         }
377
378 true                    {
379                             yylval->n = 1;
380                             return BOOLCONSTANT;
381                         }
382 false                   {
383                             yylval->n = 0;
384                             return BOOLCONSTANT;
385                         }
386
387
388     /* Reserved words in GLSL 1.10. */
389 asm             KEYWORD(110 || ES, 999, ASM);
390 class           KEYWORD(110 || ES, 999, CLASS);
391 union           KEYWORD(110 || ES, 999, UNION);
392 enum            KEYWORD(110 || ES, 999, ENUM);
393 typedef         KEYWORD(110 || ES, 999, TYPEDEF);
394 template        KEYWORD(110 || ES, 999, TEMPLATE);
395 this            KEYWORD(110 || ES, 999, THIS);
396 packed          KEYWORD(110 || ES, 140 || yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK);
397 goto            KEYWORD(110 || ES, 999, GOTO);
398 switch          KEYWORD(110 || ES, 130, SWITCH);
399 default         KEYWORD(110 || ES, 130, DEFAULT);
400 inline          KEYWORD(110 || ES, 999, INLINE_TOK);
401 noinline        KEYWORD(110 || ES, 999, NOINLINE);
402 volatile        KEYWORD(110 || ES, 999, VOLATILE);
403 public          KEYWORD(110 || ES, 999, PUBLIC_TOK);
404 static          KEYWORD(110 || ES, 999, STATIC);
405 extern          KEYWORD(110 || ES, 999, EXTERN);
406 external        KEYWORD(110 || ES, 999, EXTERNAL);
407 interface       KEYWORD(110 || ES, 999, INTERFACE);
408 long            KEYWORD(110 || ES, 999, LONG_TOK);
409 short           KEYWORD(110 || ES, 999, SHORT_TOK);
410 double          KEYWORD(110 || ES, 400, DOUBLE_TOK);
411 half            KEYWORD(110 || ES, 999, HALF);
412 fixed           KEYWORD(110 || ES, 999, FIXED_TOK);
413 unsigned        KEYWORD(110 || ES, 999, UNSIGNED);
414 input           KEYWORD(110 || ES, 999, INPUT_TOK);
415 output          KEYWORD(110 || ES, 999, OUTPUT);
416 hvec2           KEYWORD(110 || ES, 999, HVEC2);
417 hvec3           KEYWORD(110 || ES, 999, HVEC3);
418 hvec4           KEYWORD(110 || ES, 999, HVEC4);
419 dvec2           KEYWORD(110 || ES, 400, DVEC2);
420 dvec3           KEYWORD(110 || ES, 400, DVEC3);
421 dvec4           KEYWORD(110 || ES, 400, DVEC4);
422 fvec2           KEYWORD(110 || ES, 999, FVEC2);
423 fvec3           KEYWORD(110 || ES, 999, FVEC3);
424 fvec4           KEYWORD(110 || ES, 999, FVEC4);
425 sampler2DRect           return SAMPLER2DRECT;
426 sampler3DRect           KEYWORD(110 || ES, 999, SAMPLER3DRECT);
427 sampler2DRectShadow     return SAMPLER2DRECTSHADOW;
428 sizeof          KEYWORD(110 || ES, 999, SIZEOF);
429 cast            KEYWORD(110 || ES, 999, CAST);
430 namespace       KEYWORD(110 || ES, 999, NAMESPACE);
431 using           KEYWORD(110 || ES, 999, USING);
432
433     /* Additional reserved words in GLSL 1.20. */
434 lowp            KEYWORD(120, 130 || ES, LOWP);
435 mediump         KEYWORD(120, 130 || ES, MEDIUMP);
436 highp           KEYWORD(120, 130 || ES, HIGHP);
437 precision       KEYWORD(120, 130 || ES, PRECISION);
438
439     /* Additional reserved words in GLSL 1.30. */
440 case            KEYWORD(130, 130, CASE);
441 common          KEYWORD(130, 999, COMMON);
442 partition       KEYWORD(130, 999, PARTITION);
443 active          KEYWORD(130, 999, ACTIVE);
444 superp          KEYWORD(130 || ES, 999, SUPERP);
445 samplerBuffer   KEYWORD(130, 140, SAMPLERBUFFER);
446 filter          KEYWORD(130, 999, FILTER);
447 image1D         KEYWORD(130, 999, IMAGE1D);
448 image2D         KEYWORD(130, 999, IMAGE2D);
449 image3D         KEYWORD(130, 999, IMAGE3D);
450 imageCube       KEYWORD(130, 999, IMAGECUBE);
451 iimage1D        KEYWORD(130, 999, IIMAGE1D);
452 iimage2D        KEYWORD(130, 999, IIMAGE2D);
453 iimage3D        KEYWORD(130, 999, IIMAGE3D);
454 iimageCube      KEYWORD(130, 999, IIMAGECUBE);
455 uimage1D        KEYWORD(130, 999, UIMAGE1D);
456 uimage2D        KEYWORD(130, 999, UIMAGE2D);
457 uimage3D        KEYWORD(130, 999, UIMAGE3D);
458 uimageCube      KEYWORD(130, 999, UIMAGECUBE);
459 image1DArray    KEYWORD(130, 999, IMAGE1DARRAY);
460 image2DArray    KEYWORD(130, 999, IMAGE2DARRAY);
461 iimage1DArray   KEYWORD(130, 999, IIMAGE1DARRAY);
462 iimage2DArray   KEYWORD(130, 999, IIMAGE2DARRAY);
463 uimage1DArray   KEYWORD(130, 999, UIMAGE1DARRAY);
464 uimage2DArray   KEYWORD(130, 999, UIMAGE2DARRAY);
465 image1DShadow   KEYWORD(130, 999, IMAGE1DSHADOW);
466 image2DShadow   KEYWORD(130, 999, IMAGE2DSHADOW);
467 image1DArrayShadow KEYWORD(130, 999, IMAGE1DARRAYSHADOW);
468 image2DArrayShadow KEYWORD(130, 999, IMAGE2DARRAYSHADOW);
469 imageBuffer     KEYWORD(130, 999, IMAGEBUFFER);
470 iimageBuffer    KEYWORD(130, 999, IIMAGEBUFFER);
471 uimageBuffer    KEYWORD(130, 999, UIMAGEBUFFER);
472 row_major       KEYWORD(130, 140 || yyextra->ARB_uniform_buffer_object_enable, ROW_MAJOR);
473
474     /* Additional reserved words in GLSL 1.40 */
475 isampler2DRect  KEYWORD(140, 140, ISAMPLER2DRECT);
476 usampler2DRect  KEYWORD(140, 140, USAMPLER2DRECT);
477 isamplerBuffer  KEYWORD(140, 140, ISAMPLERBUFFER);
478 usamplerBuffer  KEYWORD(140, 140, USAMPLERBUFFER);
479
480 [_a-zA-Z][_a-zA-Z0-9]*  {
481                             struct _mesa_glsl_parse_state *state = yyextra;
482                             void *ctx = state;  
483                             yylval->identifier = ralloc_strdup(ctx, yytext);
484                             return classify_identifier(state, yytext);
485                         }
486
487 .                       { return yytext[0]; }
488
489 %%
490
491 int
492 classify_identifier(struct _mesa_glsl_parse_state *state, const char *name)
493 {
494    if (state->symbols->get_variable(name) || state->symbols->get_function(name))
495       return IDENTIFIER;
496    else if (state->symbols->get_type(name))
497       return TYPE_IDENTIFIER;
498    else
499       return NEW_IDENTIFIER;
500 }
501
502 void
503 _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, const char *string)
504 {
505    yylex_init_extra(state, & state->scanner);
506    yy_scan_string(string, state->scanner);
507 }
508
509 void
510 _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state)
511 {
512    yylex_destroy(state->scanner);
513 }