xref: /aosp_15_r20/external/mesa3d/src/mesa/program/program_lexer.l (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker %{
2*61046927SAndroid Build Coastguard Worker /*
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2009 Intel Corporation
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker  *
12*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
13*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
14*61046927SAndroid Build Coastguard Worker  * Software.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker  */
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #ifndef _MSC_VER
26*61046927SAndroid Build Coastguard Worker #include <unistd.h>
27*61046927SAndroid Build Coastguard Worker #endif
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #include "program/prog_instruction.h"
32*61046927SAndroid Build Coastguard Worker #include "program/prog_statevars.h"
33*61046927SAndroid Build Coastguard Worker #include "program/symbol_table.h"
34*61046927SAndroid Build Coastguard Worker #include "program/program_parser.h"
35*61046927SAndroid Build Coastguard Worker #include "program/program_parse.tab.h"
36*61046927SAndroid Build Coastguard Worker #include "util/strtod.h"
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker #define require_ARB_vp (yyextra->mode == ARB_vertex)
39*61046927SAndroid Build Coastguard Worker #define require_ARB_fp (yyextra->mode == ARB_fragment)
40*61046927SAndroid Build Coastguard Worker #define require_shadow (yyextra->option.Shadow)
41*61046927SAndroid Build Coastguard Worker #define require_rect   (yyextra->option.TexRect)
42*61046927SAndroid Build Coastguard Worker #define require_texarray        (yyextra->option.TexArray)
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker #ifndef HAVE_UNISTD_H
45*61046927SAndroid Build Coastguard Worker #define YY_NO_UNISTD_H
46*61046927SAndroid Build Coastguard Worker #endif
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker #define return_token_or_IDENTIFIER(condition, token)	\
49*61046927SAndroid Build Coastguard Worker    do {							\
50*61046927SAndroid Build Coastguard Worker       if (condition) {					\
51*61046927SAndroid Build Coastguard Worker 	 return token;					\
52*61046927SAndroid Build Coastguard Worker       } else {						\
53*61046927SAndroid Build Coastguard Worker 	 return handle_ident(yyextra, yytext, yylval);	\
54*61046927SAndroid Build Coastguard Worker       }							\
55*61046927SAndroid Build Coastguard Worker    } while (0)
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker #define return_token_or_DOT(condition, token)		\
58*61046927SAndroid Build Coastguard Worker    do {							\
59*61046927SAndroid Build Coastguard Worker       if (condition) {					\
60*61046927SAndroid Build Coastguard Worker 	 return token;					\
61*61046927SAndroid Build Coastguard Worker       } else {						\
62*61046927SAndroid Build Coastguard Worker 	 yyless(1);					\
63*61046927SAndroid Build Coastguard Worker 	 return DOT;					\
64*61046927SAndroid Build Coastguard Worker       }							\
65*61046927SAndroid Build Coastguard Worker    } while (0)
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker #define return_opcode(condition, token, opcode, len)	\
69*61046927SAndroid Build Coastguard Worker    do {							\
70*61046927SAndroid Build Coastguard Worker       if (condition &&					\
71*61046927SAndroid Build Coastguard Worker 	  _mesa_parse_instruction_suffix(yyextra,	\
72*61046927SAndroid Build Coastguard Worker 					 yytext + len,	\
73*61046927SAndroid Build Coastguard Worker 					 & yylval->temp_inst)) {	\
74*61046927SAndroid Build Coastguard Worker 	 yylval->temp_inst.Opcode = OPCODE_ ## opcode;	\
75*61046927SAndroid Build Coastguard Worker 	 return token;					\
76*61046927SAndroid Build Coastguard Worker       } else {						\
77*61046927SAndroid Build Coastguard Worker 	 return handle_ident(yyextra, yytext, yylval);	\
78*61046927SAndroid Build Coastguard Worker       }							\
79*61046927SAndroid Build Coastguard Worker    } while (0)
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker #define SWIZZLE_INVAL  MAKE_SWIZZLE4(SWIZZLE_NIL, SWIZZLE_NIL, \
82*61046927SAndroid Build Coastguard Worker 				     SWIZZLE_NIL, SWIZZLE_NIL)
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker static unsigned
mask_from_char(char c)85*61046927SAndroid Build Coastguard Worker mask_from_char(char c)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker    switch (c) {
88*61046927SAndroid Build Coastguard Worker    case 'x':
89*61046927SAndroid Build Coastguard Worker    case 'r':
90*61046927SAndroid Build Coastguard Worker       return WRITEMASK_X;
91*61046927SAndroid Build Coastguard Worker    case 'y':
92*61046927SAndroid Build Coastguard Worker    case 'g':
93*61046927SAndroid Build Coastguard Worker       return WRITEMASK_Y;
94*61046927SAndroid Build Coastguard Worker    case 'z':
95*61046927SAndroid Build Coastguard Worker    case 'b':
96*61046927SAndroid Build Coastguard Worker       return WRITEMASK_Z;
97*61046927SAndroid Build Coastguard Worker    case 'w':
98*61046927SAndroid Build Coastguard Worker    case 'a':
99*61046927SAndroid Build Coastguard Worker       return WRITEMASK_W;
100*61046927SAndroid Build Coastguard Worker    }
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker    return 0;
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker static unsigned
swiz_from_char(char c)106*61046927SAndroid Build Coastguard Worker swiz_from_char(char c)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker    switch (c) {
109*61046927SAndroid Build Coastguard Worker    case 'x':
110*61046927SAndroid Build Coastguard Worker    case 'r':
111*61046927SAndroid Build Coastguard Worker       return SWIZZLE_X;
112*61046927SAndroid Build Coastguard Worker    case 'y':
113*61046927SAndroid Build Coastguard Worker    case 'g':
114*61046927SAndroid Build Coastguard Worker       return SWIZZLE_Y;
115*61046927SAndroid Build Coastguard Worker    case 'z':
116*61046927SAndroid Build Coastguard Worker    case 'b':
117*61046927SAndroid Build Coastguard Worker       return SWIZZLE_Z;
118*61046927SAndroid Build Coastguard Worker    case 'w':
119*61046927SAndroid Build Coastguard Worker    case 'a':
120*61046927SAndroid Build Coastguard Worker       return SWIZZLE_W;
121*61046927SAndroid Build Coastguard Worker    }
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    return 0;
124*61046927SAndroid Build Coastguard Worker }
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker static int
handle_ident(struct asm_parser_state * state,const char * text,YYSTYPE * lval)127*61046927SAndroid Build Coastguard Worker handle_ident(struct asm_parser_state *state, const char *text, YYSTYPE *lval)
128*61046927SAndroid Build Coastguard Worker {
129*61046927SAndroid Build Coastguard Worker    lval->string = strdup(text);
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker    return (_mesa_symbol_table_find_symbol(state->st, text) == NULL)
132*61046927SAndroid Build Coastguard Worker       ? IDENTIFIER : USED_IDENTIFIER;
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker #define YY_USER_ACTION							\
136*61046927SAndroid Build Coastguard Worker    do {									\
137*61046927SAndroid Build Coastguard Worker       yylloc->first_column = yylloc->last_column;			\
138*61046927SAndroid Build Coastguard Worker       yylloc->last_column += yyleng;					\
139*61046927SAndroid Build Coastguard Worker       if ((yylloc->first_line == 1)					\
140*61046927SAndroid Build Coastguard Worker 	  && (yylloc->first_column == 1)) {				\
141*61046927SAndroid Build Coastguard Worker 	 yylloc->position = 1;						\
142*61046927SAndroid Build Coastguard Worker       } else {								\
143*61046927SAndroid Build Coastguard Worker 	 yylloc->position += yylloc->last_column - yylloc->first_column; \
144*61046927SAndroid Build Coastguard Worker       }									\
145*61046927SAndroid Build Coastguard Worker    } while(0);
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker #define YY_NO_INPUT
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker /* Yes, this is intentionally doing nothing. We have this line of code
150*61046927SAndroid Build Coastguard Worker here only to avoid the compiler complaining about an unput function
151*61046927SAndroid Build Coastguard Worker that is defined, but never called. */
152*61046927SAndroid Build Coastguard Worker #define YY_USER_INIT while (0) { unput(0); }
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker #define YY_EXTRA_TYPE struct asm_parser_state *
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker /* Flex defines a couple of functions with no declarations nor the
157*61046927SAndroid Build Coastguard Worker static keyword. Declare them here to avoid a compiler warning. */
158*61046927SAndroid Build Coastguard Worker int yyget_column  (yyscan_t yyscanner);
159*61046927SAndroid Build Coastguard Worker void yyset_column (int  column_no , yyscan_t yyscanner);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker %}
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker num    [0-9]+
164*61046927SAndroid Build Coastguard Worker exp    [Ee][-+]?[0-9]+
165*61046927SAndroid Build Coastguard Worker frac   "."[0-9]+
166*61046927SAndroid Build Coastguard Worker dot    "."[ \t]*
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker sat    (_SAT)?
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker %option prefix="_mesa_program_lexer_"
171*61046927SAndroid Build Coastguard Worker %option bison-bridge bison-locations reentrant noyywrap
172*61046927SAndroid Build Coastguard Worker %%
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker "!!ARBvp1.0"              { return ARBvp_10; }
175*61046927SAndroid Build Coastguard Worker "!!ARBfp1.0"              { return ARBfp_10; }
176*61046927SAndroid Build Coastguard Worker ADDRESS                   {
177*61046927SAndroid Build Coastguard Worker    yylval->integer = at_address;
178*61046927SAndroid Build Coastguard Worker    return_token_or_IDENTIFIER(require_ARB_vp, ADDRESS);
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker ALIAS                     { return ALIAS; }
181*61046927SAndroid Build Coastguard Worker ATTRIB                    { return ATTRIB; }
182*61046927SAndroid Build Coastguard Worker END                       { return END; }
183*61046927SAndroid Build Coastguard Worker OPTION                    { return OPTION; }
184*61046927SAndroid Build Coastguard Worker OUTPUT                    { return OUTPUT; }
185*61046927SAndroid Build Coastguard Worker PARAM                     { return PARAM; }
186*61046927SAndroid Build Coastguard Worker TEMP                      { yylval->integer = at_temp; return TEMP; }
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker ABS{sat}           { return_opcode(             1, VECTOR_OP, ABS, 3); }
189*61046927SAndroid Build Coastguard Worker ADD{sat}           { return_opcode(             1, BIN_OP, ADD, 3); }
190*61046927SAndroid Build Coastguard Worker ARL                { return_opcode(require_ARB_vp, ARL, ARL, 3); }
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker CMP{sat}           { return_opcode(require_ARB_fp, TRI_OP, CMP, 3); }
193*61046927SAndroid Build Coastguard Worker COS{sat}           { return_opcode(require_ARB_fp, SCALAR_OP, COS, 3); }
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker DP3{sat}           { return_opcode(             1, BIN_OP, DP3, 3); }
196*61046927SAndroid Build Coastguard Worker DP4{sat}           { return_opcode(             1, BIN_OP, DP4, 3); }
197*61046927SAndroid Build Coastguard Worker DPH{sat}           { return_opcode(             1, BIN_OP, DPH, 3); }
198*61046927SAndroid Build Coastguard Worker DST{sat}           { return_opcode(             1, BIN_OP, DST, 3); }
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker EX2{sat}           { return_opcode(             1, SCALAR_OP, EX2, 3); }
201*61046927SAndroid Build Coastguard Worker EXP                { return_opcode(require_ARB_vp, SCALAR_OP, EXP, 3); }
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker FLR{sat}           { return_opcode(             1, VECTOR_OP, FLR, 3); }
204*61046927SAndroid Build Coastguard Worker FRC{sat}           { return_opcode(             1, VECTOR_OP, FRC, 3); }
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker KIL                { return_opcode(require_ARB_fp, KIL, KIL, 3); }
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker LIT{sat}           { return_opcode(             1, VECTOR_OP, LIT, 3); }
209*61046927SAndroid Build Coastguard Worker LG2{sat}           { return_opcode(             1, SCALAR_OP, LG2, 3); }
210*61046927SAndroid Build Coastguard Worker LOG                { return_opcode(require_ARB_vp, SCALAR_OP, LOG, 3); }
211*61046927SAndroid Build Coastguard Worker LRP{sat}           { return_opcode(require_ARB_fp, TRI_OP, LRP, 3); }
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker MAD{sat}           { return_opcode(             1, TRI_OP, MAD, 3); }
214*61046927SAndroid Build Coastguard Worker MAX{sat}           { return_opcode(             1, BIN_OP, MAX, 3); }
215*61046927SAndroid Build Coastguard Worker MIN{sat}           { return_opcode(             1, BIN_OP, MIN, 3); }
216*61046927SAndroid Build Coastguard Worker MOV{sat}           { return_opcode(             1, VECTOR_OP, MOV, 3); }
217*61046927SAndroid Build Coastguard Worker MUL{sat}           { return_opcode(             1, BIN_OP, MUL, 3); }
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker POW{sat}           { return_opcode(             1, BINSC_OP, POW, 3); }
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker RCP{sat}           { return_opcode(             1, SCALAR_OP, RCP, 3); }
222*61046927SAndroid Build Coastguard Worker RSQ{sat}           { return_opcode(             1, SCALAR_OP, RSQ, 3); }
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker SCS{sat}           { return_opcode(require_ARB_fp, SCALAR_OP, SCS, 3); }
225*61046927SAndroid Build Coastguard Worker SGE{sat}           { return_opcode(             1, BIN_OP, SGE, 3); }
226*61046927SAndroid Build Coastguard Worker SIN{sat}           { return_opcode(require_ARB_fp, SCALAR_OP, SIN, 3); }
227*61046927SAndroid Build Coastguard Worker SLT{sat}           { return_opcode(             1, BIN_OP, SLT, 3); }
228*61046927SAndroid Build Coastguard Worker SUB{sat}           { return_opcode(             1, BIN_OP, SUB, 3); }
229*61046927SAndroid Build Coastguard Worker SWZ{sat}           { return_opcode(             1, SWZ, SWZ, 3); }
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker TEX{sat}           { return_opcode(require_ARB_fp, SAMPLE_OP, TEX, 3); }
232*61046927SAndroid Build Coastguard Worker TXB{sat}           { return_opcode(require_ARB_fp, SAMPLE_OP, TXB, 3); }
233*61046927SAndroid Build Coastguard Worker TXP{sat}           { return_opcode(require_ARB_fp, SAMPLE_OP, TXP, 3); }
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker XPD{sat}           { return_opcode(             1, BIN_OP, XPD, 3); }
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker vertex                    { return_token_or_IDENTIFIER(require_ARB_vp, VERTEX); }
238*61046927SAndroid Build Coastguard Worker fragment                  { return_token_or_IDENTIFIER(require_ARB_fp, FRAGMENT); }
239*61046927SAndroid Build Coastguard Worker program                   { return PROGRAM; }
240*61046927SAndroid Build Coastguard Worker state                     { return STATE; }
241*61046927SAndroid Build Coastguard Worker result                    { return RESULT; }
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker {dot}ambient              { return AMBIENT; }
244*61046927SAndroid Build Coastguard Worker {dot}attenuation          { return ATTENUATION; }
245*61046927SAndroid Build Coastguard Worker {dot}back                 { return BACK; }
246*61046927SAndroid Build Coastguard Worker {dot}clip                 { return_token_or_DOT(require_ARB_vp, CLIP); }
247*61046927SAndroid Build Coastguard Worker {dot}color                { return COLOR; }
248*61046927SAndroid Build Coastguard Worker {dot}depth                { return_token_or_DOT(require_ARB_fp, DEPTH); }
249*61046927SAndroid Build Coastguard Worker {dot}diffuse              { return DIFFUSE; }
250*61046927SAndroid Build Coastguard Worker {dot}direction            { return DIRECTION; }
251*61046927SAndroid Build Coastguard Worker {dot}emission             { return EMISSION; }
252*61046927SAndroid Build Coastguard Worker {dot}env                  { return ENV; }
253*61046927SAndroid Build Coastguard Worker {dot}eye                  { return EYE; }
254*61046927SAndroid Build Coastguard Worker {dot}fogcoord             { return FOGCOORD; }
255*61046927SAndroid Build Coastguard Worker {dot}fog                  { return FOG; }
256*61046927SAndroid Build Coastguard Worker {dot}front                { return FRONT; }
257*61046927SAndroid Build Coastguard Worker {dot}half                 { return HALF; }
258*61046927SAndroid Build Coastguard Worker {dot}inverse              { return INVERSE; }
259*61046927SAndroid Build Coastguard Worker {dot}invtrans             { return INVTRANS; }
260*61046927SAndroid Build Coastguard Worker {dot}light                { return LIGHT; }
261*61046927SAndroid Build Coastguard Worker {dot}lightmodel           { return LIGHTMODEL; }
262*61046927SAndroid Build Coastguard Worker {dot}lightprod            { return LIGHTPROD; }
263*61046927SAndroid Build Coastguard Worker {dot}local                { return LOCAL; }
264*61046927SAndroid Build Coastguard Worker {dot}material             { return MATERIAL; }
265*61046927SAndroid Build Coastguard Worker {dot}program              { return MAT_PROGRAM; }
266*61046927SAndroid Build Coastguard Worker {dot}matrix               { return MATRIX; }
267*61046927SAndroid Build Coastguard Worker {dot}matrixindex          { return_token_or_DOT(require_ARB_vp, MATRIXINDEX); }
268*61046927SAndroid Build Coastguard Worker {dot}modelview            { return MODELVIEW; }
269*61046927SAndroid Build Coastguard Worker {dot}mvp                  { return MVP; }
270*61046927SAndroid Build Coastguard Worker {dot}normal               { return_token_or_DOT(require_ARB_vp, NORMAL); }
271*61046927SAndroid Build Coastguard Worker {dot}object               { return OBJECT; }
272*61046927SAndroid Build Coastguard Worker {dot}palette              { return PALETTE; }
273*61046927SAndroid Build Coastguard Worker {dot}params               { return PARAMS; }
274*61046927SAndroid Build Coastguard Worker {dot}plane                { return PLANE; }
275*61046927SAndroid Build Coastguard Worker {dot}point                { return_token_or_DOT(require_ARB_vp, POINT_TOK); }
276*61046927SAndroid Build Coastguard Worker {dot}pointsize            { return_token_or_DOT(require_ARB_vp, POINTSIZE); }
277*61046927SAndroid Build Coastguard Worker {dot}position             { return POSITION; }
278*61046927SAndroid Build Coastguard Worker {dot}primary              { return PRIMARY; }
279*61046927SAndroid Build Coastguard Worker {dot}projection           { return PROJECTION; }
280*61046927SAndroid Build Coastguard Worker {dot}range                { return_token_or_DOT(require_ARB_fp, RANGE); }
281*61046927SAndroid Build Coastguard Worker {dot}row                  { return ROW; }
282*61046927SAndroid Build Coastguard Worker {dot}scenecolor           { return SCENECOLOR; }
283*61046927SAndroid Build Coastguard Worker {dot}secondary            { return SECONDARY; }
284*61046927SAndroid Build Coastguard Worker {dot}shininess            { return SHININESS; }
285*61046927SAndroid Build Coastguard Worker {dot}size                 { return_token_or_DOT(require_ARB_vp, SIZE_TOK); }
286*61046927SAndroid Build Coastguard Worker {dot}specular             { return SPECULAR; }
287*61046927SAndroid Build Coastguard Worker {dot}spot                 { return SPOT; }
288*61046927SAndroid Build Coastguard Worker {dot}texcoord             { return TEXCOORD; }
289*61046927SAndroid Build Coastguard Worker {dot}texenv               { return_token_or_DOT(require_ARB_fp, TEXENV); }
290*61046927SAndroid Build Coastguard Worker {dot}texgen               { return_token_or_DOT(require_ARB_vp, TEXGEN); }
291*61046927SAndroid Build Coastguard Worker {dot}q                    { return_token_or_DOT(require_ARB_vp, TEXGEN_Q); }
292*61046927SAndroid Build Coastguard Worker {dot}s                    { return_token_or_DOT(require_ARB_vp, TEXGEN_S); }
293*61046927SAndroid Build Coastguard Worker {dot}t                    { return_token_or_DOT(require_ARB_vp, TEXGEN_T); }
294*61046927SAndroid Build Coastguard Worker {dot}texture              { return TEXTURE; }
295*61046927SAndroid Build Coastguard Worker {dot}transpose            { return TRANSPOSE; }
296*61046927SAndroid Build Coastguard Worker {dot}attrib               { return_token_or_DOT(require_ARB_vp, VTXATTRIB); }
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker texture                   { return_token_or_IDENTIFIER(require_ARB_fp, TEXTURE_UNIT); }
299*61046927SAndroid Build Coastguard Worker 1D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_1D); }
300*61046927SAndroid Build Coastguard Worker 2D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_2D); }
301*61046927SAndroid Build Coastguard Worker 3D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); }
302*61046927SAndroid Build Coastguard Worker CUBE                      { return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); }
303*61046927SAndroid Build Coastguard Worker RECT                      { return_token_or_IDENTIFIER(require_ARB_fp && require_rect, TEX_RECT); }
304*61046927SAndroid Build Coastguard Worker SHADOW1D                  { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW1D); }
305*61046927SAndroid Build Coastguard Worker SHADOW2D                  { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW2D); }
306*61046927SAndroid Build Coastguard Worker SHADOWRECT                { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_rect, TEX_SHADOWRECT); }
307*61046927SAndroid Build Coastguard Worker ARRAY1D                   { return_token_or_IDENTIFIER(require_ARB_fp && require_texarray, TEX_ARRAY1D); }
308*61046927SAndroid Build Coastguard Worker ARRAY2D                   { return_token_or_IDENTIFIER(require_ARB_fp && require_texarray, TEX_ARRAY2D); }
309*61046927SAndroid Build Coastguard Worker ARRAYSHADOW1D             { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_texarray, TEX_ARRAYSHADOW1D); }
310*61046927SAndroid Build Coastguard Worker ARRAYSHADOW2D             { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_texarray, TEX_ARRAYSHADOW2D); }
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker [_a-zA-Z$][_a-zA-Z0-9$]*  { return handle_ident(yyextra, yytext, yylval); }
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker ".."                      { return DOT_DOT; }
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker {num}                     {
317*61046927SAndroid Build Coastguard Worker    yylval->integer = strtol(yytext, NULL, 10);
318*61046927SAndroid Build Coastguard Worker    return INTEGER;
319*61046927SAndroid Build Coastguard Worker }
320*61046927SAndroid Build Coastguard Worker {num}?{frac}{exp}?        {
321*61046927SAndroid Build Coastguard Worker    yylval->real = _mesa_strtof(yytext, NULL);
322*61046927SAndroid Build Coastguard Worker    return REAL;
323*61046927SAndroid Build Coastguard Worker }
324*61046927SAndroid Build Coastguard Worker {num}"."/[^.]             {
325*61046927SAndroid Build Coastguard Worker    yylval->real = _mesa_strtof(yytext, NULL);
326*61046927SAndroid Build Coastguard Worker    return REAL;
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker {num}{exp}                {
329*61046927SAndroid Build Coastguard Worker    yylval->real = _mesa_strtof(yytext, NULL);
330*61046927SAndroid Build Coastguard Worker    return REAL;
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker {num}"."{exp}             {
333*61046927SAndroid Build Coastguard Worker    yylval->real = _mesa_strtof(yytext, NULL);
334*61046927SAndroid Build Coastguard Worker    return REAL;
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker ".xyzw"                   {
338*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_NOOP;
339*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_XYZW;
340*61046927SAndroid Build Coastguard Worker    return MASK4;
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker ".xy"[zw]                 {
344*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
345*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_XY
346*61046927SAndroid Build Coastguard Worker       | mask_from_char(yytext[3]);
347*61046927SAndroid Build Coastguard Worker    return MASK3;
348*61046927SAndroid Build Coastguard Worker }
349*61046927SAndroid Build Coastguard Worker ".xzw"                    {
350*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
351*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_XZW;
352*61046927SAndroid Build Coastguard Worker    return MASK3;
353*61046927SAndroid Build Coastguard Worker }
354*61046927SAndroid Build Coastguard Worker ".yzw"                    {
355*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
356*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_YZW;
357*61046927SAndroid Build Coastguard Worker    return MASK3;
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker ".x"[yzw]                 {
361*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
362*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_X
363*61046927SAndroid Build Coastguard Worker       | mask_from_char(yytext[2]);
364*61046927SAndroid Build Coastguard Worker    return MASK2;
365*61046927SAndroid Build Coastguard Worker }
366*61046927SAndroid Build Coastguard Worker ".y"[zw]                  {
367*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
368*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_Y
369*61046927SAndroid Build Coastguard Worker       | mask_from_char(yytext[2]);
370*61046927SAndroid Build Coastguard Worker    return MASK2;
371*61046927SAndroid Build Coastguard Worker }
372*61046927SAndroid Build Coastguard Worker ".zw"                     {
373*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
374*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_ZW;
375*61046927SAndroid Build Coastguard Worker    return MASK2;
376*61046927SAndroid Build Coastguard Worker }
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker "."[xyzw]                 {
379*61046927SAndroid Build Coastguard Worker    const unsigned s = swiz_from_char(yytext[1]);
380*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s);
381*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = mask_from_char(yytext[1]);
382*61046927SAndroid Build Coastguard Worker    return MASK1;
383*61046927SAndroid Build Coastguard Worker }
384*61046927SAndroid Build Coastguard Worker 
385*61046927SAndroid Build Coastguard Worker "."[xyzw]{4}              {
386*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]),
387*61046927SAndroid Build Coastguard Worker 					    swiz_from_char(yytext[2]),
388*61046927SAndroid Build Coastguard Worker 					    swiz_from_char(yytext[3]),
389*61046927SAndroid Build Coastguard Worker 					    swiz_from_char(yytext[4]));
390*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = 0;
391*61046927SAndroid Build Coastguard Worker    return SWIZZLE;
392*61046927SAndroid Build Coastguard Worker }
393*61046927SAndroid Build Coastguard Worker 
394*61046927SAndroid Build Coastguard Worker ".rgba"                   {
395*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_NOOP;
396*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_XYZW;
397*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK4);
398*61046927SAndroid Build Coastguard Worker }
399*61046927SAndroid Build Coastguard Worker 
400*61046927SAndroid Build Coastguard Worker ".rg"[ba]                 {
401*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
402*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_XY
403*61046927SAndroid Build Coastguard Worker       | mask_from_char(yytext[3]);
404*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK3);
405*61046927SAndroid Build Coastguard Worker }
406*61046927SAndroid Build Coastguard Worker ".rba"                    {
407*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
408*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_XZW;
409*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK3);
410*61046927SAndroid Build Coastguard Worker }
411*61046927SAndroid Build Coastguard Worker ".gba"                    {
412*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
413*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_YZW;
414*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK3);
415*61046927SAndroid Build Coastguard Worker }
416*61046927SAndroid Build Coastguard Worker 
417*61046927SAndroid Build Coastguard Worker ".r"[gba]                 {
418*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
419*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_X
420*61046927SAndroid Build Coastguard Worker       | mask_from_char(yytext[2]);
421*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK2);
422*61046927SAndroid Build Coastguard Worker }
423*61046927SAndroid Build Coastguard Worker ".g"[ba]                  {
424*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
425*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_Y
426*61046927SAndroid Build Coastguard Worker       | mask_from_char(yytext[2]);
427*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK2);
428*61046927SAndroid Build Coastguard Worker }
429*61046927SAndroid Build Coastguard Worker ".ba"                     {
430*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
431*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = WRITEMASK_ZW;
432*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK2);
433*61046927SAndroid Build Coastguard Worker }
434*61046927SAndroid Build Coastguard Worker 
435*61046927SAndroid Build Coastguard Worker "."[gba]                  {
436*61046927SAndroid Build Coastguard Worker    const unsigned s = swiz_from_char(yytext[1]);
437*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s);
438*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = mask_from_char(yytext[1]);
439*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, MASK1);
440*61046927SAndroid Build Coastguard Worker }
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker 
443*61046927SAndroid Build Coastguard Worker ".r"                      {
444*61046927SAndroid Build Coastguard Worker    if (require_ARB_vp) {
445*61046927SAndroid Build Coastguard Worker       return TEXGEN_R;
446*61046927SAndroid Build Coastguard Worker    } else {
447*61046927SAndroid Build Coastguard Worker       yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X,
448*61046927SAndroid Build Coastguard Worker 						SWIZZLE_X, SWIZZLE_X);
449*61046927SAndroid Build Coastguard Worker       yylval->swiz_mask.mask = WRITEMASK_X;
450*61046927SAndroid Build Coastguard Worker       return MASK1;
451*61046927SAndroid Build Coastguard Worker    }
452*61046927SAndroid Build Coastguard Worker }
453*61046927SAndroid Build Coastguard Worker 
454*61046927SAndroid Build Coastguard Worker "."[rgba]{4}              {
455*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]),
456*61046927SAndroid Build Coastguard Worker 					    swiz_from_char(yytext[2]),
457*61046927SAndroid Build Coastguard Worker 					    swiz_from_char(yytext[3]),
458*61046927SAndroid Build Coastguard Worker 					    swiz_from_char(yytext[4]));
459*61046927SAndroid Build Coastguard Worker    yylval->swiz_mask.mask = 0;
460*61046927SAndroid Build Coastguard Worker    return_token_or_DOT(require_ARB_fp, SWIZZLE);
461*61046927SAndroid Build Coastguard Worker }
462*61046927SAndroid Build Coastguard Worker 
463*61046927SAndroid Build Coastguard Worker "."                       { return DOT; }
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker \n                        {
466*61046927SAndroid Build Coastguard Worker    yylloc->first_line++;
467*61046927SAndroid Build Coastguard Worker    yylloc->first_column = 1;
468*61046927SAndroid Build Coastguard Worker    yylloc->last_line++;
469*61046927SAndroid Build Coastguard Worker    yylloc->last_column = 1;
470*61046927SAndroid Build Coastguard Worker    yylloc->position++;
471*61046927SAndroid Build Coastguard Worker }
472*61046927SAndroid Build Coastguard Worker [ \t\r]+                  /* eat whitespace */ ;
473*61046927SAndroid Build Coastguard Worker #.*$                      /* eat comments */ ;
474*61046927SAndroid Build Coastguard Worker .                         { return yytext[0]; }
475*61046927SAndroid Build Coastguard Worker %%
476*61046927SAndroid Build Coastguard Worker 
477*61046927SAndroid Build Coastguard Worker void
478*61046927SAndroid Build Coastguard Worker _mesa_program_lexer_ctor(void **scanner, struct asm_parser_state *state,
479*61046927SAndroid Build Coastguard Worker 			 const char *string, size_t len)
480*61046927SAndroid Build Coastguard Worker {
481*61046927SAndroid Build Coastguard Worker    yylex_init_extra(state, scanner);
482*61046927SAndroid Build Coastguard Worker    yy_scan_bytes(string, len, *scanner);
483*61046927SAndroid Build Coastguard Worker }
484*61046927SAndroid Build Coastguard Worker 
485*61046927SAndroid Build Coastguard Worker void
_mesa_program_lexer_dtor(void * scanner)486*61046927SAndroid Build Coastguard Worker _mesa_program_lexer_dtor(void *scanner)
487*61046927SAndroid Build Coastguard Worker {
488*61046927SAndroid Build Coastguard Worker    yylex_destroy(scanner);
489*61046927SAndroid Build Coastguard Worker }
490