program_parse.y revision 8ca6fd8a83412e3a76746f0ee61027b796516f95
1770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{
2770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
3770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copyright © 2009 Intel Corporation
4770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
5770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
6770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * copy of this software and associated documentation files (the "Software"),
7770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to deal in the Software without restriction, including without limitation
8770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
10770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software is furnished to do so, subject to the following conditions:
11770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
12770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The above copyright notice and this permission notice (including the next
13770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * paragraph) shall be included in all copies or substantial portions of the
14770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software.
15770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
16770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * DEALINGS IN THE SOFTWARE.
23770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
24770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <stdio.h>
25770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <stdlib.h>
26770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <string.h>
27770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
28770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "main/mtypes.h"
29ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick#include "main/imports.h"
30ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick#include "program.h"
31770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_parameter.h"
32770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_parameter_layout.h"
33770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_statevars.h"
34770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_instruction.h"
35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
36770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "symbol_table.h"
37770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "program_parser.h"
38770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
39770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern void *yy_scan_string(char *);
40770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern void yy_delete_buffer(void *);
41770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
42770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_symbol *declare_variable(struct asm_parser_state *state,
43770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    char *name, enum asm_type t, struct YYLTYPE *locp);
44770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
45ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanickstatic int add_state_reference(struct gl_program_parameter_list *param_list,
46ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick    const gl_state_index tokens[STATE_LENGTH]);
47ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick
48770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_state(struct gl_program *prog,
49770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]);
50770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
51770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_param(struct gl_program *prog,
52770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]);
53770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
54770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_const(struct gl_program *prog,
55770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct asm_symbol *param_var, const struct asm_vector *vec);
56770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int yyparse(struct asm_parser_state *state);
58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
59ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanickstatic char *make_error_string(const char *fmt, ...);
60ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick
61770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void yyerror(struct YYLTYPE *locp, struct asm_parser_state *state,
62770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    const char *s);
63770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int validate_inputs(struct YYLTYPE *locp,
65770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct asm_parser_state *state);
66770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
67770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_dst_reg(struct prog_dst_register *r);
68770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_src_reg(struct asm_src_register *r);
70770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
71770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op,
72770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    const struct prog_dst_register *dst, const struct asm_src_register *src0,
73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    const struct asm_src_register *src1, const struct asm_src_register *src2);
74770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
75770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef FALSE
76770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define FALSE 0
77770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define TRUE (!FALSE)
78770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
79770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
80770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLLOC_DEFAULT(Current, Rhs, N)					\
81770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   do {									\
82770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (YYID(N)) {							\
83770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_line = YYRHSLOC(Rhs, 1).first_line;		\
84770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_column = YYRHSLOC(Rhs, 1).first_column;	\
85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).position = YYRHSLOC(Rhs, 1).position;		\
86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_line = YYRHSLOC(Rhs, N).last_line;		\
87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_column = YYRHSLOC(Rhs, N).last_column;		\
88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      } else {								\
89770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_line = YYRHSLOC(Rhs, 0).last_line;		\
90770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_line = (Current).first_line;			\
91770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_column = YYRHSLOC(Rhs, 0).last_column;		\
92770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_column = (Current).first_column;		\
93770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).position = YYRHSLOC(Rhs, 0).position			\
94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    + (Current).first_column;					\
95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }									\
96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } while(YYID(0))
97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLEX_PARAM state->scanner
99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%}
100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%pure-parser
102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%locations
103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%parse-param { struct asm_parser_state *state }
104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%error-verbose
105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%lex-param { void *scanner }
106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%union {
108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_instruction *inst;
109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol *sym;
110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol temp_sym;
111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_swizzle_mask swiz_mask;
112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_src_register src_reg;
113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct prog_dst_register dst_reg;
114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct prog_instruction temp_inst;
115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   char *string;
116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned result;
117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned attrib;
118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int integer;
119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   float real;
120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned state[5];
121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int negate;
122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_vector vector;
123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gl_inst_opcode opcode;
124565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
125565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   struct {
126565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned swz;
127565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned rgba_valid:1;
128565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned xyzw_valid:1;
129565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned negate:1;
130565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   } ext_swizzle;
131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ARBvp_10 ARBfp_10
134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* Tokens for assembler pseudo-ops */
136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> ADDRESS
137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ALIAS ATTRIB
138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OPTION OUTPUT
139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PARAM
140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> TEMP
141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token END
142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Tokens for instructions */
144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <temp_inst> BIN_OP BINSC_OP SAMPLE_OP SCALAR_OP TRI_OP VECTOR_OP
145ede0cd4d8c8eb8c6c443c84905138091944d69afIan Romanick%token <temp_inst> ARL KIL SWZ TXD_OP
146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> INTEGER
148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <real> REAL
149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token AMBIENT ATTENUATION
151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token BACK
152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token CLIP COLOR
153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DEPTH DIFFUSE DIRECTION
154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token EMISSION ENV EYE
155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token FOG FOGCOORD FRAGMENT FRONT
156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token HALF
157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token INVERSE INVTRANS
158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token LIGHT LIGHTMODEL LIGHTPROD LOCAL
159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token MATERIAL MAT_PROGRAM MATRIX MATRIXINDEX MODELVIEW MVP
160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token NORMAL
161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OBJECT
162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PALETTE PARAMS PLANE POINT POINTSIZE POSITION PRIMARY PROGRAM PROJECTION
163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token RANGE RESULT ROW
164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token SCENECOLOR SECONDARY SHININESS SIZE SPECULAR SPOT STATE
165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE
166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT
1671edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick%token TEX_SHADOW1D TEX_SHADOW2D TEX_SHADOWRECT
168aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick%token TEX_ARRAY1D TEX_ARRAY2D TEX_ARRAYSHADOW1D TEX_ARRAYSHADOW2D
169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token VERTEX VTXATTRIB
170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token WEIGHT
171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <string> IDENTIFIER
173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <swiz_mask> MASK4 MASK3 MASK2 MASK1 SWIZZLE
174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT_DOT
175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT
176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> instruction ALU_instruction TexInstruction
178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> ARL_instruction VECTORop_instruction
179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> SCALARop_instruction BINSCop_instruction BINop_instruction
1808ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick%type <inst> TRIop_instruction TXD_instruction SWZ_instruction SAMPLE_instruction
181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> KIL_instruction
182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <dst_reg> dstReg maskedDstReg maskedAddrReg
184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <src_reg> srcReg scalarSrcReg swizzleSrcReg
185565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <swiz_mask> scalarSuffix swizzleSuffix extendedSwizzle
186565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <ext_swizzle> extSwizComp extSwizSel
187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> optionalMask
188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> progParamArray
190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> addrRegRelOffset addrRegPosOffset addrRegNegOffset
191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <src_reg> progParamArrayMem progParamArrayAbs progParamArrayRel
192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> addrReg
193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> addrComponent addrWriteMask
194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <result> resultBinding resultColBinding
196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optFaceType optColorType
197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optResultFaceType optResultColorType
198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexImageUnitNum texImageUnitNum
200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexCoordUnitNum texCoordUnitNum
201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optLegacyTexUnitNum legacyTexUnitNum
202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> texImageUnit texTarget
203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> vtxAttribNum
204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <attrib> attribBinding vtxAttribItem fragAttribItem
206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleInit paramSingleItemDecl
208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optArraySize
209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateSingleItem stateMultipleItem
211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMaterialItem
212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLightItem stateLightModelItem stateLightProdItem
213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateTexGenItem stateFogItem stateClipPlaneItem statePointItem
214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixItem stateMatrixRow stateMatrixRows
215333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick%type <state> stateTexEnvItem stateDepthItem
216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLModProperty
218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixName optMatrixRows
219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateMatProperty
221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightProperty stateSpotProperty
222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightNumber stateLProdProperty
223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexGenType stateTexGenCoord
224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexEnvProperty
225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateFogProperty
226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateClipPlaneNum
227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> statePointProperty
228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptMatModifier stateMatModifier stateMatrixRowNum
230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptModMatNum stateModMatNum statePaletteMatNum
231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateProgramMatNum
232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> ambDiffSpecProperty
234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programSingleItem progEnvParam progLocalParam
236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programMultipleItem progEnvParams progLocalParams
237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramMultipleInit paramMultInitList paramMultipleItem
239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleItemUse
240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> progEnvParamNum progLocalParamNum
242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> progEnvParamNums progLocalParamNums
243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstDecl paramConstUse
245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstScalarDecl paramConstScalarUse paramConstVector
246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <real> signedFloatConstant
247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <negate> optionalSign
248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{
250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param,
251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    void *yyscanner);
252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%}
253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%%
255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickprogram: language optionSequence statementSequence END
257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanicklanguage: ARBvp_10
260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) {
262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid fragment program header");
263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   state->mode = ARB_vertex;
266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ARBfp_10
268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) {
270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid vertex program header");
271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   state->mode = ARB_fragment;
27388018e2e073909ae807f16707f2701e068900926Ian Romanick
27488018e2e073909ae807f16707f2701e068900926Ian Romanick	   state->option.TexRect =
27588018e2e073909ae807f16707f2701e068900926Ian Romanick	      (state->ctx->Extensions.NV_texture_rectangle != GL_FALSE);
276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
279770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionSequence: optionSequence option
280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|
281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickoption: OPTION IDENTIFIER ';'
284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   int valid = 0;
286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      valid = _mesa_ARBvp_parse_option(state, $2);
289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if (state->mode == ARB_fragment) {
290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      valid = _mesa_ARBfp_parse_option(state, $2);
291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!valid) {
29541d5696628a5eef62cd671711b33edea9344977dIan Romanick	      const char *const err_str = (state->mode == ARB_vertex)
29641d5696628a5eef62cd671711b33edea9344977dIan Romanick		 ? "invalid ARB vertex program option"
29741d5696628a5eef62cd671711b33edea9344977dIan Romanick		 : "invalid ARB fragment program option";
29841d5696628a5eef62cd671711b33edea9344977dIan Romanick
29941d5696628a5eef62cd671711b33edea9344977dIan Romanick	      yyerror(& @2, state, err_str);
300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
305770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatementSequence: statementSequence statement
306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|
307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatement: instruction ';'
310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1 != NULL) {
312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (state->inst_tail == NULL) {
313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 state->inst_head = $1;
314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      } else {
315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 state->inst_tail->next = $1;
316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      state->inst_tail = $1;
319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $1->next = NULL;
320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      state->prog->NumInstructions++;
322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| namingStatement ';'
325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinstruction: ALU_instruction
3280db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	{
3290db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   $$ = $1;
3300db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   state->prog->NumAluInstructions++;
3310db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	}
332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TexInstruction
3330db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	{
3340db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   $$ = $1;
3350db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   state->prog->NumTexInstructions++;
3360db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	}
337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
339770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALU_instruction: ARL_instruction
340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| VECTORop_instruction
341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SCALARop_instruction
342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BINSCop_instruction
343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BINop_instruction
344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TRIop_instruction
345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SWZ_instruction
346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
348770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTexInstruction: SAMPLE_instruction
349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| KIL_instruction
3508ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	| TXD_instruction
351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
353770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickARL_instruction: ARL maskedAddrReg ',' scalarSrcReg
354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor(OPCODE_ARL, & $2, & $4, NULL, NULL);
356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
359770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickVECTORop_instruction: VECTOR_OP maskedDstReg ',' swizzleSrcReg
360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL);
362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$->Base.SaturateMode = $1.SaturateMode;
363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
366770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSCALARop_instruction: SCALAR_OP maskedDstReg ',' scalarSrcReg
367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL);
369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$->Base.SaturateMode = $1.SaturateMode;
370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
373770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINSCop_instruction: BINSC_OP maskedDstReg ',' scalarSrcReg ',' scalarSrcReg
374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, NULL);
376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$->Base.SaturateMode = $1.SaturateMode;
377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
381770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINop_instruction: BIN_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg
382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, NULL);
384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$->Base.SaturateMode = $1.SaturateMode;
385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
388770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTRIop_instruction: TRI_OP maskedDstReg ','
389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                   swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg
390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, & $8);
392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$->Base.SaturateMode = $1.SaturateMode;
393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
396770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget
397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL);
399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($$ != NULL) {
4001edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      const GLbitfield tex_mask = (1U << $6);
4011edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      GLbitfield shadow_tex = 0;
4021edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      GLbitfield target_mask = 0;
4031edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4041edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$->Base.SaturateMode = $1.SaturateMode;
406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$->Base.TexSrcUnit = $6;
4070db5ef074169589bc4d665094147aa284a5496d7Ian Romanick
4081edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      if ($8 < 0) {
4091edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 shadow_tex = tex_mask;
4101edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4111edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 $$->Base.TexSrcTarget = -$8;
4121edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 $$->Base.TexShadow = 1;
4131edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      } else {
4141edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 $$->Base.TexSrcTarget = $8;
4151edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      }
4161edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4171edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      target_mask = (1U << $$->Base.TexSrcTarget);
4181edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4191edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      /* If this texture unit was previously accessed and that access
4201edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       * had a different texture target, generate an error.
4211edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       *
4221edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       * If this texture unit was previously accessed and that access
4231edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       * had a different shadow mode, generate an error.
4241edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       */
4251edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      if ((state->prog->TexturesUsed[$6] != 0)
4261edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		  && ((state->prog->TexturesUsed[$6] != target_mask)
4271edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		      || ((state->prog->ShadowSamplers & tex_mask)
4281edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick			  != shadow_tex))) {
4291edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 yyerror(& @8, state,
4301edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick			 "multiple targets used on one texture image unit");
4311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 YYERROR;
4321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      }
4331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4341edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4351edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      state->prog->TexturesUsed[$6] |= target_mask;
4361edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      state->prog->ShadowSamplers |= shadow_tex;
437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
441770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickKIL_instruction: KIL swizzleSrcReg
442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL);
4440db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   state->fragment.UsesKill = 1;
445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
4488ca6fd8a83412e3a76746f0ee61027b796516f95Ian RomanickTXD_instruction: TXD_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget
4498ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	{
4508ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, & $8);
4518ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	   if ($$ != NULL) {
4528ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      const GLbitfield tex_mask = (1U << $10);
4538ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      GLbitfield shadow_tex = 0;
4548ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      GLbitfield target_mask = 0;
4558ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4568ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4578ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      $$->Base.SaturateMode = $1.SaturateMode;
4588ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      $$->Base.TexSrcUnit = $10;
4598ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4608ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      if ($12 < 0) {
4618ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 shadow_tex = tex_mask;
4628ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4638ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 $$->Base.TexSrcTarget = -$12;
4648ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 $$->Base.TexShadow = 1;
4658ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      } else {
4668ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 $$->Base.TexSrcTarget = $12;
4678ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      }
4688ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4698ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      target_mask = (1U << $$->Base.TexSrcTarget);
4708ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4718ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      /* If this texture unit was previously accessed and that access
4728ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       * had a different texture target, generate an error.
4738ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       *
4748ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       * If this texture unit was previously accessed and that access
4758ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       * had a different shadow mode, generate an error.
4768ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       */
4778ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      if ((state->prog->TexturesUsed[$10] != 0)
4788ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		  && ((state->prog->TexturesUsed[$10] != target_mask)
4798ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		      || ((state->prog->ShadowSamplers & tex_mask)
4808ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick			  != shadow_tex))) {
4818ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 yyerror(& @12, state,
4828ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick			 "multiple targets used on one texture image unit");
4838ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 YYERROR;
4848ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      }
4858ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4868ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4878ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      state->prog->TexturesUsed[$10] |= target_mask;
4888ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      state->prog->ShadowSamplers |= shadow_tex;
4898ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	   }
4908ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	}
4918ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	;
4928ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
493770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnit: TEXTURE_UNIT optTexImageUnitNum
494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
499770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexTarget: TEX_1D  { $$ = TEXTURE_1D_INDEX; }
500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_2D   { $$ = TEXTURE_2D_INDEX; }
501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_3D   { $$ = TEXTURE_3D_INDEX; }
502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; }
503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_RECT { $$ = TEXTURE_RECT_INDEX; }
5041edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	| TEX_SHADOW1D   { $$ = -TEXTURE_1D_INDEX; }
5051edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	| TEX_SHADOW2D   { $$ = -TEXTURE_2D_INDEX; }
5061edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	| TEX_SHADOWRECT { $$ = -TEXTURE_RECT_INDEX; }
507aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAY1D         { $$ = TEXTURE_1D_ARRAY_INDEX; }
508aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAY2D         { $$ = TEXTURE_2D_ARRAY_INDEX; }
509aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAYSHADOW1D   { $$ = -TEXTURE_1D_ARRAY_INDEX; }
510aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAYSHADOW2D   { $$ = -TEXTURE_2D_ARRAY_INDEX; }
511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
513770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle
514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* FIXME: Is this correct?  Should the extenedSwizzle be applied
516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * FIXME: to the existing swizzle?
517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $4.Base.Swizzle = $6.swizzle;
519648dac4251de69d2949026af3dec0b0befee734bIan Romanick	   $4.Base.Negate = $6.mask;
520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor(OPCODE_SWZ, & $2, & $4, NULL, NULL);
522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$->Base.SaturateMode = $1.SaturateMode;
523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
526770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickscalarSrcReg: optionalSign srcReg scalarSuffix
527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1) {
531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Negate = ~$$.Base.Negate;
532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle,
535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick						    $3.swizzle);
536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
539770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSrcReg: optionalSign srcReg swizzleSuffix
540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1) {
544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Negate = ~$$.Base.Negate;
545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle,
548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick						    $3.swizzle);
549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
552770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedDstReg: dstReg optionalMask
553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.WriteMask = $2.mask;
556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($$.File == PROGRAM_OUTPUT) {
558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      /* Technically speaking, this should check that it is in
559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       * vertex program mode.  However, PositionInvariant can never be
560770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       * set in fragment program mode, so it is somewhat irrelevant.
561770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       */
562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (state->option.PositionInvariant
563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       && ($$.Index == VERT_RESULT_HPOS)) {
564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 yyerror(& @1, state, "position-invariant programs cannot "
565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			 "write position");
566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 YYERROR;
567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      state->prog->OutputsWritten |= (1U << $$.Index);
570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
574770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedAddrReg: addrReg addrWriteMask
575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_dst_reg(& $$);
577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.File = PROGRAM_ADDRESS;
578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Index = 0;
579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.WriteMask = $2.mask;
580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
583770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextendedSwizzle: extSwizComp ',' extSwizComp ',' extSwizComp ',' extSwizComp
584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
585565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   const unsigned xyzw_valid =
586565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      ($1.xyzw_valid << 0)
587565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($3.xyzw_valid << 1)
588565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($5.xyzw_valid << 2)
589565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($7.xyzw_valid << 3);
590565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   const unsigned rgba_valid =
591565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      ($1.rgba_valid << 0)
592565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($3.rgba_valid << 1)
593565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($5.rgba_valid << 2)
594565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($7.rgba_valid << 3);
595565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
596565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   /* All of the swizzle components have to be valid in either RGBA
597565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * or XYZW.  Note that 0 and 1 are valid in both, so both masks
598565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * can have some bits set.
599565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    *
600565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * We somewhat deviate from the spec here.  It would be really hard
601565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * to figure out which component is the error, and there probably
602565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * isn't a lot of benefit.
603565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    */
604565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   if ((rgba_valid != 0x0f) && (xyzw_valid != 0x0f)) {
605565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      yyerror(& @1, state, "cannot combine RGBA and XYZW swizzle "
606565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick		      "components");
607565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      YYERROR;
608565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   }
609565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
610565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.swizzle = MAKE_SWIZZLE4($1.swz, $3.swz, $5.swz, $7.swz);
611565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.mask = ($1.negate) | ($3.negate << 1) | ($5.negate << 2)
612565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($7.negate << 3);
613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
616770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizComp: optionalSign extSwizSel
617770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
618565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$ = $2;
619565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.negate = ($1) ? 1 : 0;
620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
623770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizSel: INTEGER
624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (($1 != 0) && ($1 != 1)) {
626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid extended swizzle selector");
627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
630565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.swz = ($1 == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE;
631565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
632565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   /* 0 and 1 are valid for both RGBA swizzle names and XYZW
633565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * swizzle names.
634565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    */
635565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.xyzw_valid = 1;
636565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.rgba_valid = 1;
637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| IDENTIFIER
639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
640770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (strlen($1) > 1) {
641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid extended swizzle selector");
642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   switch ($1[0]) {
646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'x':
647565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_X;
648565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'y':
651565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Y;
652565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'z':
655565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Z;
656565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'w':
659565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_W;
660565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
661565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
662565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
663565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'r':
664565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_X;
665565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
666565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
667565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'g':
668565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Y;
669565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
670770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
671565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'b':
672565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Z;
673565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
674565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
675565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'a':
676565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_W;
677565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
678565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
679565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
680770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   default:
681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid extended swizzle selector");
682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
683770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
688770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicksrcReg: IDENTIFIER /* temporaryReg | progParamSingle */
689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
691770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
692770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
693770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type != at_param) && (s->type != at_temp)
697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      && (s->type != at_attrib)) {
698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type == at_param) && s->param_is_array) {
701770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "non-array access to array PARAM");
702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   switch (s->type) {
707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case at_temp:
708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.File = PROGRAM_TEMPORARY;
709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Index = s->temp_binding;
710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case at_param:
712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.File = s->param_binding_type;
713770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Index = s->param_binding_begin;
714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
715770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case at_attrib:
7168a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      $$.Base.File = PROGRAM_INPUT;
7178a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      $$.Base.Index = s->attrib_binding;
7188a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      state->prog->InputsRead |= (1U << $$.Base.Index);
7198a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick
7208a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      if (!validate_inputs(& @1, state)) {
7218a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick		 YYERROR;
7228a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      }
7238a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      break;
724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   default:
726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| attribBinding
731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.File = PROGRAM_INPUT;
734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Index = $1;
735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   state->prog->InputsRead |= (1U << $$.Base.Index);
736770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!validate_inputs(& @1, state)) {
738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| progParamArray '[' progParamArrayMem ']'
742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (! $3.Base.RelAddr
744ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	       && ((unsigned) $3.Base.Index >= $1->param_binding_length)) {
745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @3, state, "out of bounds array access");
746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
747770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.File = $1->param_binding_type;
751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($3.Base.RelAddr) {
753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $1->param_accessed_indirectly = 1;
754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.RelAddr = 1;
756770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Index = $3.Base.Index;
757770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Symbol = $1;
758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
759770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Index = $1->param_binding_begin + $3.Base.Index;
760770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramSingleItemUse
763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
764770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
76569d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick	   $$.Base.File = ($1.name != NULL)
76669d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick	      ? $1.param_binding_type
76769d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick	      : PROGRAM_CONSTANT;
768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Index = $1.param_binding_begin;
769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
772770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickdstReg: resultBinding
773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_dst_reg(& $$);
775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.File = PROGRAM_OUTPUT;
776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Index = $1;
777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| IDENTIFIER /* temporaryReg | vertexResultReg */
779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type != at_output) && (s->type != at_temp)) {
787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_dst_reg(& $$);
79286b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   switch (s->type) {
79386b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   case at_temp:
794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.File = PROGRAM_TEMPORARY;
795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Index = s->temp_binding;
79686b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      break;
79786b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   case at_output:
79886b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      $$.File = PROGRAM_OUTPUT;
79986b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      $$.Index = s->output_binding;
80086b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      break;
80186b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   default:
802770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.File = s->param_binding_type;
803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Index = s->param_binding_begin;
80486b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      break;
805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
809770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArray: IDENTIFIER
810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type != at_param) || !s->param_is_array) {
818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "array access to non-PARAM variable");
819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
821770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = s;
822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
826770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayMem: progParamArrayAbs | progParamArrayRel;
827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
828770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayAbs: INTEGER
829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
831770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Index = $1;
832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
835770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayRel: addrReg addrComponent addrRegRelOffset
836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* FINISHME: Add support for multiple address registers.
838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* FINISHME: Add support for 4-component address registers.
840770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.RelAddr = 1;
843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Index = $3;
844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
847770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegRelOffset:              { $$ = 0; }
848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '+' addrRegPosOffset { $$ = $2; }
849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '-' addrRegNegOffset { $$ = -$2; }
850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
852770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegPosOffset: INTEGER
853770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
854770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (($1 < 0) || ($1 > 63)) {
855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state,
856770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "relative address offset too large (positive)");
857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
860770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
862770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
864770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegNegOffset: INTEGER
865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (($1 < 0) || ($1 > 64)) {
867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state,
868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "relative address offset too large (negative)");
869770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
870770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
876770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrReg: IDENTIFIER
877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
879770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
880770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid array member");
883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
884770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if (s->type != at_address) {
885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state,
886770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "invalid variable for indexed array access");
887770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
888770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = s;
890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
894770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrComponent: MASK1
895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1.mask != WRITEMASK_X) {
897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid address component selector");
898770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
905770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrWriteMask: MASK1
906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1.mask != WRITEMASK_X) {
908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state,
909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "address register write mask must be \".x\"");
910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
914770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
917770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickscalarSuffix: MASK1;
918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
919770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSuffix: MASK1
920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MASK4
921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SWIZZLE
922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|              { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; }
923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
925770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalMask: MASK4 | MASK3 | MASK2 | MASK1
926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|              { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; }
927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
929770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicknamingStatement: ATTRIB_statement
930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PARAM_statement
931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEMP_statement
932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ADDRESS_statement
933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| OUTPUT_statement
934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ALIAS_statement
935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
937770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickATTRIB_statement: ATTRIB IDENTIFIER '=' attribBinding
938770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s =
940770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      declare_variable(state, $2, at_attrib, & @2);
941770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
942770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
943770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
944770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->attrib_binding = $4;
946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      state->InputsBound |= (1U << s->attrib_binding);
947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (!validate_inputs(& @4, state)) {
949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 YYERROR;
950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
952770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
954770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
955770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickattribBinding: VERTEX vtxAttribItem
956770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
957770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
958770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FRAGMENT fragAttribItem
960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
965770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribItem: POSITION
966770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_POS;
968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| WEIGHT vtxOptWeightNum
970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
971770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_WEIGHT;
972770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| NORMAL
974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_NORMAL;
976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| COLOR optColorType
978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
979054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   if (!state->ctx->Extensions.EXT_secondary_color) {
980054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      yyerror(& @2, state, "GL_EXT_secondary_color not supported");
981054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      YYERROR;
982054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   }
983054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick
984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_COLOR0 + $2;
985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FOGCOORD
987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
988054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   if (!state->ctx->Extensions.EXT_fog_coord) {
989054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      yyerror(& @1, state, "GL_EXT_fog_coord not supported");
990054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      YYERROR;
991054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   }
992054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick
993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_FOG;
994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXCOORD optTexCoordUnitNum
996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_TEX0 + $2;
998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MATRIXINDEX '[' vtxWeightNum ']'
1000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1001054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   yyerror(& @1, state, "GL_ARB_matrix_palette not supported");
1002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   YYERROR;
1003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| VTXATTRIB '[' vtxAttribNum ']'
1005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_GENERIC0 + $3;
1007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1010770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribNum: INTEGER
1011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1012ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->limits->MaxAttribs) {
1013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid vertex attribute reference");
1014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1021770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxOptWeightNum:  | '[' vtxWeightNum ']';
1022770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxWeightNum: INTEGER;
1023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1024770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickfragAttribItem: POSITION
1025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_WPOS;
1027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| COLOR optColorType
1029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_COL0 + $2;
1031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FOGCOORD
1033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_FOGC;
1035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXCOORD optTexCoordUnitNum
1037770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1038770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_TEX0 + $2;
1039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1040770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1042770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_statement: PARAM_singleStmt | PARAM_multipleStmt;
1043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1044770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_singleStmt: PARAM IDENTIFIER paramSingleInit
1045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1046770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s =
1047770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      declare_variable(state, $2, at_param, & @2);
1048770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1049770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
1050770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_binding_type = $3.param_binding_type;
1053770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_binding_begin = $3.param_binding_begin;
1054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_binding_length = $3.param_binding_length;
1055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_is_array = 0;
1056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1059770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1060770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_multipleStmt: PARAM IDENTIFIER '[' optArraySize ']' paramMultipleInit
1061770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1062ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if (($4 != 0) && ((unsigned) $4 != $6.param_binding_length)) {
1063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @4, state,
1064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "parameter array size and number of bindings must match");
1065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1067770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      struct asm_symbol *const s =
1068770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 declare_variable(state, $2, $6.type, & @2);
1069770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1070770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (s == NULL) {
1071770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 YYERROR;
1072770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      } else {
1073770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_binding_type = $6.param_binding_type;
1074770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_binding_begin = $6.param_binding_begin;
1075770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_binding_length = $6.param_binding_length;
1076770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_is_array = 1;
1077770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
1078770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1079770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1080770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1081770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1082770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptArraySize:
1083770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1084770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
1085770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1086770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| INTEGER
1087770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        {
1088ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if (($1 < 1) || ((unsigned) $1 >= state->limits->MaxParameters)) {
1089770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid parameter array size");
1090770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1091770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1092770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
1093770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1094770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1095770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1096770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1097770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleInit: '=' paramSingleItemDecl
1098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
1100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1103770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleInit: '=' '{' paramMultInitList '}'
1104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $3;
1106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1109770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultInitList: paramMultipleItem
1110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramMultInitList ',' paramMultipleItem
1111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $1.param_binding_length += $3.param_binding_length;
1113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1117770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemDecl: stateSingleItem
1118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_state(state->prog, & $$, $1);
1122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| programSingleItem
1124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_param(state->prog, & $$, $1);
1128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramConstDecl
1130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_const(state->prog, & $$, & $1);
1134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1137770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemUse: stateSingleItem
1138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_state(state->prog, & $$, $1);
1142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| programSingleItem
1144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_param(state->prog, & $$, $1);
1148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramConstUse
1150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_const(state->prog, & $$, & $1);
1154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1157770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleItem: stateMultipleItem
1158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_state(state->prog, & $$, $1);
1162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| programMultipleItem
1164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_param(state->prog, & $$, $1);
1168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramConstDecl
1170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_const(state->prog, & $$, & $1);
1174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1177770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMultipleItem: stateSingleItem        { memcpy($$, $1, sizeof($$)); }
1178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateMatrixRows           { memcpy($$, $2, sizeof($$)); }
1179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1181770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSingleItem: STATE stateMaterialItem  { memcpy($$, $2, sizeof($$)); }
1182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateLightItem            { memcpy($$, $2, sizeof($$)); }
1183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateLightModelItem       { memcpy($$, $2, sizeof($$)); }
1184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateLightProdItem        { memcpy($$, $2, sizeof($$)); }
1185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateTexGenItem           { memcpy($$, $2, sizeof($$)); }
1186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateTexEnvItem           { memcpy($$, $2, sizeof($$)); }
1187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateFogItem              { memcpy($$, $2, sizeof($$)); }
1188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateClipPlaneItem        { memcpy($$, $2, sizeof($$)); }
1189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE statePointItem            { memcpy($$, $2, sizeof($$)); }
1190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateMatrixRow            { memcpy($$, $2, sizeof($$)); }
1191333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	| STATE stateDepthItem            { memcpy($$, $2, sizeof($$)); }
1192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1194770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMaterialItem: MATERIAL optFaceType stateMatProperty
1195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_MATERIAL;
1198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3;
1200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1203770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatProperty: ambDiffSpecProperty
1204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| EMISSION
1208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_EMISSION;
1210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SHININESS
1212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_SHININESS;
1214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1217770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightItem: LIGHT '[' stateLightNumber ']' stateLightProperty
1218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHT;
1221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $5;
1223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1226770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProperty: ambDiffSpecProperty
1227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| POSITION
1231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_POSITION;
1233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ATTENUATION
1235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1236054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   if (!state->ctx->Extensions.EXT_point_parameters) {
1237054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      yyerror(& @1, state, "GL_ARB_point_parameters not supported");
1238054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      YYERROR;
1239054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   }
1240054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick
1241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_ATTENUATION;
1242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SPOT stateSpotProperty
1244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
1246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| HALF
1248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_HALF_VECTOR;
1250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1253770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSpotProperty: DIRECTION
1254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_SPOT_DIRECTION;
1256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1259770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightModelItem: LIGHTMODEL stateLModProperty
1260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2[0];
1262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2[1];
1263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1266770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLModProperty: AMBIENT
1267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHTMODEL_AMBIENT;
1270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| optFaceType SCENECOLOR
1272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHTMODEL_SCENECOLOR;
1275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1;
1276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1279770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProdItem: LIGHTPROD '[' stateLightNumber ']' optFaceType stateLProdProperty
1280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHTPROD;
1283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $5;
1285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $6;
1286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1289770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLProdProperty: ambDiffSpecProperty;
1290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1291770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvItem: TEXENV optLegacyTexUnitNum stateTexEnvProperty
1292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $3;
1295770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1299770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvProperty: COLOR
1300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXENV_COLOR;
1302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1305770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickambDiffSpecProperty: AMBIENT
1306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_AMBIENT;
1308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| DIFFUSE
1310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_DIFFUSE;
1312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SPECULAR
1314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_SPECULAR;
1316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1319770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightNumber: INTEGER
1320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1321ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxLights) {
1322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid light selector");
1323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1330770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenItem: TEXGEN optTexCoordUnitNum stateTexGenType stateTexGenCoord
1331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_TEXGEN;
1334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3 + $4;
1336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1339770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenType: EYE
1340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_S;
1342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| OBJECT
1344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_OBJECT_S;
1346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1348770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenCoord: TEXGEN_S
1349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S;
1351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXGEN_T
1353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S;
1355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXGEN_R
1357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S;
1359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXGEN_Q
1361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S;
1363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1366770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogItem: FOG stateFogProperty
1367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2;
1370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1373770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogProperty: COLOR
1374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_FOG_COLOR;
1376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PARAMS
1378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_FOG_PARAMS;
1380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1383770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneItem: CLIP '[' stateClipPlaneNum ']' PLANE
1384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_CLIPPLANE;
1387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1391770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneNum: INTEGER
1392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1393ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxClipPlanes) {
1394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid clip plane selector");
1395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1402770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePointItem: POINT statePointProperty
1403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2;
1406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1409770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePointProperty: SIZE
1410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_POINT_SIZE;
1412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ATTENUATION
1414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_POINT_ATTENUATION;
1416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1419770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']'
1420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1[0];
1422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1[1];
1423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4;
1424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4;
1425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[4] = $1[2];
1426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1429770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRows: stateMatrixItem optMatrixRows
1430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1431770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1[0];
1432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1[1];
1433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $2[2];
1434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $2[3];
1435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[4] = $1[2];
1436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1439770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptMatrixRows:
1440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = 0;
1442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = 3;
1443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ROW '[' stateMatrixRowNum DOT_DOT stateMatrixRowNum ']'
1445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* It seems logical that the matrix row range specifier would have
1447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * to specify a range or more than one row (i.e., $5 > $3).
1448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * However, the ARB_vertex_program spec says "a program will fail
1449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * to load if <a> is greater than <b>."  This means that $3 == $5
1450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * is valid.
1451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
1452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($3 > $5) {
1453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @3, state, "invalid matrix row range");
1454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3;
1458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $5;
1459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1462770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixItem: MATRIX stateMatrixName stateOptMatModifier
1463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2[0];
1465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2[1];
1466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3;
1467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1470770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptMatModifier:
1471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
1473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| stateMatModifier
1475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1480770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatModifier: INVERSE
1481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_MATRIX_INVERSE;
1483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TRANSPOSE
1485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_MATRIX_TRANSPOSE;
1487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| INVTRANS
1489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_MATRIX_INVTRANS;
1491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1494770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRowNum: INTEGER
1495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1 > 3) {
1497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid matrix row reference");
1498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1505770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixName: MODELVIEW stateOptModMatNum
1506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_MODELVIEW_MATRIX;
1508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PROJECTION
1511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_PROJECTION_MATRIX;
1513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = 0;
1514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MVP
1516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_MVP_MATRIX;
1518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = 0;
1519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXTURE optTexCoordUnitNum
1521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_TEXTURE_MATRIX;
1523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PALETTE '[' statePaletteMatNum ']'
1526770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1527054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   yyerror(& @1, state, "GL_ARB_matrix_palette not supported");
1528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   YYERROR;
1529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MAT_PROGRAM '[' stateProgramMatNum ']'
1531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_PROGRAM_MATRIX;
1533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1537770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptModMatNum:
1538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
1540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| stateModMatNum
1542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1546770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateModMatNum: INTEGER
1547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix
1549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * zero is valid.
1550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
1551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1 != 0) {
1552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid modelview matrix index");
1553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1559770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePaletteMatNum: INTEGER
1560770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1561770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* Since GL_ARB_matrix_palette isn't supported, just let any value
1562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * through here.  The error will be generated later.
1563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
1564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1567770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateProgramMatNum: INTEGER
1568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1569ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxProgramMatrices) {
1570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program matrix selector");
1571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1578333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian RomanickstateDepthItem: DEPTH RANGE
1579333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	{
1580333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	   memset($$, 0, sizeof($$));
1581333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	   $$[0] = STATE_DEPTH_RANGE;
1582333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	}
1583333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	;
1584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1586770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramSingleItem: progEnvParam | progLocalParam;
1587770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1588770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramMultipleItem: progEnvParams | progLocalParams;
1589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1590770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParams: PROGRAM ENV '[' progEnvParamNums ']'
1591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_ENV;
1595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4[0];
1596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4[1];
1597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1598770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1599770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1600770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNums: progEnvParamNum
1601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1;
1604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| progEnvParamNum DOT_DOT progEnvParamNum
1606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1612770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParam: PROGRAM ENV '[' progEnvParamNum ']'
1613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_ENV;
1617770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4;
1618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4;
1619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1622770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']'
1623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_LOCAL;
1627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4[0];
1628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4[1];
1629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1631770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNums: progLocalParamNum
1632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1;
1635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| progLocalParamNum DOT_DOT progLocalParamNum
1637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1640770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1643770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']'
1644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_LOCAL;
1648770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4;
1649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4;
1650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1653770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNum: INTEGER
1654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1655ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->limits->MaxEnvParams) {
1656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid environment parameter reference");
1657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1661770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1663770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNum: INTEGER
1664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1665ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->limits->MaxLocalParams) {
1666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid local parameter reference");
1667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1668770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1669770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1670770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1672770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1673770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1674770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1675770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstDecl: paramConstScalarDecl | paramConstVector;
1676770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstUse: paramConstScalarUse | paramConstVector;
1677770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1678770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarDecl: signedFloatConstant
1679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1680600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[0] = $1;
1682600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.data[1] = $1;
1683600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.data[2] = $1;
1684600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.data[3] = $1;
1685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1688770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarUse: REAL
1689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1690ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.count = 1;
1691770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[0] = $1;
1692ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.data[1] = $1;
1693ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.data[2] = $1;
1694ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.data[3] = $1;
1695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| INTEGER
1697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1698ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.count = 1;
1699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[0] = (float) $1;
1700ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.data[1] = (float) $1;
1701ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.data[2] = (float) $1;
1702ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.data[3] = (float) $1;
1703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1706770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstVector: '{' signedFloatConstant '}'
1707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1708600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[0] = $2;
1710f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick	   $$.data[1] = 0.0f;
1711f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick	   $$.data[2] = 0.0f;
1712600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.data[3] = 1.0f;
1713770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '{' signedFloatConstant ',' signedFloatConstant '}'
1715770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1716600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1717770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[0] = $2;
1718770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[1] = $4;
1719f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick	   $$.data[2] = 0.0f;
1720600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.data[3] = 1.0f;
1721770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '{' signedFloatConstant ',' signedFloatConstant ','
1723770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick              signedFloatConstant '}'
1724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1725600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[0] = $2;
1727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[1] = $4;
1728f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick	   $$.data[2] = $6;
1729600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.data[3] = 1.0f;
1730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '{' signedFloatConstant ',' signedFloatConstant ','
1732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick              signedFloatConstant ',' signedFloatConstant '}'
1733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.count = 4;
1735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[0] = $2;
1736770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.data[1] = $4;
1737f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick	   $$.data[2] = $6;
1738f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick	   $$.data[3] = $8;
1739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1742770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicksignedFloatConstant: optionalSign REAL
1743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1744770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = ($1) ? -$2 : $2;
1745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| optionalSign INTEGER
1747770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = (float)(($1) ? -$2 : $2);
1749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1752770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalSign: '+'        { $$ = FALSE; }
1753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '-'            { $$ = TRUE;  }
1754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|                { $$ = FALSE; }
1755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1756770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1757770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTEMP_statement: TEMP { $<integer>$ = $1; } varNameList
1758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1759770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1760770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickADDRESS_statement: ADDRESS { $<integer>$ = $1; } varNameList
1761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1763770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvarNameList: varNameList ',' IDENTIFIER
1764770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!declare_variable(state, $3, $<integer>0, & @3)) {
1766770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| IDENTIFIER
1770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!declare_variable(state, $1, $<integer>0, & @1)) {
1772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1777770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickOUTPUT_statement: OUTPUT IDENTIFIER '=' resultBinding
1778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s =
1780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      declare_variable(state, $2, at_output, & @2);
1781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
1783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->output_binding = $4;
1786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1790770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultBinding: RESULT POSITION
1791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_HPOS;
1794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
1796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT FOGCOORD
1800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1802770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_FOGC;
1803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
1805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT resultColBinding
1809770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
1811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT POINTSIZE
1813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_PSIZ;
1816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
1818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1821770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT TEXCOORD optTexCoordUnitNum
1822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_TEX0 + $3;
1825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
1827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT DEPTH
1831770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_fragment) {
1833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = FRAG_RESULT_DEPTH;
1834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
1836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1840770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1841770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultColBinding: COLOR optResultFaceType optResultColorType
1842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2 + $3;
1844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1847770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultFaceType:
1848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = (state->mode == ARB_vertex)
1850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      ? VERT_RESULT_COL0
1851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      : FRAG_RESULT_COLOR;
1852770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1853770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FRONT
1854770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1856770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_COL0;
1857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
1859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1860770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1862770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BACK
1863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_BFC0;
1866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
1868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1869770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1870770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1873770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultColorType:
1874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
1876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PRIMARY
1878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1879770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1880770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = 0;
1881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
1883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1884770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1886770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SECONDARY
1887770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1888770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
1889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = 1;
1890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
1892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1897770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptFaceType:    { $$ = 0; }
1898770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FRONT	{ $$ = 0; }
1899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BACK  { $$ = 1; }
1900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1902770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptColorType:       { $$ = 0; }
1903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PRIMARY   { $$ = 0; }
1904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SECONDARY { $$ = 1; }
1905770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1907770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexCoordUnitNum:                { $$ = 0; }
1908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '[' texCoordUnitNum ']'  { $$ = $2; }
1909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1911770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexImageUnitNum:                { $$ = 0; }
1912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '[' texImageUnitNum ']'  { $$ = $2; }
1913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1914770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1915770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptLegacyTexUnitNum:               { $$ = 0; }
1916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '[' legacyTexUnitNum ']' { $$ = $2; }
1917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1919770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexCoordUnitNum: INTEGER
1920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1921ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxTextureCoordUnits) {
1922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid texture coordinate unit selector");
1923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1930770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnitNum: INTEGER
1931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1932ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxTextureImageUnits) {
1933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid texture image unit selector");
1934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1937770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1938770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1940770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1941770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicklegacyTexUnitNum: INTEGER
1942770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1943ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxTextureUnits) {
1944770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid texture unit selector");
1945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1952770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALIAS_statement: ALIAS IDENTIFIER '=' IDENTIFIER
1953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1954770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *exist = (struct asm_symbol *)
1955770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $2);
1956770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *target = (struct asm_symbol *)
1957770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $4);
1958770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (exist != NULL) {
1961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "redeclared identifier");
1962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if (target == NULL) {
1964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @4, state,
1965770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "undefined variable binding in ALIAS statement");
1966770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_add_symbol(state->st, 0, $2, target);
1969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1971770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1972770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%%
1974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_instruction *
1976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickasm_instruction_ctor(gl_inst_opcode op,
1977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct prog_dst_register *dst,
1978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct asm_src_register *src0,
1979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct asm_src_register *src1,
1980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct asm_src_register *src2)
1981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_instruction *inst = calloc(1, sizeof(struct asm_instruction));
1983770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (inst) {
1985ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick      _mesa_init_instructions(& inst->Base, 1);
1986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      inst->Base.Opcode = op;
198717534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick
198817534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick      /* In the core ARB extensions only the KIL instruction doesn't have a
198917534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick       * destination register.
199017534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick       */
199117534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick      if (dst == NULL) {
199217534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick	 init_dst_reg(& inst->Base.DstReg);
199317534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick      } else {
199417534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick	 inst->Base.DstReg = *dst;
199517534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick      }
1996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      inst->Base.SrcReg[0] = src0->Base;
1998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      inst->SrcReg[0] = *src0;
1999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (src1 != NULL) {
2001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 inst->Base.SrcReg[1] = src1->Base;
2002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 inst->SrcReg[1] = *src1;
2003aec429170681567414de70814f69244758323e75Ian Romanick      } else {
2004aec429170681567414de70814f69244758323e75Ian Romanick	 init_src_reg(& inst->SrcReg[1]);
2005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (src2 != NULL) {
2008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 inst->Base.SrcReg[2] = src2->Base;
2009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 inst->SrcReg[2] = *src2;
2010aec429170681567414de70814f69244758323e75Ian Romanick      } else {
2011aec429170681567414de70814f69244758323e75Ian Romanick	 init_src_reg(& inst->SrcReg[2]);
2012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return inst;
2016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
2020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_dst_reg(struct prog_dst_register *r)
2021770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memset(r, 0, sizeof(*r));
2023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->File = PROGRAM_UNDEFINED;
2024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->WriteMask = WRITEMASK_XYZW;
2025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->CondMask = COND_TR;
2026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->CondSwizzle = SWIZZLE_NOOP;
2027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
2031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_src_reg(struct asm_src_register *r)
2032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memset(r, 0, sizeof(*r));
2034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->Base.File = PROGRAM_UNDEFINED;
2035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->Base.Swizzle = SWIZZLE_NOOP;
2036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->Symbol = NULL;
2037770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2038770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2040770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**
2041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validate the set of inputs used by a program
2042770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
2043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validates that legal sets of inputs are used by the program.  In this case
2044770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * "used" included both reading the input or binding the input to a name using
2045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the \c ATTRIB command.
2046770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
2047770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \return
2048770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise.
2049770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2050770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvalidate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state)
2052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2053770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const int inputs = state->prog->InputsRead | state->InputsBound;
2054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (((inputs & 0x0ffff) & (inputs >> 16)) != 0) {
2056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yyerror(locp, state, "illegal use of generic attribute and name attribute");
2057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return 0;
2058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2059770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2060770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 1;
2061770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2062770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_symbol *
2065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickdeclare_variable(struct asm_parser_state *state, char *name, enum asm_type t,
2066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 struct YYLTYPE *locp)
2067770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2068770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol *s = NULL;
2069770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol *exist = (struct asm_symbol *)
2070770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_symbol_table_find_symbol(state->st, 0, name);
2071770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2072770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2073770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (exist != NULL) {
2074770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yyerror(locp, state, "redeclared identifier");
2075770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } else {
2076770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      s = calloc(1, sizeof(struct asm_symbol));
2077770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      s->name = name;
2078770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      s->type = t;
2079770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2080770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      switch (t) {
2081770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case at_temp:
2082770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (state->prog->NumTemporaries >= state->limits->MaxTemps) {
2083770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    yyerror(locp, state, "too many temporaries declared");
2084770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    free(s);
2085770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    return NULL;
2086770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
2087770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2088770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 s->temp_binding = state->prog->NumTemporaries;
2089770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state->prog->NumTemporaries++;
2090770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 break;
2091770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2092770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case at_address:
2093770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (state->prog->NumAddressRegs >= state->limits->MaxAddressRegs) {
2094770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    yyerror(locp, state, "too many address registers declared");
2095770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    free(s);
2096770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    return NULL;
2097770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
2098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 /* FINISHME: Add support for multiple address registers.
2100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  */
2101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state->prog->NumAddressRegs++;
2102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 break;
2103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      default:
2105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 break;
2106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_symbol_table_add_symbol(state->st, 0, s->name, s);
210994b45567047fd681666f261f1ad0164049f0491aIan Romanick      s->next = state->sym;
211094b45567047fd681666f261f1ad0164049f0491aIan Romanick      state->sym = s;
2111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return s;
2114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint add_state_reference(struct gl_program_parameter_list *param_list,
2118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			const gl_state_index tokens[STATE_LENGTH])
2119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const GLuint size = 4; /* XXX fix */
2121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   char *name;
2122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLint index;
2123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   name = _mesa_program_state_string(tokens);
2125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name,
2126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               size, GL_NONE,
2127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               NULL, (gl_state_index *) tokens, 0x0);
2128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_list->StateFlags |= _mesa_program_state_flags(tokens);
2129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* free name string here since we duplicated it in add_parameter() */
2131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_free(name);
2132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return index;
2134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_state(struct gl_program *prog,
2139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     struct asm_symbol *param_var,
2140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     const gl_state_index tokens[STATE_LENGTH])
2141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int idx = -1;
2143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gl_state_index state_tokens[STATE_LENGTH];
2144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memcpy(state_tokens, tokens, sizeof(state_tokens));
2147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->type = at_param;
214928b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick   param_var->param_binding_type = PROGRAM_STATE_VAR;
2150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* If we are adding a STATE_MATRIX that has multiple rows, we need to
2152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * unroll it and call add_state_reference() for each row
2153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if ((state_tokens[0] == STATE_MODELVIEW_MATRIX ||
2155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_PROJECTION_MATRIX ||
2156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_MVP_MATRIX ||
2157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_TEXTURE_MATRIX ||
2158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_PROGRAM_MATRIX)
2159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && (state_tokens[2] != state_tokens[3])) {
2160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      int row;
2161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int first_row = state_tokens[2];
2162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int last_row = state_tokens[3];
2163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      for (row = first_row; row <= last_row; row++) {
2165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state_tokens[2] = state_tokens[3] = row;
2166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 idx = add_state_reference(prog->Parameters, state_tokens);
2168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (param_var->param_binding_begin == ~0U)
2169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    param_var->param_binding_begin = idx;
2170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_length++;
2171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      idx = add_state_reference(prog->Parameters, state_tokens);
2175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (param_var->param_binding_begin == ~0U)
2176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_begin = idx;
2177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      param_var->param_binding_length++;
2178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return idx;
2181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_param(struct gl_program *prog,
2186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     struct asm_symbol *param_var,
2187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     const gl_state_index tokens[STATE_LENGTH])
2188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int idx = -1;
2190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gl_state_index state_tokens[STATE_LENGTH];
2191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memcpy(state_tokens, tokens, sizeof(state_tokens));
2194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   assert((state_tokens[0] == STATE_VERTEX_PROGRAM)
2196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  || (state_tokens[0] == STATE_FRAGMENT_PROGRAM));
2197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   assert((state_tokens[1] == STATE_ENV)
2198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  || (state_tokens[1] == STATE_LOCAL));
2199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->type = at_param;
220128b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick   param_var->param_binding_type = (state_tokens[1] == STATE_ENV)
220228b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick     ? PROGRAM_ENV_PARAM : PROGRAM_LOCAL_PARAM;
2203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements,
2205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * we need to unroll it and call add_state_reference() for each row
2206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (state_tokens[2] != state_tokens[3]) {
2208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      int row;
2209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int first_row = state_tokens[2];
2210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int last_row = state_tokens[3];
2211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      for (row = first_row; row <= last_row; row++) {
2213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state_tokens[2] = state_tokens[3] = row;
2214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 idx = add_state_reference(prog->Parameters, state_tokens);
2216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (param_var->param_binding_begin == ~0U)
2217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    param_var->param_binding_begin = idx;
2218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_length++;
2219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      idx = add_state_reference(prog->Parameters, state_tokens);
2223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (param_var->param_binding_begin == ~0U)
2224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_begin = idx;
2225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      param_var->param_binding_length++;
2226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return idx;
2229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_const(struct gl_program *prog,
2234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     struct asm_symbol *param_var,
2235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     const struct asm_vector *vec)
2236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const int idx = _mesa_add_parameter(prog->Parameters, PROGRAM_CONSTANT,
2238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick				       NULL, vec->count, GL_NONE, vec->data,
2239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick				       NULL, 0x0);
2240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->type = at_param;
224228b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick   param_var->param_binding_type = PROGRAM_CONSTANT;
2243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (param_var->param_binding_begin == ~0U)
2245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      param_var->param_binding_begin = idx;
2246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->param_binding_length++;
2247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return idx;
2249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
225244843c753301db0e8f8343745777479465f34cccIan Romanickchar *
225344843c753301db0e8f8343745777479465f34cccIan Romanickmake_error_string(const char *fmt, ...)
225444843c753301db0e8f8343745777479465f34cccIan Romanick{
225544843c753301db0e8f8343745777479465f34cccIan Romanick   int length;
225644843c753301db0e8f8343745777479465f34cccIan Romanick   char *str;
225744843c753301db0e8f8343745777479465f34cccIan Romanick   va_list args;
225844843c753301db0e8f8343745777479465f34cccIan Romanick
225944843c753301db0e8f8343745777479465f34cccIan Romanick   va_start(args, fmt);
226044843c753301db0e8f8343745777479465f34cccIan Romanick
226144843c753301db0e8f8343745777479465f34cccIan Romanick   /* Call vsnprintf once to determine how large the final string is.  Call it
226244843c753301db0e8f8343745777479465f34cccIan Romanick    * again to do the actual formatting.  from the vsnprintf manual page:
226344843c753301db0e8f8343745777479465f34cccIan Romanick    *
226444843c753301db0e8f8343745777479465f34cccIan Romanick    *    Upon successful return, these functions return the number of
226544843c753301db0e8f8343745777479465f34cccIan Romanick    *    characters printed  (not including the trailing '\0' used to end
226644843c753301db0e8f8343745777479465f34cccIan Romanick    *    output to strings).
226744843c753301db0e8f8343745777479465f34cccIan Romanick    */
226844843c753301db0e8f8343745777479465f34cccIan Romanick   length = 1 + vsnprintf(NULL, 0, fmt, args);
226944843c753301db0e8f8343745777479465f34cccIan Romanick
227044843c753301db0e8f8343745777479465f34cccIan Romanick   str = _mesa_malloc(length);
227144843c753301db0e8f8343745777479465f34cccIan Romanick   if (str) {
227244843c753301db0e8f8343745777479465f34cccIan Romanick      vsnprintf(str, length, fmt, args);
227344843c753301db0e8f8343745777479465f34cccIan Romanick   }
227444843c753301db0e8f8343745777479465f34cccIan Romanick
227544843c753301db0e8f8343745777479465f34cccIan Romanick   va_end(args);
227644843c753301db0e8f8343745777479465f34cccIan Romanick
227744843c753301db0e8f8343745777479465f34cccIan Romanick   return str;
227844843c753301db0e8f8343745777479465f34cccIan Romanick}
227944843c753301db0e8f8343745777479465f34cccIan Romanick
228044843c753301db0e8f8343745777479465f34cccIan Romanick
2281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
2282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickyyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s)
2283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
228444843c753301db0e8f8343745777479465f34cccIan Romanick   char *err_str;
228544843c753301db0e8f8343745777479465f34cccIan Romanick
2286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
228744843c753301db0e8f8343745777479465f34cccIan Romanick   err_str = make_error_string("glProgramStringARB(%s)\n", s);
228844843c753301db0e8f8343745777479465f34cccIan Romanick   if (err_str) {
228944843c753301db0e8f8343745777479465f34cccIan Romanick      _mesa_error(state->ctx, GL_INVALID_OPERATION, err_str);
229044843c753301db0e8f8343745777479465f34cccIan Romanick      _mesa_free(err_str);
229144843c753301db0e8f8343745777479465f34cccIan Romanick   }
229244843c753301db0e8f8343745777479465f34cccIan Romanick
229344843c753301db0e8f8343745777479465f34cccIan Romanick   err_str = make_error_string("line %u, char %u: error: %s\n",
229444843c753301db0e8f8343745777479465f34cccIan Romanick			       locp->first_line, locp->first_column, s);
229544843c753301db0e8f8343745777479465f34cccIan Romanick   _mesa_set_program_error(state->ctx, locp->position, err_str);
229644843c753301db0e8f8343745777479465f34cccIan Romanick
229744843c753301db0e8f8343745777479465f34cccIan Romanick   if (err_str) {
229844843c753301db0e8f8343745777479465f34cccIan Romanick      _mesa_free(err_str);
229944843c753301db0e8f8343745777479465f34cccIan Romanick   }
2300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
230244843c753301db0e8f8343745777479465f34cccIan Romanick
2303770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean
2304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_parse_arb_program(GLcontext *ctx, GLenum target, const GLubyte *str,
2305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			GLsizei len, struct asm_parser_state *state)
2306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_instruction *inst;
2308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned i;
2309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLubyte *strz;
231094b45567047fd681666f261f1ad0164049f0491aIan Romanick   GLboolean result = GL_FALSE;
231194b45567047fd681666f261f1ad0164049f0491aIan Romanick   void *temp;
231294b45567047fd681666f261f1ad0164049f0491aIan Romanick   struct asm_symbol *sym;
2313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
231444843c753301db0e8f8343745777479465f34cccIan Romanick   state->ctx = ctx;
2315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->Target = target;
2316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->Parameters = _mesa_new_parameter_list();
2317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Make a copy of the program string and force it to be NUL-terminated.
2319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   strz = (GLubyte *) _mesa_malloc(len + 1);
2321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (strz == NULL) {
2322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
2323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
2324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_memcpy (strz, str, len);
2326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   strz[len] = '\0';
2327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->String = strz;
2329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->st = _mesa_symbol_table_ctor();
2331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
233248183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick   state->limits = (target == GL_VERTEX_PROGRAM_ARB)
233348183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick      ? & ctx->Const.VertexProgram
233448183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick      : & ctx->Const.FragmentProgram;
2335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
23364cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits;
23374cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxTextureCoordUnits = ctx->Const.MaxTextureCoordUnits;
23384cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxTextureUnits = ctx->Const.MaxTextureUnits;
23394cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxClipPlanes = ctx->Const.MaxClipPlanes;
23404cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxLights = ctx->Const.MaxLights;
23414cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxProgramMatrices = ctx->Const.MaxProgramMatrices;
2342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB)
2344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM;
2345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_set_program_error(ctx, -1, NULL);
2347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_program_lexer_ctor(& state->scanner, state, (const char *) str, len);
2349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yyparse(state);
2350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_program_lexer_dtor(state->scanner);
2351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
235344843c753301db0e8f8343745777479465f34cccIan Romanick   if (ctx->Program.ErrorPos != -1) {
235494b45567047fd681666f261f1ad0164049f0491aIan Romanick      goto error;
235544843c753301db0e8f8343745777479465f34cccIan Romanick   }
235644843c753301db0e8f8343745777479465f34cccIan Romanick
2357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (! _mesa_layout_parameters(state)) {
235844843c753301db0e8f8343745777479465f34cccIan Romanick      struct YYLTYPE loc;
235944843c753301db0e8f8343745777479465f34cccIan Romanick
236044843c753301db0e8f8343745777479465f34cccIan Romanick      loc.first_line = 0;
236144843c753301db0e8f8343745777479465f34cccIan Romanick      loc.first_column = 0;
236244843c753301db0e8f8343745777479465f34cccIan Romanick      loc.position = len;
236344843c753301db0e8f8343745777479465f34cccIan Romanick
236444843c753301db0e8f8343745777479465f34cccIan Romanick      yyerror(& loc, state, "invalid PARAM usage");
236594b45567047fd681666f261f1ad0164049f0491aIan Romanick      goto error;
2366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Add one instruction to store the "END" instruction.
2371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->Instructions =
2373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_alloc_instructions(state->prog->NumInstructions + 1);
2374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   inst = state->inst_head;
2375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (i = 0; i < state->prog->NumInstructions; i++) {
2376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      struct asm_instruction *const temp = inst->next;
2377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      state->prog->Instructions[i] = inst->Base;
2379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      inst = temp;
2380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Finally, tag on an OPCODE_END instruction */
2383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   {
2384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const GLuint numInst = state->prog->NumInstructions;
2385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_init_instructions(state->prog->Instructions + numInst, 1);
2386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      state->prog->Instructions[numInst].Opcode = OPCODE_END;
2387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumInstructions++;
2389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2390c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick   state->prog->NumParameters = state->prog->Parameters->NumParameters;
23914c5879ff3185e03b3baf0ed2765e06a951b35e9eIan Romanick   state->prog->NumAttributes = _mesa_bitcount(state->prog->InputsRead);
2392c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick
2393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /*
2394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * Initialize native counts to logical counts.  The device driver may
2395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * change them if program is translated into a hardware program.
2396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeInstructions = state->prog->NumInstructions;
2398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeTemporaries = state->prog->NumTemporaries;
2399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeParameters = state->prog->NumParameters;
2400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeAttributes = state->prog->NumAttributes;
2401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeAddressRegs = state->prog->NumAddressRegs;
2402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
240394b45567047fd681666f261f1ad0164049f0491aIan Romanick   result = GL_TRUE;
240494b45567047fd681666f261f1ad0164049f0491aIan Romanick
240594b45567047fd681666f261f1ad0164049f0491aIan Romanickerror:
240694b45567047fd681666f261f1ad0164049f0491aIan Romanick   for (inst = state->inst_head; inst != NULL; inst = temp) {
240794b45567047fd681666f261f1ad0164049f0491aIan Romanick      temp = inst->next;
240894b45567047fd681666f261f1ad0164049f0491aIan Romanick      _mesa_free(inst);
240994b45567047fd681666f261f1ad0164049f0491aIan Romanick   }
241094b45567047fd681666f261f1ad0164049f0491aIan Romanick
241194b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->inst_head = NULL;
241294b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->inst_tail = NULL;
241394b45567047fd681666f261f1ad0164049f0491aIan Romanick
241494b45567047fd681666f261f1ad0164049f0491aIan Romanick   for (sym = state->sym; sym != NULL; sym = temp) {
241594b45567047fd681666f261f1ad0164049f0491aIan Romanick      temp = sym->next;
241694b45567047fd681666f261f1ad0164049f0491aIan Romanick
241794b45567047fd681666f261f1ad0164049f0491aIan Romanick      _mesa_free((void *) sym->name);
241894b45567047fd681666f261f1ad0164049f0491aIan Romanick      _mesa_free(sym);
241994b45567047fd681666f261f1ad0164049f0491aIan Romanick   }
242094b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->sym = NULL;
242194b45567047fd681666f261f1ad0164049f0491aIan Romanick
242294b45567047fd681666f261f1ad0164049f0491aIan Romanick   _mesa_symbol_table_dtor(state->st);
242394b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->st = NULL;
242494b45567047fd681666f261f1ad0164049f0491aIan Romanick
242594b45567047fd681666f261f1ad0164049f0491aIan Romanick   return result;
2426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2427