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