1*61046927SAndroid Build Coastguard Worker %{ 2*61046927SAndroid Build Coastguard Worker /* 3*61046927SAndroid Build Coastguard Worker * Copyright © 2009 Intel Corporation 4*61046927SAndroid Build Coastguard Worker * 5*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 6*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 7*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 8*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 10*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 11*61046927SAndroid Build Coastguard Worker * 12*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 13*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 14*61046927SAndroid Build Coastguard Worker * Software. 15*61046927SAndroid Build Coastguard Worker * 16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22*61046927SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE. 23*61046927SAndroid Build Coastguard Worker */ 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker #include <stdarg.h> 26*61046927SAndroid Build Coastguard Worker #include <stdio.h> 27*61046927SAndroid Build Coastguard Worker #include <stdlib.h> 28*61046927SAndroid Build Coastguard Worker #include <string.h> 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker #include "main/errors.h" 31*61046927SAndroid Build Coastguard Worker #include "main/mtypes.h" 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Worker #include "program/program.h" 34*61046927SAndroid Build Coastguard Worker #include "program/prog_parameter.h" 35*61046927SAndroid Build Coastguard Worker #include "program/prog_parameter_layout.h" 36*61046927SAndroid Build Coastguard Worker #include "program/prog_statevars.h" 37*61046927SAndroid Build Coastguard Worker #include "program/prog_instruction.h" 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker #include "program/symbol_table.h" 40*61046927SAndroid Build Coastguard Worker #include "program/program_parser.h" 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker #include "util/u_math.h" 43*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h" 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker enum { 46*61046927SAndroid Build Coastguard Worker STATE_MATRIX_NO_MODIFIER, 47*61046927SAndroid Build Coastguard Worker STATE_MATRIX_INVERSE, 48*61046927SAndroid Build Coastguard Worker STATE_MATRIX_TRANSPOSE, 49*61046927SAndroid Build Coastguard Worker STATE_MATRIX_INVTRANS, 50*61046927SAndroid Build Coastguard Worker }; 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker extern void *yy_scan_string(char *); 53*61046927SAndroid Build Coastguard Worker extern void yy_delete_buffer(void *); 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker static struct asm_symbol *declare_variable(struct asm_parser_state *state, 56*61046927SAndroid Build Coastguard Worker char *name, enum asm_type t, struct YYLTYPE *locp); 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker static int add_state_reference(struct gl_program_parameter_list *param_list, 59*61046927SAndroid Build Coastguard Worker const gl_state_index16 tokens[STATE_LENGTH]); 60*61046927SAndroid Build Coastguard Worker 61*61046927SAndroid Build Coastguard Worker static int initialize_symbol_from_state(struct gl_program *prog, 62*61046927SAndroid Build Coastguard Worker struct asm_symbol *param_var, const gl_state_index16 tokens[STATE_LENGTH]); 63*61046927SAndroid Build Coastguard Worker 64*61046927SAndroid Build Coastguard Worker static int initialize_symbol_from_param(struct gl_program *prog, 65*61046927SAndroid Build Coastguard Worker struct asm_symbol *param_var, const gl_state_index16 tokens[STATE_LENGTH]); 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Worker static int initialize_symbol_from_const(struct gl_program *prog, 68*61046927SAndroid Build Coastguard Worker struct asm_symbol *param_var, const struct asm_vector *vec, 69*61046927SAndroid Build Coastguard Worker GLboolean allowSwizzle); 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Worker static int yyparse(struct asm_parser_state *state); 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker static char *make_error_string(const char *fmt, ...); 74*61046927SAndroid Build Coastguard Worker 75*61046927SAndroid Build Coastguard Worker static void yyerror(struct YYLTYPE *locp, struct asm_parser_state *state, 76*61046927SAndroid Build Coastguard Worker const char *s); 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker static int validate_inputs(struct YYLTYPE *locp, 79*61046927SAndroid Build Coastguard Worker struct asm_parser_state *state); 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard Worker static void init_dst_reg(struct prog_dst_register *r); 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard Worker static void set_dst_reg(struct prog_dst_register *r, 84*61046927SAndroid Build Coastguard Worker gl_register_file file, GLint index); 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker static void init_src_reg(struct asm_src_register *r); 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker static void set_src_reg(struct asm_src_register *r, 89*61046927SAndroid Build Coastguard Worker gl_register_file file, GLint index); 90*61046927SAndroid Build Coastguard Worker 91*61046927SAndroid Build Coastguard Worker static void set_src_reg_swz(struct asm_src_register *r, 92*61046927SAndroid Build Coastguard Worker gl_register_file file, GLint index, GLuint swizzle); 93*61046927SAndroid Build Coastguard Worker 94*61046927SAndroid Build Coastguard Worker static void asm_instruction_set_operands(struct asm_instruction *inst, 95*61046927SAndroid Build Coastguard Worker const struct prog_dst_register *dst, const struct asm_src_register *src0, 96*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src1, const struct asm_src_register *src2); 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker static struct asm_instruction *asm_instruction_ctor(enum prog_opcode op, 99*61046927SAndroid Build Coastguard Worker const struct prog_dst_register *dst, const struct asm_src_register *src0, 100*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src1, const struct asm_src_register *src2); 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker static struct asm_instruction *asm_instruction_copy_ctor( 103*61046927SAndroid Build Coastguard Worker const struct prog_instruction *base, const struct prog_dst_register *dst, 104*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src0, const struct asm_src_register *src1, 105*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src2); 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker #ifndef FALSE 108*61046927SAndroid Build Coastguard Worker #define FALSE 0 109*61046927SAndroid Build Coastguard Worker #define TRUE (!FALSE) 110*61046927SAndroid Build Coastguard Worker #endif 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker #define YYLLOC_DEFAULT(Current, Rhs, N) \ 113*61046927SAndroid Build Coastguard Worker do { \ 114*61046927SAndroid Build Coastguard Worker if (N) { \ 115*61046927SAndroid Build Coastguard Worker (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 116*61046927SAndroid Build Coastguard Worker (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 117*61046927SAndroid Build Coastguard Worker (Current).position = YYRHSLOC(Rhs, 1).position; \ 118*61046927SAndroid Build Coastguard Worker (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 119*61046927SAndroid Build Coastguard Worker (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 120*61046927SAndroid Build Coastguard Worker } else { \ 121*61046927SAndroid Build Coastguard Worker (Current).first_line = YYRHSLOC(Rhs, 0).last_line; \ 122*61046927SAndroid Build Coastguard Worker (Current).last_line = (Current).first_line; \ 123*61046927SAndroid Build Coastguard Worker (Current).first_column = YYRHSLOC(Rhs, 0).last_column; \ 124*61046927SAndroid Build Coastguard Worker (Current).last_column = (Current).first_column; \ 125*61046927SAndroid Build Coastguard Worker (Current).position = YYRHSLOC(Rhs, 0).position \ 126*61046927SAndroid Build Coastguard Worker + (Current).first_column; \ 127*61046927SAndroid Build Coastguard Worker } \ 128*61046927SAndroid Build Coastguard Worker } while(0) 129*61046927SAndroid Build Coastguard Worker %} 130*61046927SAndroid Build Coastguard Worker 131*61046927SAndroid Build Coastguard Worker %pure-parser 132*61046927SAndroid Build Coastguard Worker %locations 133*61046927SAndroid Build Coastguard Worker %lex-param { struct asm_parser_state *state } 134*61046927SAndroid Build Coastguard Worker %parse-param { struct asm_parser_state *state } 135*61046927SAndroid Build Coastguard Worker %error-verbose 136*61046927SAndroid Build Coastguard Worker 137*61046927SAndroid Build Coastguard Worker %union { 138*61046927SAndroid Build Coastguard Worker struct asm_instruction *inst; 139*61046927SAndroid Build Coastguard Worker struct asm_symbol *sym; 140*61046927SAndroid Build Coastguard Worker struct asm_symbol temp_sym; 141*61046927SAndroid Build Coastguard Worker struct asm_swizzle_mask swiz_mask; 142*61046927SAndroid Build Coastguard Worker struct asm_src_register src_reg; 143*61046927SAndroid Build Coastguard Worker struct prog_dst_register dst_reg; 144*61046927SAndroid Build Coastguard Worker struct prog_instruction temp_inst; 145*61046927SAndroid Build Coastguard Worker char *string; 146*61046927SAndroid Build Coastguard Worker unsigned result; 147*61046927SAndroid Build Coastguard Worker unsigned attrib; 148*61046927SAndroid Build Coastguard Worker int integer; 149*61046927SAndroid Build Coastguard Worker float real; 150*61046927SAndroid Build Coastguard Worker gl_state_index16 state[STATE_LENGTH]; 151*61046927SAndroid Build Coastguard Worker int negate; 152*61046927SAndroid Build Coastguard Worker struct asm_vector vector; 153*61046927SAndroid Build Coastguard Worker enum prog_opcode opcode; 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker struct { 156*61046927SAndroid Build Coastguard Worker unsigned swz; 157*61046927SAndroid Build Coastguard Worker unsigned rgba_valid:1; 158*61046927SAndroid Build Coastguard Worker unsigned xyzw_valid:1; 159*61046927SAndroid Build Coastguard Worker unsigned negate:1; 160*61046927SAndroid Build Coastguard Worker } ext_swizzle; 161*61046927SAndroid Build Coastguard Worker } 162*61046927SAndroid Build Coastguard Worker 163*61046927SAndroid Build Coastguard Worker %token ARBvp_10 ARBfp_10 164*61046927SAndroid Build Coastguard Worker 165*61046927SAndroid Build Coastguard Worker /* Tokens for assembler pseudo-ops */ 166*61046927SAndroid Build Coastguard Worker %token <integer> ADDRESS 167*61046927SAndroid Build Coastguard Worker %token ALIAS ATTRIB 168*61046927SAndroid Build Coastguard Worker %token OPTION OUTPUT 169*61046927SAndroid Build Coastguard Worker %token PARAM 170*61046927SAndroid Build Coastguard Worker %token <integer> TEMP 171*61046927SAndroid Build Coastguard Worker %token END 172*61046927SAndroid Build Coastguard Worker 173*61046927SAndroid Build Coastguard Worker /* Tokens for instructions */ 174*61046927SAndroid Build Coastguard Worker %token <temp_inst> BIN_OP BINSC_OP SAMPLE_OP SCALAR_OP TRI_OP VECTOR_OP 175*61046927SAndroid Build Coastguard Worker %token <temp_inst> ARL KIL SWZ TXD_OP 176*61046927SAndroid Build Coastguard Worker 177*61046927SAndroid Build Coastguard Worker %token <integer> INTEGER 178*61046927SAndroid Build Coastguard Worker %token <real> REAL 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard Worker %token AMBIENT ATTENUATION 181*61046927SAndroid Build Coastguard Worker %token BACK 182*61046927SAndroid Build Coastguard Worker %token CLIP COLOR 183*61046927SAndroid Build Coastguard Worker %token DEPTH DIFFUSE DIRECTION 184*61046927SAndroid Build Coastguard Worker %token EMISSION ENV EYE 185*61046927SAndroid Build Coastguard Worker %token FOG FOGCOORD FRAGMENT FRONT 186*61046927SAndroid Build Coastguard Worker %token HALF 187*61046927SAndroid Build Coastguard Worker %token INVERSE INVTRANS 188*61046927SAndroid Build Coastguard Worker %token LIGHT LIGHTMODEL LIGHTPROD LOCAL 189*61046927SAndroid Build Coastguard Worker %token MATERIAL MAT_PROGRAM MATRIX MATRIXINDEX MODELVIEW MVP 190*61046927SAndroid Build Coastguard Worker %token NORMAL 191*61046927SAndroid Build Coastguard Worker %token OBJECT 192*61046927SAndroid Build Coastguard Worker %token PALETTE PARAMS PLANE POINT_TOK POINTSIZE POSITION PRIMARY PROGRAM PROJECTION 193*61046927SAndroid Build Coastguard Worker %token RANGE RESULT ROW 194*61046927SAndroid Build Coastguard Worker %token SCENECOLOR SECONDARY SHININESS SIZE_TOK SPECULAR SPOT STATE 195*61046927SAndroid Build Coastguard Worker %token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE 196*61046927SAndroid Build Coastguard Worker %token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT 197*61046927SAndroid Build Coastguard Worker %token TEX_SHADOW1D TEX_SHADOW2D TEX_SHADOWRECT 198*61046927SAndroid Build Coastguard Worker %token TEX_ARRAY1D TEX_ARRAY2D TEX_ARRAYSHADOW1D TEX_ARRAYSHADOW2D 199*61046927SAndroid Build Coastguard Worker %token VERTEX VTXATTRIB 200*61046927SAndroid Build Coastguard Worker 201*61046927SAndroid Build Coastguard Worker %token <string> IDENTIFIER USED_IDENTIFIER 202*61046927SAndroid Build Coastguard Worker %type <string> string 203*61046927SAndroid Build Coastguard Worker %token <swiz_mask> MASK4 MASK3 MASK2 MASK1 SWIZZLE 204*61046927SAndroid Build Coastguard Worker %token DOT_DOT 205*61046927SAndroid Build Coastguard Worker %token DOT 206*61046927SAndroid Build Coastguard Worker 207*61046927SAndroid Build Coastguard Worker %type <inst> instruction ALU_instruction TexInstruction 208*61046927SAndroid Build Coastguard Worker %type <inst> ARL_instruction VECTORop_instruction 209*61046927SAndroid Build Coastguard Worker %type <inst> SCALARop_instruction BINSCop_instruction BINop_instruction 210*61046927SAndroid Build Coastguard Worker %type <inst> TRIop_instruction TXD_instruction SWZ_instruction SAMPLE_instruction 211*61046927SAndroid Build Coastguard Worker %type <inst> KIL_instruction 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker %type <dst_reg> dstReg maskedDstReg maskedAddrReg 214*61046927SAndroid Build Coastguard Worker %type <src_reg> srcReg scalarUse scalarSrcReg swizzleSrcReg 215*61046927SAndroid Build Coastguard Worker %type <swiz_mask> scalarSuffix swizzleSuffix extendedSwizzle 216*61046927SAndroid Build Coastguard Worker %type <ext_swizzle> extSwizComp extSwizSel 217*61046927SAndroid Build Coastguard Worker %type <swiz_mask> optionalMask 218*61046927SAndroid Build Coastguard Worker 219*61046927SAndroid Build Coastguard Worker %type <sym> progParamArray 220*61046927SAndroid Build Coastguard Worker %type <integer> addrRegRelOffset addrRegPosOffset addrRegNegOffset 221*61046927SAndroid Build Coastguard Worker %type <src_reg> progParamArrayMem progParamArrayAbs progParamArrayRel 222*61046927SAndroid Build Coastguard Worker %type <sym> addrReg 223*61046927SAndroid Build Coastguard Worker %type <swiz_mask> addrComponent addrWriteMask 224*61046927SAndroid Build Coastguard Worker 225*61046927SAndroid Build Coastguard Worker %type <result> resultBinding resultColBinding 226*61046927SAndroid Build Coastguard Worker %type <integer> optFaceType optColorType 227*61046927SAndroid Build Coastguard Worker %type <integer> optResultFaceType optResultColorType 228*61046927SAndroid Build Coastguard Worker 229*61046927SAndroid Build Coastguard Worker %type <integer> optTexImageUnitNum texImageUnitNum 230*61046927SAndroid Build Coastguard Worker %type <integer> optTexCoordUnitNum texCoordUnitNum 231*61046927SAndroid Build Coastguard Worker %type <integer> optLegacyTexUnitNum legacyTexUnitNum 232*61046927SAndroid Build Coastguard Worker %type <integer> texImageUnit texTarget 233*61046927SAndroid Build Coastguard Worker %type <integer> vtxAttribNum 234*61046927SAndroid Build Coastguard Worker 235*61046927SAndroid Build Coastguard Worker %type <attrib> attribBinding vtxAttribItem fragAttribItem 236*61046927SAndroid Build Coastguard Worker 237*61046927SAndroid Build Coastguard Worker %type <temp_sym> paramSingleInit paramSingleItemDecl 238*61046927SAndroid Build Coastguard Worker %type <integer> optArraySize 239*61046927SAndroid Build Coastguard Worker 240*61046927SAndroid Build Coastguard Worker %type <state> stateSingleItem stateMultipleItem 241*61046927SAndroid Build Coastguard Worker %type <state> stateMaterialItem 242*61046927SAndroid Build Coastguard Worker %type <state> stateLightItem stateLightModelItem stateLightProdItem 243*61046927SAndroid Build Coastguard Worker %type <state> stateTexGenItem stateFogItem stateClipPlaneItem statePointItem 244*61046927SAndroid Build Coastguard Worker %type <state> stateMatrixItem stateMatrixRow stateMatrixRows 245*61046927SAndroid Build Coastguard Worker %type <state> stateTexEnvItem stateDepthItem 246*61046927SAndroid Build Coastguard Worker 247*61046927SAndroid Build Coastguard Worker %type <state> stateLModProperty 248*61046927SAndroid Build Coastguard Worker %type <state> stateMatrixName optMatrixRows 249*61046927SAndroid Build Coastguard Worker 250*61046927SAndroid Build Coastguard Worker %type <integer> stateMatProperty 251*61046927SAndroid Build Coastguard Worker %type <integer> stateLightProperty stateSpotProperty 252*61046927SAndroid Build Coastguard Worker %type <integer> stateLightNumber stateLProdProperty 253*61046927SAndroid Build Coastguard Worker %type <integer> stateTexGenType stateTexGenCoord 254*61046927SAndroid Build Coastguard Worker %type <integer> stateTexEnvProperty 255*61046927SAndroid Build Coastguard Worker %type <integer> stateFogProperty 256*61046927SAndroid Build Coastguard Worker %type <integer> stateClipPlaneNum 257*61046927SAndroid Build Coastguard Worker %type <integer> statePointProperty 258*61046927SAndroid Build Coastguard Worker 259*61046927SAndroid Build Coastguard Worker %type <integer> stateOptMatModifier stateMatModifier stateMatrixRowNum 260*61046927SAndroid Build Coastguard Worker %type <integer> stateOptModMatNum stateModMatNum statePaletteMatNum 261*61046927SAndroid Build Coastguard Worker %type <integer> stateProgramMatNum 262*61046927SAndroid Build Coastguard Worker 263*61046927SAndroid Build Coastguard Worker %type <integer> ambDiffSpecPropertyMaterial 264*61046927SAndroid Build Coastguard Worker %type <integer> ambDiffSpecPropertyLight 265*61046927SAndroid Build Coastguard Worker 266*61046927SAndroid Build Coastguard Worker %type <state> programSingleItem progEnvParam progLocalParam 267*61046927SAndroid Build Coastguard Worker %type <state> programMultipleItem progEnvParams progLocalParams 268*61046927SAndroid Build Coastguard Worker 269*61046927SAndroid Build Coastguard Worker %type <temp_sym> paramMultipleInit paramMultInitList paramMultipleItem 270*61046927SAndroid Build Coastguard Worker %type <temp_sym> paramSingleItemUse 271*61046927SAndroid Build Coastguard Worker 272*61046927SAndroid Build Coastguard Worker %type <integer> progEnvParamNum progLocalParamNum 273*61046927SAndroid Build Coastguard Worker %type <state> progEnvParamNums progLocalParamNums 274*61046927SAndroid Build Coastguard Worker 275*61046927SAndroid Build Coastguard Worker %type <vector> paramConstDecl paramConstUse 276*61046927SAndroid Build Coastguard Worker %type <vector> paramConstScalarDecl paramConstScalarUse paramConstVector 277*61046927SAndroid Build Coastguard Worker %type <real> signedFloatConstant 278*61046927SAndroid Build Coastguard Worker %type <negate> optionalSign 279*61046927SAndroid Build Coastguard Worker 280*61046927SAndroid Build Coastguard Worker %{ 281*61046927SAndroid Build Coastguard Worker extern int 282*61046927SAndroid Build Coastguard Worker _mesa_program_lexer_lex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, 283*61046927SAndroid Build Coastguard Worker void *yyscanner); 284*61046927SAndroid Build Coastguard Worker 285*61046927SAndroid Build Coastguard Worker static int 286*61046927SAndroid Build Coastguard Worker yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, 287*61046927SAndroid Build Coastguard Worker struct asm_parser_state *state) 288*61046927SAndroid Build Coastguard Worker { 289*61046927SAndroid Build Coastguard Worker return _mesa_program_lexer_lex(yylval_param, yylloc_param, state->scanner); 290*61046927SAndroid Build Coastguard Worker } 291*61046927SAndroid Build Coastguard Worker %} 292*61046927SAndroid Build Coastguard Worker 293*61046927SAndroid Build Coastguard Worker /* The directive: %destructor is called to clean up the stack 294*61046927SAndroid Build Coastguard Worker * after a parser error. 295*61046927SAndroid Build Coastguard Worker */ 296*61046927SAndroid Build Coastguard Worker %destructor { free($$); } IDENTIFIER USED_IDENTIFIER 297*61046927SAndroid Build Coastguard Worker 298*61046927SAndroid Build Coastguard Worker %% 299*61046927SAndroid Build Coastguard Worker 300*61046927SAndroid Build Coastguard Worker program: language optionSequence statementSequence END 301*61046927SAndroid Build Coastguard Worker ; 302*61046927SAndroid Build Coastguard Worker 303*61046927SAndroid Build Coastguard Worker language: ARBvp_10 304*61046927SAndroid Build Coastguard Worker { 305*61046927SAndroid Build Coastguard Worker if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) { 306*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid fragment program header"); 307*61046927SAndroid Build Coastguard Worker 308*61046927SAndroid Build Coastguard Worker } 309*61046927SAndroid Build Coastguard Worker state->mode = ARB_vertex; 310*61046927SAndroid Build Coastguard Worker } 311*61046927SAndroid Build Coastguard Worker | ARBfp_10 312*61046927SAndroid Build Coastguard Worker { 313*61046927SAndroid Build Coastguard Worker if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) { 314*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid vertex program header"); 315*61046927SAndroid Build Coastguard Worker } 316*61046927SAndroid Build Coastguard Worker state->mode = ARB_fragment; 317*61046927SAndroid Build Coastguard Worker 318*61046927SAndroid Build Coastguard Worker state->option.TexRect = 319*61046927SAndroid Build Coastguard Worker (state->ctx->Extensions.NV_texture_rectangle != GL_FALSE); 320*61046927SAndroid Build Coastguard Worker } 321*61046927SAndroid Build Coastguard Worker ; 322*61046927SAndroid Build Coastguard Worker 323*61046927SAndroid Build Coastguard Worker optionSequence: optionSequence option 324*61046927SAndroid Build Coastguard Worker | 325*61046927SAndroid Build Coastguard Worker ; 326*61046927SAndroid Build Coastguard Worker 327*61046927SAndroid Build Coastguard Worker option: OPTION string ';' 328*61046927SAndroid Build Coastguard Worker { 329*61046927SAndroid Build Coastguard Worker int valid = 0; 330*61046927SAndroid Build Coastguard Worker 331*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 332*61046927SAndroid Build Coastguard Worker valid = _mesa_ARBvp_parse_option(state, $2); 333*61046927SAndroid Build Coastguard Worker } else if (state->mode == ARB_fragment) { 334*61046927SAndroid Build Coastguard Worker valid = _mesa_ARBfp_parse_option(state, $2); 335*61046927SAndroid Build Coastguard Worker } 336*61046927SAndroid Build Coastguard Worker 337*61046927SAndroid Build Coastguard Worker 338*61046927SAndroid Build Coastguard Worker free($2); 339*61046927SAndroid Build Coastguard Worker 340*61046927SAndroid Build Coastguard Worker if (!valid) { 341*61046927SAndroid Build Coastguard Worker const char *const err_str = (state->mode == ARB_vertex) 342*61046927SAndroid Build Coastguard Worker ? "invalid ARB vertex program option" 343*61046927SAndroid Build Coastguard Worker : "invalid ARB fragment program option"; 344*61046927SAndroid Build Coastguard Worker 345*61046927SAndroid Build Coastguard Worker yyerror(& @2, state, err_str); 346*61046927SAndroid Build Coastguard Worker YYERROR; 347*61046927SAndroid Build Coastguard Worker } 348*61046927SAndroid Build Coastguard Worker } 349*61046927SAndroid Build Coastguard Worker ; 350*61046927SAndroid Build Coastguard Worker 351*61046927SAndroid Build Coastguard Worker statementSequence: statementSequence statement 352*61046927SAndroid Build Coastguard Worker | 353*61046927SAndroid Build Coastguard Worker ; 354*61046927SAndroid Build Coastguard Worker 355*61046927SAndroid Build Coastguard Worker statement: instruction ';' 356*61046927SAndroid Build Coastguard Worker { 357*61046927SAndroid Build Coastguard Worker if ($1 != NULL) { 358*61046927SAndroid Build Coastguard Worker if (state->inst_tail == NULL) { 359*61046927SAndroid Build Coastguard Worker state->inst_head = $1; 360*61046927SAndroid Build Coastguard Worker } else { 361*61046927SAndroid Build Coastguard Worker state->inst_tail->next = $1; 362*61046927SAndroid Build Coastguard Worker } 363*61046927SAndroid Build Coastguard Worker 364*61046927SAndroid Build Coastguard Worker state->inst_tail = $1; 365*61046927SAndroid Build Coastguard Worker $1->next = NULL; 366*61046927SAndroid Build Coastguard Worker 367*61046927SAndroid Build Coastguard Worker state->prog->arb.NumInstructions++; 368*61046927SAndroid Build Coastguard Worker } 369*61046927SAndroid Build Coastguard Worker } 370*61046927SAndroid Build Coastguard Worker | namingStatement ';' 371*61046927SAndroid Build Coastguard Worker ; 372*61046927SAndroid Build Coastguard Worker 373*61046927SAndroid Build Coastguard Worker instruction: ALU_instruction 374*61046927SAndroid Build Coastguard Worker { 375*61046927SAndroid Build Coastguard Worker $$ = $1; 376*61046927SAndroid Build Coastguard Worker state->prog->arb.NumAluInstructions++; 377*61046927SAndroid Build Coastguard Worker } 378*61046927SAndroid Build Coastguard Worker | TexInstruction 379*61046927SAndroid Build Coastguard Worker { 380*61046927SAndroid Build Coastguard Worker $$ = $1; 381*61046927SAndroid Build Coastguard Worker state->prog->arb.NumTexInstructions++; 382*61046927SAndroid Build Coastguard Worker } 383*61046927SAndroid Build Coastguard Worker ; 384*61046927SAndroid Build Coastguard Worker 385*61046927SAndroid Build Coastguard Worker ALU_instruction: ARL_instruction 386*61046927SAndroid Build Coastguard Worker | VECTORop_instruction 387*61046927SAndroid Build Coastguard Worker | SCALARop_instruction 388*61046927SAndroid Build Coastguard Worker | BINSCop_instruction 389*61046927SAndroid Build Coastguard Worker | BINop_instruction 390*61046927SAndroid Build Coastguard Worker | TRIop_instruction 391*61046927SAndroid Build Coastguard Worker | SWZ_instruction 392*61046927SAndroid Build Coastguard Worker ; 393*61046927SAndroid Build Coastguard Worker 394*61046927SAndroid Build Coastguard Worker TexInstruction: SAMPLE_instruction 395*61046927SAndroid Build Coastguard Worker | KIL_instruction 396*61046927SAndroid Build Coastguard Worker | TXD_instruction 397*61046927SAndroid Build Coastguard Worker ; 398*61046927SAndroid Build Coastguard Worker 399*61046927SAndroid Build Coastguard Worker ARL_instruction: ARL maskedAddrReg ',' scalarSrcReg 400*61046927SAndroid Build Coastguard Worker { 401*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_ctor(OPCODE_ARL, & $2, & $4, NULL, NULL); 402*61046927SAndroid Build Coastguard Worker } 403*61046927SAndroid Build Coastguard Worker ; 404*61046927SAndroid Build Coastguard Worker 405*61046927SAndroid Build Coastguard Worker VECTORop_instruction: VECTOR_OP maskedDstReg ',' swizzleSrcReg 406*61046927SAndroid Build Coastguard Worker { 407*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 408*61046927SAndroid Build Coastguard Worker } 409*61046927SAndroid Build Coastguard Worker ; 410*61046927SAndroid Build Coastguard Worker 411*61046927SAndroid Build Coastguard Worker SCALARop_instruction: SCALAR_OP maskedDstReg ',' scalarSrcReg 412*61046927SAndroid Build Coastguard Worker { 413*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 414*61046927SAndroid Build Coastguard Worker } 415*61046927SAndroid Build Coastguard Worker ; 416*61046927SAndroid Build Coastguard Worker 417*61046927SAndroid Build Coastguard Worker BINSCop_instruction: BINSC_OP maskedDstReg ',' scalarSrcReg ',' scalarSrcReg 418*61046927SAndroid Build Coastguard Worker { 419*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL); 420*61046927SAndroid Build Coastguard Worker } 421*61046927SAndroid Build Coastguard Worker ; 422*61046927SAndroid Build Coastguard Worker 423*61046927SAndroid Build Coastguard Worker 424*61046927SAndroid Build Coastguard Worker BINop_instruction: BIN_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg 425*61046927SAndroid Build Coastguard Worker { 426*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL); 427*61046927SAndroid Build Coastguard Worker } 428*61046927SAndroid Build Coastguard Worker ; 429*61046927SAndroid Build Coastguard Worker 430*61046927SAndroid Build Coastguard Worker TRIop_instruction: TRI_OP maskedDstReg ',' 431*61046927SAndroid Build Coastguard Worker swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg 432*61046927SAndroid Build Coastguard Worker { 433*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8); 434*61046927SAndroid Build Coastguard Worker } 435*61046927SAndroid Build Coastguard Worker ; 436*61046927SAndroid Build Coastguard Worker 437*61046927SAndroid Build Coastguard Worker SAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget 438*61046927SAndroid Build Coastguard Worker { 439*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 440*61046927SAndroid Build Coastguard Worker if ($$ != NULL) { 441*61046927SAndroid Build Coastguard Worker const GLbitfield tex_mask = (1U << $6); 442*61046927SAndroid Build Coastguard Worker GLbitfield shadow_tex = 0; 443*61046927SAndroid Build Coastguard Worker GLbitfield target_mask = 0; 444*61046927SAndroid Build Coastguard Worker 445*61046927SAndroid Build Coastguard Worker 446*61046927SAndroid Build Coastguard Worker $$->Base.TexSrcUnit = $6; 447*61046927SAndroid Build Coastguard Worker 448*61046927SAndroid Build Coastguard Worker if ($8 < 0) { 449*61046927SAndroid Build Coastguard Worker shadow_tex = tex_mask; 450*61046927SAndroid Build Coastguard Worker 451*61046927SAndroid Build Coastguard Worker $$->Base.TexSrcTarget = -$8; 452*61046927SAndroid Build Coastguard Worker $$->Base.TexShadow = 1; 453*61046927SAndroid Build Coastguard Worker } else { 454*61046927SAndroid Build Coastguard Worker $$->Base.TexSrcTarget = $8; 455*61046927SAndroid Build Coastguard Worker } 456*61046927SAndroid Build Coastguard Worker 457*61046927SAndroid Build Coastguard Worker target_mask = (1U << $$->Base.TexSrcTarget); 458*61046927SAndroid Build Coastguard Worker 459*61046927SAndroid Build Coastguard Worker /* If this texture unit was previously accessed and that access 460*61046927SAndroid Build Coastguard Worker * had a different texture target, generate an error. 461*61046927SAndroid Build Coastguard Worker * 462*61046927SAndroid Build Coastguard Worker * If this texture unit was previously accessed and that access 463*61046927SAndroid Build Coastguard Worker * had a different shadow mode, generate an error. 464*61046927SAndroid Build Coastguard Worker */ 465*61046927SAndroid Build Coastguard Worker if ((state->prog->TexturesUsed[$6] != 0) 466*61046927SAndroid Build Coastguard Worker && ((state->prog->TexturesUsed[$6] != target_mask) 467*61046927SAndroid Build Coastguard Worker || ((state->prog->ShadowSamplers & tex_mask) 468*61046927SAndroid Build Coastguard Worker != shadow_tex))) { 469*61046927SAndroid Build Coastguard Worker yyerror(& @8, state, 470*61046927SAndroid Build Coastguard Worker "multiple targets used on one texture image unit"); 471*61046927SAndroid Build Coastguard Worker free($$); 472*61046927SAndroid Build Coastguard Worker YYERROR; 473*61046927SAndroid Build Coastguard Worker } 474*61046927SAndroid Build Coastguard Worker 475*61046927SAndroid Build Coastguard Worker 476*61046927SAndroid Build Coastguard Worker state->prog->TexturesUsed[$6] |= target_mask; 477*61046927SAndroid Build Coastguard Worker state->prog->ShadowSamplers |= shadow_tex; 478*61046927SAndroid Build Coastguard Worker } 479*61046927SAndroid Build Coastguard Worker } 480*61046927SAndroid Build Coastguard Worker ; 481*61046927SAndroid Build Coastguard Worker 482*61046927SAndroid Build Coastguard Worker KIL_instruction: KIL swizzleSrcReg 483*61046927SAndroid Build Coastguard Worker { 484*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL); 485*61046927SAndroid Build Coastguard Worker state->fragment.UsesKill = 1; 486*61046927SAndroid Build Coastguard Worker } 487*61046927SAndroid Build Coastguard Worker ; 488*61046927SAndroid Build Coastguard Worker 489*61046927SAndroid Build Coastguard Worker TXD_instruction: TXD_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget 490*61046927SAndroid Build Coastguard Worker { 491*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8); 492*61046927SAndroid Build Coastguard Worker if ($$ != NULL) { 493*61046927SAndroid Build Coastguard Worker const GLbitfield tex_mask = (1U << $10); 494*61046927SAndroid Build Coastguard Worker GLbitfield shadow_tex = 0; 495*61046927SAndroid Build Coastguard Worker GLbitfield target_mask = 0; 496*61046927SAndroid Build Coastguard Worker 497*61046927SAndroid Build Coastguard Worker 498*61046927SAndroid Build Coastguard Worker $$->Base.TexSrcUnit = $10; 499*61046927SAndroid Build Coastguard Worker 500*61046927SAndroid Build Coastguard Worker if ($12 < 0) { 501*61046927SAndroid Build Coastguard Worker shadow_tex = tex_mask; 502*61046927SAndroid Build Coastguard Worker 503*61046927SAndroid Build Coastguard Worker $$->Base.TexSrcTarget = -$12; 504*61046927SAndroid Build Coastguard Worker $$->Base.TexShadow = 1; 505*61046927SAndroid Build Coastguard Worker } else { 506*61046927SAndroid Build Coastguard Worker $$->Base.TexSrcTarget = $12; 507*61046927SAndroid Build Coastguard Worker } 508*61046927SAndroid Build Coastguard Worker 509*61046927SAndroid Build Coastguard Worker target_mask = (1U << $$->Base.TexSrcTarget); 510*61046927SAndroid Build Coastguard Worker 511*61046927SAndroid Build Coastguard Worker /* If this texture unit was previously accessed and that access 512*61046927SAndroid Build Coastguard Worker * had a different texture target, generate an error. 513*61046927SAndroid Build Coastguard Worker * 514*61046927SAndroid Build Coastguard Worker * If this texture unit was previously accessed and that access 515*61046927SAndroid Build Coastguard Worker * had a different shadow mode, generate an error. 516*61046927SAndroid Build Coastguard Worker */ 517*61046927SAndroid Build Coastguard Worker if ((state->prog->TexturesUsed[$10] != 0) 518*61046927SAndroid Build Coastguard Worker && ((state->prog->TexturesUsed[$10] != target_mask) 519*61046927SAndroid Build Coastguard Worker || ((state->prog->ShadowSamplers & tex_mask) 520*61046927SAndroid Build Coastguard Worker != shadow_tex))) { 521*61046927SAndroid Build Coastguard Worker yyerror(& @12, state, 522*61046927SAndroid Build Coastguard Worker "multiple targets used on one texture image unit"); 523*61046927SAndroid Build Coastguard Worker free($$); 524*61046927SAndroid Build Coastguard Worker YYERROR; 525*61046927SAndroid Build Coastguard Worker } 526*61046927SAndroid Build Coastguard Worker 527*61046927SAndroid Build Coastguard Worker 528*61046927SAndroid Build Coastguard Worker state->prog->TexturesUsed[$10] |= target_mask; 529*61046927SAndroid Build Coastguard Worker state->prog->ShadowSamplers |= shadow_tex; 530*61046927SAndroid Build Coastguard Worker } 531*61046927SAndroid Build Coastguard Worker } 532*61046927SAndroid Build Coastguard Worker ; 533*61046927SAndroid Build Coastguard Worker 534*61046927SAndroid Build Coastguard Worker texImageUnit: TEXTURE_UNIT optTexImageUnitNum 535*61046927SAndroid Build Coastguard Worker { 536*61046927SAndroid Build Coastguard Worker $$ = $2; 537*61046927SAndroid Build Coastguard Worker } 538*61046927SAndroid Build Coastguard Worker ; 539*61046927SAndroid Build Coastguard Worker 540*61046927SAndroid Build Coastguard Worker texTarget: TEX_1D { $$ = TEXTURE_1D_INDEX; } 541*61046927SAndroid Build Coastguard Worker | TEX_2D { $$ = TEXTURE_2D_INDEX; } 542*61046927SAndroid Build Coastguard Worker | TEX_3D { $$ = TEXTURE_3D_INDEX; } 543*61046927SAndroid Build Coastguard Worker | TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; } 544*61046927SAndroid Build Coastguard Worker | TEX_RECT { $$ = TEXTURE_RECT_INDEX; } 545*61046927SAndroid Build Coastguard Worker | TEX_SHADOW1D { $$ = -TEXTURE_1D_INDEX; } 546*61046927SAndroid Build Coastguard Worker | TEX_SHADOW2D { $$ = -TEXTURE_2D_INDEX; } 547*61046927SAndroid Build Coastguard Worker | TEX_SHADOWRECT { $$ = -TEXTURE_RECT_INDEX; } 548*61046927SAndroid Build Coastguard Worker | TEX_ARRAY1D { $$ = TEXTURE_1D_ARRAY_INDEX; } 549*61046927SAndroid Build Coastguard Worker | TEX_ARRAY2D { $$ = TEXTURE_2D_ARRAY_INDEX; } 550*61046927SAndroid Build Coastguard Worker | TEX_ARRAYSHADOW1D { $$ = -TEXTURE_1D_ARRAY_INDEX; } 551*61046927SAndroid Build Coastguard Worker | TEX_ARRAYSHADOW2D { $$ = -TEXTURE_2D_ARRAY_INDEX; } 552*61046927SAndroid Build Coastguard Worker ; 553*61046927SAndroid Build Coastguard Worker 554*61046927SAndroid Build Coastguard Worker SWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle 555*61046927SAndroid Build Coastguard Worker { 556*61046927SAndroid Build Coastguard Worker /* FIXME: Is this correct? Should the extenedSwizzle be applied 557*61046927SAndroid Build Coastguard Worker * FIXME: to the existing swizzle? 558*61046927SAndroid Build Coastguard Worker */ 559*61046927SAndroid Build Coastguard Worker $4.Base.Swizzle = $6.swizzle; 560*61046927SAndroid Build Coastguard Worker $4.Base.Negate = $6.mask; 561*61046927SAndroid Build Coastguard Worker 562*61046927SAndroid Build Coastguard Worker $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 563*61046927SAndroid Build Coastguard Worker } 564*61046927SAndroid Build Coastguard Worker ; 565*61046927SAndroid Build Coastguard Worker 566*61046927SAndroid Build Coastguard Worker scalarSrcReg: optionalSign scalarUse 567*61046927SAndroid Build Coastguard Worker { 568*61046927SAndroid Build Coastguard Worker $$ = $2; 569*61046927SAndroid Build Coastguard Worker 570*61046927SAndroid Build Coastguard Worker if ($1) { 571*61046927SAndroid Build Coastguard Worker $$.Base.Negate = ~$$.Base.Negate; 572*61046927SAndroid Build Coastguard Worker } 573*61046927SAndroid Build Coastguard Worker } 574*61046927SAndroid Build Coastguard Worker ; 575*61046927SAndroid Build Coastguard Worker 576*61046927SAndroid Build Coastguard Worker scalarUse: srcReg scalarSuffix 577*61046927SAndroid Build Coastguard Worker { 578*61046927SAndroid Build Coastguard Worker $$ = $1; 579*61046927SAndroid Build Coastguard Worker 580*61046927SAndroid Build Coastguard Worker $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 581*61046927SAndroid Build Coastguard Worker $2.swizzle); 582*61046927SAndroid Build Coastguard Worker } 583*61046927SAndroid Build Coastguard Worker ; 584*61046927SAndroid Build Coastguard Worker 585*61046927SAndroid Build Coastguard Worker swizzleSrcReg: optionalSign srcReg swizzleSuffix 586*61046927SAndroid Build Coastguard Worker { 587*61046927SAndroid Build Coastguard Worker $$ = $2; 588*61046927SAndroid Build Coastguard Worker 589*61046927SAndroid Build Coastguard Worker if ($1) { 590*61046927SAndroid Build Coastguard Worker $$.Base.Negate = ~$$.Base.Negate; 591*61046927SAndroid Build Coastguard Worker } 592*61046927SAndroid Build Coastguard Worker 593*61046927SAndroid Build Coastguard Worker $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 594*61046927SAndroid Build Coastguard Worker $3.swizzle); 595*61046927SAndroid Build Coastguard Worker } 596*61046927SAndroid Build Coastguard Worker ; 597*61046927SAndroid Build Coastguard Worker 598*61046927SAndroid Build Coastguard Worker maskedDstReg: dstReg optionalMask 599*61046927SAndroid Build Coastguard Worker { 600*61046927SAndroid Build Coastguard Worker $$ = $1; 601*61046927SAndroid Build Coastguard Worker $$.WriteMask = $2.mask; 602*61046927SAndroid Build Coastguard Worker 603*61046927SAndroid Build Coastguard Worker if ($$.File == PROGRAM_OUTPUT) { 604*61046927SAndroid Build Coastguard Worker /* Technically speaking, this should check that it is in 605*61046927SAndroid Build Coastguard Worker * vertex program mode. However, PositionInvariant can never be 606*61046927SAndroid Build Coastguard Worker * set in fragment program mode, so it is somewhat irrelevant. 607*61046927SAndroid Build Coastguard Worker */ 608*61046927SAndroid Build Coastguard Worker if (state->option.PositionInvariant 609*61046927SAndroid Build Coastguard Worker && ($$.Index == VARYING_SLOT_POS)) { 610*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "position-invariant programs cannot " 611*61046927SAndroid Build Coastguard Worker "write position"); 612*61046927SAndroid Build Coastguard Worker YYERROR; 613*61046927SAndroid Build Coastguard Worker } 614*61046927SAndroid Build Coastguard Worker 615*61046927SAndroid Build Coastguard Worker state->prog->info.outputs_written |= BITFIELD64_BIT($$.Index); 616*61046927SAndroid Build Coastguard Worker } 617*61046927SAndroid Build Coastguard Worker } 618*61046927SAndroid Build Coastguard Worker ; 619*61046927SAndroid Build Coastguard Worker 620*61046927SAndroid Build Coastguard Worker maskedAddrReg: addrReg addrWriteMask 621*61046927SAndroid Build Coastguard Worker { 622*61046927SAndroid Build Coastguard Worker set_dst_reg(& $$, PROGRAM_ADDRESS, 0); 623*61046927SAndroid Build Coastguard Worker $$.WriteMask = $2.mask; 624*61046927SAndroid Build Coastguard Worker } 625*61046927SAndroid Build Coastguard Worker ; 626*61046927SAndroid Build Coastguard Worker 627*61046927SAndroid Build Coastguard Worker extendedSwizzle: extSwizComp ',' extSwizComp ',' extSwizComp ',' extSwizComp 628*61046927SAndroid Build Coastguard Worker { 629*61046927SAndroid Build Coastguard Worker const unsigned xyzw_valid = 630*61046927SAndroid Build Coastguard Worker ($1.xyzw_valid << 0) 631*61046927SAndroid Build Coastguard Worker | ($3.xyzw_valid << 1) 632*61046927SAndroid Build Coastguard Worker | ($5.xyzw_valid << 2) 633*61046927SAndroid Build Coastguard Worker | ($7.xyzw_valid << 3); 634*61046927SAndroid Build Coastguard Worker const unsigned rgba_valid = 635*61046927SAndroid Build Coastguard Worker ($1.rgba_valid << 0) 636*61046927SAndroid Build Coastguard Worker | ($3.rgba_valid << 1) 637*61046927SAndroid Build Coastguard Worker | ($5.rgba_valid << 2) 638*61046927SAndroid Build Coastguard Worker | ($7.rgba_valid << 3); 639*61046927SAndroid Build Coastguard Worker 640*61046927SAndroid Build Coastguard Worker /* All of the swizzle components have to be valid in either RGBA 641*61046927SAndroid Build Coastguard Worker * or XYZW. Note that 0 and 1 are valid in both, so both masks 642*61046927SAndroid Build Coastguard Worker * can have some bits set. 643*61046927SAndroid Build Coastguard Worker * 644*61046927SAndroid Build Coastguard Worker * We somewhat deviate from the spec here. It would be really hard 645*61046927SAndroid Build Coastguard Worker * to figure out which component is the error, and there probably 646*61046927SAndroid Build Coastguard Worker * isn't a lot of benefit. 647*61046927SAndroid Build Coastguard Worker */ 648*61046927SAndroid Build Coastguard Worker if ((rgba_valid != 0x0f) && (xyzw_valid != 0x0f)) { 649*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "cannot combine RGBA and XYZW swizzle " 650*61046927SAndroid Build Coastguard Worker "components"); 651*61046927SAndroid Build Coastguard Worker YYERROR; 652*61046927SAndroid Build Coastguard Worker } 653*61046927SAndroid Build Coastguard Worker 654*61046927SAndroid Build Coastguard Worker $$.swizzle = MAKE_SWIZZLE4($1.swz, $3.swz, $5.swz, $7.swz); 655*61046927SAndroid Build Coastguard Worker $$.mask = ($1.negate) | ($3.negate << 1) | ($5.negate << 2) 656*61046927SAndroid Build Coastguard Worker | ($7.negate << 3); 657*61046927SAndroid Build Coastguard Worker } 658*61046927SAndroid Build Coastguard Worker ; 659*61046927SAndroid Build Coastguard Worker 660*61046927SAndroid Build Coastguard Worker extSwizComp: optionalSign extSwizSel 661*61046927SAndroid Build Coastguard Worker { 662*61046927SAndroid Build Coastguard Worker $$ = $2; 663*61046927SAndroid Build Coastguard Worker $$.negate = ($1) ? 1 : 0; 664*61046927SAndroid Build Coastguard Worker } 665*61046927SAndroid Build Coastguard Worker ; 666*61046927SAndroid Build Coastguard Worker 667*61046927SAndroid Build Coastguard Worker extSwizSel: INTEGER 668*61046927SAndroid Build Coastguard Worker { 669*61046927SAndroid Build Coastguard Worker if (($1 != 0) && ($1 != 1)) { 670*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid extended swizzle selector"); 671*61046927SAndroid Build Coastguard Worker YYERROR; 672*61046927SAndroid Build Coastguard Worker } 673*61046927SAndroid Build Coastguard Worker 674*61046927SAndroid Build Coastguard Worker $$.swz = ($1 == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE; 675*61046927SAndroid Build Coastguard Worker $$.negate = 0; 676*61046927SAndroid Build Coastguard Worker 677*61046927SAndroid Build Coastguard Worker /* 0 and 1 are valid for both RGBA swizzle names and XYZW 678*61046927SAndroid Build Coastguard Worker * swizzle names. 679*61046927SAndroid Build Coastguard Worker */ 680*61046927SAndroid Build Coastguard Worker $$.xyzw_valid = 1; 681*61046927SAndroid Build Coastguard Worker $$.rgba_valid = 1; 682*61046927SAndroid Build Coastguard Worker } 683*61046927SAndroid Build Coastguard Worker | string 684*61046927SAndroid Build Coastguard Worker { 685*61046927SAndroid Build Coastguard Worker char s; 686*61046927SAndroid Build Coastguard Worker 687*61046927SAndroid Build Coastguard Worker if (strlen($1) > 1) { 688*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid extended swizzle selector"); 689*61046927SAndroid Build Coastguard Worker free($1); 690*61046927SAndroid Build Coastguard Worker YYERROR; 691*61046927SAndroid Build Coastguard Worker } 692*61046927SAndroid Build Coastguard Worker 693*61046927SAndroid Build Coastguard Worker s = $1[0]; 694*61046927SAndroid Build Coastguard Worker free($1); 695*61046927SAndroid Build Coastguard Worker 696*61046927SAndroid Build Coastguard Worker $$.rgba_valid = 0; 697*61046927SAndroid Build Coastguard Worker $$.xyzw_valid = 0; 698*61046927SAndroid Build Coastguard Worker $$.negate = 0; 699*61046927SAndroid Build Coastguard Worker 700*61046927SAndroid Build Coastguard Worker switch (s) { 701*61046927SAndroid Build Coastguard Worker case 'x': 702*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_X; 703*61046927SAndroid Build Coastguard Worker $$.xyzw_valid = 1; 704*61046927SAndroid Build Coastguard Worker break; 705*61046927SAndroid Build Coastguard Worker case 'y': 706*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_Y; 707*61046927SAndroid Build Coastguard Worker $$.xyzw_valid = 1; 708*61046927SAndroid Build Coastguard Worker break; 709*61046927SAndroid Build Coastguard Worker case 'z': 710*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_Z; 711*61046927SAndroid Build Coastguard Worker $$.xyzw_valid = 1; 712*61046927SAndroid Build Coastguard Worker break; 713*61046927SAndroid Build Coastguard Worker case 'w': 714*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_W; 715*61046927SAndroid Build Coastguard Worker $$.xyzw_valid = 1; 716*61046927SAndroid Build Coastguard Worker break; 717*61046927SAndroid Build Coastguard Worker 718*61046927SAndroid Build Coastguard Worker case 'r': 719*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_X; 720*61046927SAndroid Build Coastguard Worker $$.rgba_valid = 1; 721*61046927SAndroid Build Coastguard Worker break; 722*61046927SAndroid Build Coastguard Worker case 'g': 723*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_Y; 724*61046927SAndroid Build Coastguard Worker $$.rgba_valid = 1; 725*61046927SAndroid Build Coastguard Worker break; 726*61046927SAndroid Build Coastguard Worker case 'b': 727*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_Z; 728*61046927SAndroid Build Coastguard Worker $$.rgba_valid = 1; 729*61046927SAndroid Build Coastguard Worker break; 730*61046927SAndroid Build Coastguard Worker case 'a': 731*61046927SAndroid Build Coastguard Worker $$.swz = SWIZZLE_W; 732*61046927SAndroid Build Coastguard Worker $$.rgba_valid = 1; 733*61046927SAndroid Build Coastguard Worker break; 734*61046927SAndroid Build Coastguard Worker 735*61046927SAndroid Build Coastguard Worker default: 736*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid extended swizzle selector"); 737*61046927SAndroid Build Coastguard Worker YYERROR; 738*61046927SAndroid Build Coastguard Worker break; 739*61046927SAndroid Build Coastguard Worker } 740*61046927SAndroid Build Coastguard Worker } 741*61046927SAndroid Build Coastguard Worker ; 742*61046927SAndroid Build Coastguard Worker 743*61046927SAndroid Build Coastguard Worker srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */ 744*61046927SAndroid Build Coastguard Worker { 745*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = (struct asm_symbol *) 746*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_find_symbol(state->st, $1); 747*61046927SAndroid Build Coastguard Worker 748*61046927SAndroid Build Coastguard Worker free($1); 749*61046927SAndroid Build Coastguard Worker 750*61046927SAndroid Build Coastguard Worker if (s == NULL) { 751*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid operand variable"); 752*61046927SAndroid Build Coastguard Worker YYERROR; 753*61046927SAndroid Build Coastguard Worker } else if ((s->type != at_param) && (s->type != at_temp) 754*61046927SAndroid Build Coastguard Worker && (s->type != at_attrib)) { 755*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid operand variable"); 756*61046927SAndroid Build Coastguard Worker YYERROR; 757*61046927SAndroid Build Coastguard Worker } else if ((s->type == at_param) && s->param_is_array) { 758*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "non-array access to array PARAM"); 759*61046927SAndroid Build Coastguard Worker YYERROR; 760*61046927SAndroid Build Coastguard Worker } 761*61046927SAndroid Build Coastguard Worker 762*61046927SAndroid Build Coastguard Worker init_src_reg(& $$); 763*61046927SAndroid Build Coastguard Worker switch (s->type) { 764*61046927SAndroid Build Coastguard Worker case at_temp: 765*61046927SAndroid Build Coastguard Worker set_src_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding); 766*61046927SAndroid Build Coastguard Worker break; 767*61046927SAndroid Build Coastguard Worker case at_param: 768*61046927SAndroid Build Coastguard Worker set_src_reg_swz(& $$, s->param_binding_type, 769*61046927SAndroid Build Coastguard Worker s->param_binding_begin, 770*61046927SAndroid Build Coastguard Worker s->param_binding_swizzle); 771*61046927SAndroid Build Coastguard Worker break; 772*61046927SAndroid Build Coastguard Worker case at_attrib: 773*61046927SAndroid Build Coastguard Worker set_src_reg(& $$, PROGRAM_INPUT, s->attrib_binding); 774*61046927SAndroid Build Coastguard Worker state->prog->info.inputs_read |= BITFIELD64_BIT($$.Base.Index); 775*61046927SAndroid Build Coastguard Worker 776*61046927SAndroid Build Coastguard Worker if (!validate_inputs(& @1, state)) { 777*61046927SAndroid Build Coastguard Worker YYERROR; 778*61046927SAndroid Build Coastguard Worker } 779*61046927SAndroid Build Coastguard Worker break; 780*61046927SAndroid Build Coastguard Worker 781*61046927SAndroid Build Coastguard Worker default: 782*61046927SAndroid Build Coastguard Worker YYERROR; 783*61046927SAndroid Build Coastguard Worker break; 784*61046927SAndroid Build Coastguard Worker } 785*61046927SAndroid Build Coastguard Worker } 786*61046927SAndroid Build Coastguard Worker | attribBinding 787*61046927SAndroid Build Coastguard Worker { 788*61046927SAndroid Build Coastguard Worker set_src_reg(& $$, PROGRAM_INPUT, $1); 789*61046927SAndroid Build Coastguard Worker state->prog->info.inputs_read |= BITFIELD64_BIT($$.Base.Index); 790*61046927SAndroid Build Coastguard Worker 791*61046927SAndroid Build Coastguard Worker if (!validate_inputs(& @1, state)) { 792*61046927SAndroid Build Coastguard Worker YYERROR; 793*61046927SAndroid Build Coastguard Worker } 794*61046927SAndroid Build Coastguard Worker } 795*61046927SAndroid Build Coastguard Worker | progParamArray '[' progParamArrayMem ']' 796*61046927SAndroid Build Coastguard Worker { 797*61046927SAndroid Build Coastguard Worker if (! $3.Base.RelAddr 798*61046927SAndroid Build Coastguard Worker && ((unsigned) $3.Base.Index >= $1->param_binding_length)) { 799*61046927SAndroid Build Coastguard Worker yyerror(& @3, state, "out of bounds array access"); 800*61046927SAndroid Build Coastguard Worker YYERROR; 801*61046927SAndroid Build Coastguard Worker } 802*61046927SAndroid Build Coastguard Worker 803*61046927SAndroid Build Coastguard Worker init_src_reg(& $$); 804*61046927SAndroid Build Coastguard Worker $$.Base.File = $1->param_binding_type; 805*61046927SAndroid Build Coastguard Worker 806*61046927SAndroid Build Coastguard Worker if ($3.Base.RelAddr) { 807*61046927SAndroid Build Coastguard Worker state->prog->arb.IndirectRegisterFiles |= (1 << $$.Base.File); 808*61046927SAndroid Build Coastguard Worker $1->param_accessed_indirectly = 1; 809*61046927SAndroid Build Coastguard Worker 810*61046927SAndroid Build Coastguard Worker $$.Base.RelAddr = 1; 811*61046927SAndroid Build Coastguard Worker $$.Base.Index = $3.Base.Index; 812*61046927SAndroid Build Coastguard Worker $$.Symbol = $1; 813*61046927SAndroid Build Coastguard Worker } else { 814*61046927SAndroid Build Coastguard Worker $$.Base.Index = $1->param_binding_begin + $3.Base.Index; 815*61046927SAndroid Build Coastguard Worker } 816*61046927SAndroid Build Coastguard Worker } 817*61046927SAndroid Build Coastguard Worker | paramSingleItemUse 818*61046927SAndroid Build Coastguard Worker { 819*61046927SAndroid Build Coastguard Worker gl_register_file file = ($1.name != NULL) 820*61046927SAndroid Build Coastguard Worker ? $1.param_binding_type 821*61046927SAndroid Build Coastguard Worker : PROGRAM_CONSTANT; 822*61046927SAndroid Build Coastguard Worker set_src_reg_swz(& $$, file, $1.param_binding_begin, 823*61046927SAndroid Build Coastguard Worker $1.param_binding_swizzle); 824*61046927SAndroid Build Coastguard Worker } 825*61046927SAndroid Build Coastguard Worker ; 826*61046927SAndroid Build Coastguard Worker 827*61046927SAndroid Build Coastguard Worker dstReg: resultBinding 828*61046927SAndroid Build Coastguard Worker { 829*61046927SAndroid Build Coastguard Worker set_dst_reg(& $$, PROGRAM_OUTPUT, $1); 830*61046927SAndroid Build Coastguard Worker } 831*61046927SAndroid Build Coastguard Worker | USED_IDENTIFIER /* temporaryReg | vertexResultReg */ 832*61046927SAndroid Build Coastguard Worker { 833*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = (struct asm_symbol *) 834*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_find_symbol(state->st, $1); 835*61046927SAndroid Build Coastguard Worker 836*61046927SAndroid Build Coastguard Worker free($1); 837*61046927SAndroid Build Coastguard Worker 838*61046927SAndroid Build Coastguard Worker if (s == NULL) { 839*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid operand variable"); 840*61046927SAndroid Build Coastguard Worker YYERROR; 841*61046927SAndroid Build Coastguard Worker } else if ((s->type != at_output) && (s->type != at_temp)) { 842*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid operand variable"); 843*61046927SAndroid Build Coastguard Worker YYERROR; 844*61046927SAndroid Build Coastguard Worker } 845*61046927SAndroid Build Coastguard Worker 846*61046927SAndroid Build Coastguard Worker switch (s->type) { 847*61046927SAndroid Build Coastguard Worker case at_temp: 848*61046927SAndroid Build Coastguard Worker set_dst_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding); 849*61046927SAndroid Build Coastguard Worker break; 850*61046927SAndroid Build Coastguard Worker case at_output: 851*61046927SAndroid Build Coastguard Worker set_dst_reg(& $$, PROGRAM_OUTPUT, s->output_binding); 852*61046927SAndroid Build Coastguard Worker break; 853*61046927SAndroid Build Coastguard Worker default: 854*61046927SAndroid Build Coastguard Worker set_dst_reg(& $$, s->param_binding_type, s->param_binding_begin); 855*61046927SAndroid Build Coastguard Worker break; 856*61046927SAndroid Build Coastguard Worker } 857*61046927SAndroid Build Coastguard Worker } 858*61046927SAndroid Build Coastguard Worker ; 859*61046927SAndroid Build Coastguard Worker 860*61046927SAndroid Build Coastguard Worker progParamArray: USED_IDENTIFIER 861*61046927SAndroid Build Coastguard Worker { 862*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = (struct asm_symbol *) 863*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_find_symbol(state->st, $1); 864*61046927SAndroid Build Coastguard Worker 865*61046927SAndroid Build Coastguard Worker free($1); 866*61046927SAndroid Build Coastguard Worker 867*61046927SAndroid Build Coastguard Worker if (s == NULL) { 868*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid operand variable"); 869*61046927SAndroid Build Coastguard Worker YYERROR; 870*61046927SAndroid Build Coastguard Worker } else if ((s->type != at_param) || !s->param_is_array) { 871*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "array access to non-PARAM variable"); 872*61046927SAndroid Build Coastguard Worker YYERROR; 873*61046927SAndroid Build Coastguard Worker } else { 874*61046927SAndroid Build Coastguard Worker $$ = s; 875*61046927SAndroid Build Coastguard Worker } 876*61046927SAndroid Build Coastguard Worker } 877*61046927SAndroid Build Coastguard Worker ; 878*61046927SAndroid Build Coastguard Worker 879*61046927SAndroid Build Coastguard Worker progParamArrayMem: progParamArrayAbs | progParamArrayRel; 880*61046927SAndroid Build Coastguard Worker 881*61046927SAndroid Build Coastguard Worker progParamArrayAbs: INTEGER 882*61046927SAndroid Build Coastguard Worker { 883*61046927SAndroid Build Coastguard Worker init_src_reg(& $$); 884*61046927SAndroid Build Coastguard Worker $$.Base.Index = $1; 885*61046927SAndroid Build Coastguard Worker } 886*61046927SAndroid Build Coastguard Worker ; 887*61046927SAndroid Build Coastguard Worker 888*61046927SAndroid Build Coastguard Worker progParamArrayRel: addrReg addrComponent addrRegRelOffset 889*61046927SAndroid Build Coastguard Worker { 890*61046927SAndroid Build Coastguard Worker /* FINISHME: Add support for multiple address registers. 891*61046927SAndroid Build Coastguard Worker */ 892*61046927SAndroid Build Coastguard Worker /* FINISHME: Add support for 4-component address registers. 893*61046927SAndroid Build Coastguard Worker */ 894*61046927SAndroid Build Coastguard Worker init_src_reg(& $$); 895*61046927SAndroid Build Coastguard Worker $$.Base.RelAddr = 1; 896*61046927SAndroid Build Coastguard Worker $$.Base.Index = $3; 897*61046927SAndroid Build Coastguard Worker } 898*61046927SAndroid Build Coastguard Worker ; 899*61046927SAndroid Build Coastguard Worker 900*61046927SAndroid Build Coastguard Worker addrRegRelOffset: { $$ = 0; } 901*61046927SAndroid Build Coastguard Worker | '+' addrRegPosOffset { $$ = $2; } 902*61046927SAndroid Build Coastguard Worker | '-' addrRegNegOffset { $$ = -$2; } 903*61046927SAndroid Build Coastguard Worker ; 904*61046927SAndroid Build Coastguard Worker 905*61046927SAndroid Build Coastguard Worker addrRegPosOffset: INTEGER 906*61046927SAndroid Build Coastguard Worker { 907*61046927SAndroid Build Coastguard Worker if (($1 < 0) || ($1 > (state->limits->MaxAddressOffset - 1))) { 908*61046927SAndroid Build Coastguard Worker char s[100]; 909*61046927SAndroid Build Coastguard Worker snprintf(s, sizeof(s), 910*61046927SAndroid Build Coastguard Worker "relative address offset too large (%d)", $1); 911*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, s); 912*61046927SAndroid Build Coastguard Worker YYERROR; 913*61046927SAndroid Build Coastguard Worker } else { 914*61046927SAndroid Build Coastguard Worker $$ = $1; 915*61046927SAndroid Build Coastguard Worker } 916*61046927SAndroid Build Coastguard Worker } 917*61046927SAndroid Build Coastguard Worker ; 918*61046927SAndroid Build Coastguard Worker 919*61046927SAndroid Build Coastguard Worker addrRegNegOffset: INTEGER 920*61046927SAndroid Build Coastguard Worker { 921*61046927SAndroid Build Coastguard Worker if (($1 < 0) || ($1 > state->limits->MaxAddressOffset)) { 922*61046927SAndroid Build Coastguard Worker char s[100]; 923*61046927SAndroid Build Coastguard Worker snprintf(s, sizeof(s), 924*61046927SAndroid Build Coastguard Worker "relative address offset too large (%d)", $1); 925*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, s); 926*61046927SAndroid Build Coastguard Worker YYERROR; 927*61046927SAndroid Build Coastguard Worker } else { 928*61046927SAndroid Build Coastguard Worker $$ = $1; 929*61046927SAndroid Build Coastguard Worker } 930*61046927SAndroid Build Coastguard Worker } 931*61046927SAndroid Build Coastguard Worker ; 932*61046927SAndroid Build Coastguard Worker 933*61046927SAndroid Build Coastguard Worker addrReg: USED_IDENTIFIER 934*61046927SAndroid Build Coastguard Worker { 935*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = (struct asm_symbol *) 936*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_find_symbol(state->st, $1); 937*61046927SAndroid Build Coastguard Worker 938*61046927SAndroid Build Coastguard Worker free($1); 939*61046927SAndroid Build Coastguard Worker 940*61046927SAndroid Build Coastguard Worker if (s == NULL) { 941*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid array member"); 942*61046927SAndroid Build Coastguard Worker YYERROR; 943*61046927SAndroid Build Coastguard Worker } else if (s->type != at_address) { 944*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, 945*61046927SAndroid Build Coastguard Worker "invalid variable for indexed array access"); 946*61046927SAndroid Build Coastguard Worker YYERROR; 947*61046927SAndroid Build Coastguard Worker } else { 948*61046927SAndroid Build Coastguard Worker $$ = s; 949*61046927SAndroid Build Coastguard Worker } 950*61046927SAndroid Build Coastguard Worker } 951*61046927SAndroid Build Coastguard Worker ; 952*61046927SAndroid Build Coastguard Worker 953*61046927SAndroid Build Coastguard Worker addrComponent: MASK1 954*61046927SAndroid Build Coastguard Worker { 955*61046927SAndroid Build Coastguard Worker if ($1.mask != WRITEMASK_X) { 956*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid address component selector"); 957*61046927SAndroid Build Coastguard Worker YYERROR; 958*61046927SAndroid Build Coastguard Worker } else { 959*61046927SAndroid Build Coastguard Worker $$ = $1; 960*61046927SAndroid Build Coastguard Worker } 961*61046927SAndroid Build Coastguard Worker } 962*61046927SAndroid Build Coastguard Worker ; 963*61046927SAndroid Build Coastguard Worker 964*61046927SAndroid Build Coastguard Worker addrWriteMask: MASK1 965*61046927SAndroid Build Coastguard Worker { 966*61046927SAndroid Build Coastguard Worker if ($1.mask != WRITEMASK_X) { 967*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, 968*61046927SAndroid Build Coastguard Worker "address register write mask must be \".x\""); 969*61046927SAndroid Build Coastguard Worker YYERROR; 970*61046927SAndroid Build Coastguard Worker } else { 971*61046927SAndroid Build Coastguard Worker $$ = $1; 972*61046927SAndroid Build Coastguard Worker } 973*61046927SAndroid Build Coastguard Worker } 974*61046927SAndroid Build Coastguard Worker ; 975*61046927SAndroid Build Coastguard Worker 976*61046927SAndroid Build Coastguard Worker scalarSuffix: MASK1; 977*61046927SAndroid Build Coastguard Worker 978*61046927SAndroid Build Coastguard Worker swizzleSuffix: MASK1 979*61046927SAndroid Build Coastguard Worker | MASK4 980*61046927SAndroid Build Coastguard Worker | SWIZZLE 981*61046927SAndroid Build Coastguard Worker | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 982*61046927SAndroid Build Coastguard Worker ; 983*61046927SAndroid Build Coastguard Worker 984*61046927SAndroid Build Coastguard Worker optionalMask: MASK4 | MASK3 | MASK2 | MASK1 985*61046927SAndroid Build Coastguard Worker | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 986*61046927SAndroid Build Coastguard Worker ; 987*61046927SAndroid Build Coastguard Worker 988*61046927SAndroid Build Coastguard Worker namingStatement: ATTRIB_statement 989*61046927SAndroid Build Coastguard Worker | PARAM_statement 990*61046927SAndroid Build Coastguard Worker | TEMP_statement 991*61046927SAndroid Build Coastguard Worker | ADDRESS_statement 992*61046927SAndroid Build Coastguard Worker | OUTPUT_statement 993*61046927SAndroid Build Coastguard Worker | ALIAS_statement 994*61046927SAndroid Build Coastguard Worker ; 995*61046927SAndroid Build Coastguard Worker 996*61046927SAndroid Build Coastguard Worker ATTRIB_statement: ATTRIB IDENTIFIER '=' attribBinding 997*61046927SAndroid Build Coastguard Worker { 998*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = 999*61046927SAndroid Build Coastguard Worker declare_variable(state, $2, at_attrib, & @2); 1000*61046927SAndroid Build Coastguard Worker 1001*61046927SAndroid Build Coastguard Worker if (s == NULL) { 1002*61046927SAndroid Build Coastguard Worker free($2); 1003*61046927SAndroid Build Coastguard Worker YYERROR; 1004*61046927SAndroid Build Coastguard Worker } else { 1005*61046927SAndroid Build Coastguard Worker s->attrib_binding = $4; 1006*61046927SAndroid Build Coastguard Worker state->InputsBound |= BITFIELD64_BIT(s->attrib_binding); 1007*61046927SAndroid Build Coastguard Worker 1008*61046927SAndroid Build Coastguard Worker if (!validate_inputs(& @4, state)) { 1009*61046927SAndroid Build Coastguard Worker YYERROR; 1010*61046927SAndroid Build Coastguard Worker } 1011*61046927SAndroid Build Coastguard Worker } 1012*61046927SAndroid Build Coastguard Worker } 1013*61046927SAndroid Build Coastguard Worker ; 1014*61046927SAndroid Build Coastguard Worker 1015*61046927SAndroid Build Coastguard Worker attribBinding: VERTEX vtxAttribItem 1016*61046927SAndroid Build Coastguard Worker { 1017*61046927SAndroid Build Coastguard Worker $$ = $2; 1018*61046927SAndroid Build Coastguard Worker } 1019*61046927SAndroid Build Coastguard Worker | FRAGMENT fragAttribItem 1020*61046927SAndroid Build Coastguard Worker { 1021*61046927SAndroid Build Coastguard Worker $$ = $2; 1022*61046927SAndroid Build Coastguard Worker } 1023*61046927SAndroid Build Coastguard Worker ; 1024*61046927SAndroid Build Coastguard Worker 1025*61046927SAndroid Build Coastguard Worker vtxAttribItem: POSITION 1026*61046927SAndroid Build Coastguard Worker { 1027*61046927SAndroid Build Coastguard Worker $$ = VERT_ATTRIB_POS; 1028*61046927SAndroid Build Coastguard Worker } 1029*61046927SAndroid Build Coastguard Worker | NORMAL 1030*61046927SAndroid Build Coastguard Worker { 1031*61046927SAndroid Build Coastguard Worker $$ = VERT_ATTRIB_NORMAL; 1032*61046927SAndroid Build Coastguard Worker } 1033*61046927SAndroid Build Coastguard Worker | COLOR optColorType 1034*61046927SAndroid Build Coastguard Worker { 1035*61046927SAndroid Build Coastguard Worker $$ = VERT_ATTRIB_COLOR0 + $2; 1036*61046927SAndroid Build Coastguard Worker } 1037*61046927SAndroid Build Coastguard Worker | FOGCOORD 1038*61046927SAndroid Build Coastguard Worker { 1039*61046927SAndroid Build Coastguard Worker $$ = VERT_ATTRIB_FOG; 1040*61046927SAndroid Build Coastguard Worker } 1041*61046927SAndroid Build Coastguard Worker | TEXCOORD optTexCoordUnitNum 1042*61046927SAndroid Build Coastguard Worker { 1043*61046927SAndroid Build Coastguard Worker $$ = VERT_ATTRIB_TEX0 + $2; 1044*61046927SAndroid Build Coastguard Worker } 1045*61046927SAndroid Build Coastguard Worker | MATRIXINDEX '[' vtxWeightNum ']' 1046*61046927SAndroid Build Coastguard Worker { 1047*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "GL_ARB_matrix_palette not supported"); 1048*61046927SAndroid Build Coastguard Worker YYERROR; 1049*61046927SAndroid Build Coastguard Worker } 1050*61046927SAndroid Build Coastguard Worker | VTXATTRIB '[' vtxAttribNum ']' 1051*61046927SAndroid Build Coastguard Worker { 1052*61046927SAndroid Build Coastguard Worker $$ = VERT_ATTRIB_GENERIC0 + $3; 1053*61046927SAndroid Build Coastguard Worker } 1054*61046927SAndroid Build Coastguard Worker ; 1055*61046927SAndroid Build Coastguard Worker 1056*61046927SAndroid Build Coastguard Worker vtxAttribNum: INTEGER 1057*61046927SAndroid Build Coastguard Worker { 1058*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->limits->MaxAttribs) { 1059*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid vertex attribute reference"); 1060*61046927SAndroid Build Coastguard Worker YYERROR; 1061*61046927SAndroid Build Coastguard Worker } 1062*61046927SAndroid Build Coastguard Worker 1063*61046927SAndroid Build Coastguard Worker $$ = $1; 1064*61046927SAndroid Build Coastguard Worker } 1065*61046927SAndroid Build Coastguard Worker ; 1066*61046927SAndroid Build Coastguard Worker 1067*61046927SAndroid Build Coastguard Worker vtxWeightNum: INTEGER; 1068*61046927SAndroid Build Coastguard Worker 1069*61046927SAndroid Build Coastguard Worker fragAttribItem: POSITION 1070*61046927SAndroid Build Coastguard Worker { 1071*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_POS; 1072*61046927SAndroid Build Coastguard Worker } 1073*61046927SAndroid Build Coastguard Worker | COLOR optColorType 1074*61046927SAndroid Build Coastguard Worker { 1075*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_COL0 + $2; 1076*61046927SAndroid Build Coastguard Worker } 1077*61046927SAndroid Build Coastguard Worker | FOGCOORD 1078*61046927SAndroid Build Coastguard Worker { 1079*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_FOGC; 1080*61046927SAndroid Build Coastguard Worker } 1081*61046927SAndroid Build Coastguard Worker | TEXCOORD optTexCoordUnitNum 1082*61046927SAndroid Build Coastguard Worker { 1083*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_TEX0 + $2; 1084*61046927SAndroid Build Coastguard Worker } 1085*61046927SAndroid Build Coastguard Worker ; 1086*61046927SAndroid Build Coastguard Worker 1087*61046927SAndroid Build Coastguard Worker PARAM_statement: PARAM_singleStmt | PARAM_multipleStmt; 1088*61046927SAndroid Build Coastguard Worker 1089*61046927SAndroid Build Coastguard Worker PARAM_singleStmt: PARAM IDENTIFIER paramSingleInit 1090*61046927SAndroid Build Coastguard Worker { 1091*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = 1092*61046927SAndroid Build Coastguard Worker declare_variable(state, $2, at_param, & @2); 1093*61046927SAndroid Build Coastguard Worker 1094*61046927SAndroid Build Coastguard Worker if (s == NULL) { 1095*61046927SAndroid Build Coastguard Worker free($2); 1096*61046927SAndroid Build Coastguard Worker YYERROR; 1097*61046927SAndroid Build Coastguard Worker } else { 1098*61046927SAndroid Build Coastguard Worker s->param_binding_type = $3.param_binding_type; 1099*61046927SAndroid Build Coastguard Worker s->param_binding_begin = $3.param_binding_begin; 1100*61046927SAndroid Build Coastguard Worker s->param_binding_length = $3.param_binding_length; 1101*61046927SAndroid Build Coastguard Worker s->param_binding_swizzle = $3.param_binding_swizzle; 1102*61046927SAndroid Build Coastguard Worker s->param_is_array = 0; 1103*61046927SAndroid Build Coastguard Worker } 1104*61046927SAndroid Build Coastguard Worker } 1105*61046927SAndroid Build Coastguard Worker ; 1106*61046927SAndroid Build Coastguard Worker 1107*61046927SAndroid Build Coastguard Worker PARAM_multipleStmt: PARAM IDENTIFIER '[' optArraySize ']' paramMultipleInit 1108*61046927SAndroid Build Coastguard Worker { 1109*61046927SAndroid Build Coastguard Worker if (($4 != 0) && ((unsigned) $4 != $6.param_binding_length)) { 1110*61046927SAndroid Build Coastguard Worker free($2); 1111*61046927SAndroid Build Coastguard Worker yyerror(& @4, state, 1112*61046927SAndroid Build Coastguard Worker "parameter array size and number of bindings must match"); 1113*61046927SAndroid Build Coastguard Worker YYERROR; 1114*61046927SAndroid Build Coastguard Worker } else { 1115*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = 1116*61046927SAndroid Build Coastguard Worker declare_variable(state, $2, $6.type, & @2); 1117*61046927SAndroid Build Coastguard Worker 1118*61046927SAndroid Build Coastguard Worker if (s == NULL) { 1119*61046927SAndroid Build Coastguard Worker free($2); 1120*61046927SAndroid Build Coastguard Worker YYERROR; 1121*61046927SAndroid Build Coastguard Worker } else { 1122*61046927SAndroid Build Coastguard Worker s->param_binding_type = $6.param_binding_type; 1123*61046927SAndroid Build Coastguard Worker s->param_binding_begin = $6.param_binding_begin; 1124*61046927SAndroid Build Coastguard Worker s->param_binding_length = $6.param_binding_length; 1125*61046927SAndroid Build Coastguard Worker s->param_binding_swizzle = SWIZZLE_XYZW; 1126*61046927SAndroid Build Coastguard Worker s->param_is_array = 1; 1127*61046927SAndroid Build Coastguard Worker } 1128*61046927SAndroid Build Coastguard Worker } 1129*61046927SAndroid Build Coastguard Worker } 1130*61046927SAndroid Build Coastguard Worker ; 1131*61046927SAndroid Build Coastguard Worker 1132*61046927SAndroid Build Coastguard Worker optArraySize: 1133*61046927SAndroid Build Coastguard Worker { 1134*61046927SAndroid Build Coastguard Worker $$ = 0; 1135*61046927SAndroid Build Coastguard Worker } 1136*61046927SAndroid Build Coastguard Worker | INTEGER 1137*61046927SAndroid Build Coastguard Worker { 1138*61046927SAndroid Build Coastguard Worker if (($1 < 1) || ((unsigned) $1 > state->limits->MaxParameters)) { 1139*61046927SAndroid Build Coastguard Worker char msg[100]; 1140*61046927SAndroid Build Coastguard Worker snprintf(msg, sizeof(msg), 1141*61046927SAndroid Build Coastguard Worker "invalid parameter array size (size=%d max=%u)", 1142*61046927SAndroid Build Coastguard Worker $1, state->limits->MaxParameters); 1143*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, msg); 1144*61046927SAndroid Build Coastguard Worker YYERROR; 1145*61046927SAndroid Build Coastguard Worker } else { 1146*61046927SAndroid Build Coastguard Worker $$ = $1; 1147*61046927SAndroid Build Coastguard Worker } 1148*61046927SAndroid Build Coastguard Worker } 1149*61046927SAndroid Build Coastguard Worker ; 1150*61046927SAndroid Build Coastguard Worker 1151*61046927SAndroid Build Coastguard Worker paramSingleInit: '=' paramSingleItemDecl 1152*61046927SAndroid Build Coastguard Worker { 1153*61046927SAndroid Build Coastguard Worker $$ = $2; 1154*61046927SAndroid Build Coastguard Worker } 1155*61046927SAndroid Build Coastguard Worker ; 1156*61046927SAndroid Build Coastguard Worker 1157*61046927SAndroid Build Coastguard Worker paramMultipleInit: '=' '{' paramMultInitList '}' 1158*61046927SAndroid Build Coastguard Worker { 1159*61046927SAndroid Build Coastguard Worker $$ = $3; 1160*61046927SAndroid Build Coastguard Worker } 1161*61046927SAndroid Build Coastguard Worker ; 1162*61046927SAndroid Build Coastguard Worker 1163*61046927SAndroid Build Coastguard Worker paramMultInitList: paramMultipleItem 1164*61046927SAndroid Build Coastguard Worker | paramMultInitList ',' paramMultipleItem 1165*61046927SAndroid Build Coastguard Worker { 1166*61046927SAndroid Build Coastguard Worker $1.param_binding_length += $3.param_binding_length; 1167*61046927SAndroid Build Coastguard Worker $$ = $1; 1168*61046927SAndroid Build Coastguard Worker } 1169*61046927SAndroid Build Coastguard Worker ; 1170*61046927SAndroid Build Coastguard Worker 1171*61046927SAndroid Build Coastguard Worker paramSingleItemDecl: stateSingleItem 1172*61046927SAndroid Build Coastguard Worker { 1173*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1174*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1175*61046927SAndroid Build Coastguard Worker initialize_symbol_from_state(state->prog, & $$, $1); 1176*61046927SAndroid Build Coastguard Worker } 1177*61046927SAndroid Build Coastguard Worker | programSingleItem 1178*61046927SAndroid Build Coastguard Worker { 1179*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1180*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1181*61046927SAndroid Build Coastguard Worker initialize_symbol_from_param(state->prog, & $$, $1); 1182*61046927SAndroid Build Coastguard Worker } 1183*61046927SAndroid Build Coastguard Worker | paramConstDecl 1184*61046927SAndroid Build Coastguard Worker { 1185*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1186*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1187*61046927SAndroid Build Coastguard Worker initialize_symbol_from_const(state->prog, & $$, & $1, GL_TRUE); 1188*61046927SAndroid Build Coastguard Worker } 1189*61046927SAndroid Build Coastguard Worker ; 1190*61046927SAndroid Build Coastguard Worker 1191*61046927SAndroid Build Coastguard Worker paramSingleItemUse: stateSingleItem 1192*61046927SAndroid Build Coastguard Worker { 1193*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1194*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1195*61046927SAndroid Build Coastguard Worker initialize_symbol_from_state(state->prog, & $$, $1); 1196*61046927SAndroid Build Coastguard Worker } 1197*61046927SAndroid Build Coastguard Worker | programSingleItem 1198*61046927SAndroid Build Coastguard Worker { 1199*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1200*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1201*61046927SAndroid Build Coastguard Worker initialize_symbol_from_param(state->prog, & $$, $1); 1202*61046927SAndroid Build Coastguard Worker } 1203*61046927SAndroid Build Coastguard Worker | paramConstUse 1204*61046927SAndroid Build Coastguard Worker { 1205*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1206*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1207*61046927SAndroid Build Coastguard Worker initialize_symbol_from_const(state->prog, & $$, & $1, GL_TRUE); 1208*61046927SAndroid Build Coastguard Worker } 1209*61046927SAndroid Build Coastguard Worker ; 1210*61046927SAndroid Build Coastguard Worker 1211*61046927SAndroid Build Coastguard Worker paramMultipleItem: stateMultipleItem 1212*61046927SAndroid Build Coastguard Worker { 1213*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1214*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1215*61046927SAndroid Build Coastguard Worker initialize_symbol_from_state(state->prog, & $$, $1); 1216*61046927SAndroid Build Coastguard Worker } 1217*61046927SAndroid Build Coastguard Worker | programMultipleItem 1218*61046927SAndroid Build Coastguard Worker { 1219*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1220*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1221*61046927SAndroid Build Coastguard Worker initialize_symbol_from_param(state->prog, & $$, $1); 1222*61046927SAndroid Build Coastguard Worker } 1223*61046927SAndroid Build Coastguard Worker | paramConstDecl 1224*61046927SAndroid Build Coastguard Worker { 1225*61046927SAndroid Build Coastguard Worker memset(& $$, 0, sizeof($$)); 1226*61046927SAndroid Build Coastguard Worker $$.param_binding_begin = ~0; 1227*61046927SAndroid Build Coastguard Worker initialize_symbol_from_const(state->prog, & $$, & $1, GL_FALSE); 1228*61046927SAndroid Build Coastguard Worker } 1229*61046927SAndroid Build Coastguard Worker ; 1230*61046927SAndroid Build Coastguard Worker 1231*61046927SAndroid Build Coastguard Worker stateMultipleItem: stateSingleItem { memcpy($$, $1, sizeof($$)); } 1232*61046927SAndroid Build Coastguard Worker | STATE stateMatrixRows { memcpy($$, $2, sizeof($$)); } 1233*61046927SAndroid Build Coastguard Worker ; 1234*61046927SAndroid Build Coastguard Worker 1235*61046927SAndroid Build Coastguard Worker stateSingleItem: STATE stateMaterialItem { memcpy($$, $2, sizeof($$)); } 1236*61046927SAndroid Build Coastguard Worker | STATE stateLightItem { memcpy($$, $2, sizeof($$)); } 1237*61046927SAndroid Build Coastguard Worker | STATE stateLightModelItem { memcpy($$, $2, sizeof($$)); } 1238*61046927SAndroid Build Coastguard Worker | STATE stateLightProdItem { memcpy($$, $2, sizeof($$)); } 1239*61046927SAndroid Build Coastguard Worker | STATE stateTexGenItem { memcpy($$, $2, sizeof($$)); } 1240*61046927SAndroid Build Coastguard Worker | STATE stateTexEnvItem { memcpy($$, $2, sizeof($$)); } 1241*61046927SAndroid Build Coastguard Worker | STATE stateFogItem { memcpy($$, $2, sizeof($$)); } 1242*61046927SAndroid Build Coastguard Worker | STATE stateClipPlaneItem { memcpy($$, $2, sizeof($$)); } 1243*61046927SAndroid Build Coastguard Worker | STATE statePointItem { memcpy($$, $2, sizeof($$)); } 1244*61046927SAndroid Build Coastguard Worker | STATE stateMatrixRow { memcpy($$, $2, sizeof($$)); } 1245*61046927SAndroid Build Coastguard Worker | STATE stateDepthItem { memcpy($$, $2, sizeof($$)); } 1246*61046927SAndroid Build Coastguard Worker ; 1247*61046927SAndroid Build Coastguard Worker 1248*61046927SAndroid Build Coastguard Worker stateMaterialItem: MATERIAL optFaceType stateMatProperty 1249*61046927SAndroid Build Coastguard Worker { 1250*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1251*61046927SAndroid Build Coastguard Worker $$[0] = STATE_MATERIAL; 1252*61046927SAndroid Build Coastguard Worker $$[1] = $3 + $2; 1253*61046927SAndroid Build Coastguard Worker $$[2] = 0; 1254*61046927SAndroid Build Coastguard Worker } 1255*61046927SAndroid Build Coastguard Worker ; 1256*61046927SAndroid Build Coastguard Worker 1257*61046927SAndroid Build Coastguard Worker stateMatProperty: ambDiffSpecPropertyMaterial 1258*61046927SAndroid Build Coastguard Worker { 1259*61046927SAndroid Build Coastguard Worker $$ = $1; 1260*61046927SAndroid Build Coastguard Worker } 1261*61046927SAndroid Build Coastguard Worker | EMISSION 1262*61046927SAndroid Build Coastguard Worker { 1263*61046927SAndroid Build Coastguard Worker $$ = MAT_ATTRIB_FRONT_EMISSION; 1264*61046927SAndroid Build Coastguard Worker } 1265*61046927SAndroid Build Coastguard Worker | SHININESS 1266*61046927SAndroid Build Coastguard Worker { 1267*61046927SAndroid Build Coastguard Worker $$ = MAT_ATTRIB_FRONT_SHININESS; 1268*61046927SAndroid Build Coastguard Worker } 1269*61046927SAndroid Build Coastguard Worker ; 1270*61046927SAndroid Build Coastguard Worker 1271*61046927SAndroid Build Coastguard Worker stateLightItem: LIGHT '[' stateLightNumber ']' stateLightProperty 1272*61046927SAndroid Build Coastguard Worker { 1273*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1274*61046927SAndroid Build Coastguard Worker $$[0] = STATE_LIGHT; 1275*61046927SAndroid Build Coastguard Worker $$[1] = $3; 1276*61046927SAndroid Build Coastguard Worker $$[2] = $5; 1277*61046927SAndroid Build Coastguard Worker } 1278*61046927SAndroid Build Coastguard Worker ; 1279*61046927SAndroid Build Coastguard Worker 1280*61046927SAndroid Build Coastguard Worker stateLightProperty: ambDiffSpecPropertyLight 1281*61046927SAndroid Build Coastguard Worker { 1282*61046927SAndroid Build Coastguard Worker $$ = $1; 1283*61046927SAndroid Build Coastguard Worker } 1284*61046927SAndroid Build Coastguard Worker | POSITION 1285*61046927SAndroid Build Coastguard Worker { 1286*61046927SAndroid Build Coastguard Worker $$ = STATE_POSITION; 1287*61046927SAndroid Build Coastguard Worker } 1288*61046927SAndroid Build Coastguard Worker | ATTENUATION 1289*61046927SAndroid Build Coastguard Worker { 1290*61046927SAndroid Build Coastguard Worker $$ = STATE_ATTENUATION; 1291*61046927SAndroid Build Coastguard Worker } 1292*61046927SAndroid Build Coastguard Worker | SPOT stateSpotProperty 1293*61046927SAndroid Build Coastguard Worker { 1294*61046927SAndroid Build Coastguard Worker $$ = $2; 1295*61046927SAndroid Build Coastguard Worker } 1296*61046927SAndroid Build Coastguard Worker | HALF 1297*61046927SAndroid Build Coastguard Worker { 1298*61046927SAndroid Build Coastguard Worker $$ = STATE_HALF_VECTOR; 1299*61046927SAndroid Build Coastguard Worker } 1300*61046927SAndroid Build Coastguard Worker ; 1301*61046927SAndroid Build Coastguard Worker 1302*61046927SAndroid Build Coastguard Worker stateSpotProperty: DIRECTION 1303*61046927SAndroid Build Coastguard Worker { 1304*61046927SAndroid Build Coastguard Worker $$ = STATE_SPOT_DIRECTION; 1305*61046927SAndroid Build Coastguard Worker } 1306*61046927SAndroid Build Coastguard Worker ; 1307*61046927SAndroid Build Coastguard Worker 1308*61046927SAndroid Build Coastguard Worker stateLightModelItem: LIGHTMODEL stateLModProperty 1309*61046927SAndroid Build Coastguard Worker { 1310*61046927SAndroid Build Coastguard Worker $$[0] = $2[0]; 1311*61046927SAndroid Build Coastguard Worker $$[1] = $2[1]; 1312*61046927SAndroid Build Coastguard Worker } 1313*61046927SAndroid Build Coastguard Worker ; 1314*61046927SAndroid Build Coastguard Worker 1315*61046927SAndroid Build Coastguard Worker stateLModProperty: AMBIENT 1316*61046927SAndroid Build Coastguard Worker { 1317*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1318*61046927SAndroid Build Coastguard Worker $$[0] = STATE_LIGHTMODEL_AMBIENT; 1319*61046927SAndroid Build Coastguard Worker } 1320*61046927SAndroid Build Coastguard Worker | optFaceType SCENECOLOR 1321*61046927SAndroid Build Coastguard Worker { 1322*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1323*61046927SAndroid Build Coastguard Worker $$[0] = STATE_LIGHTMODEL_SCENECOLOR; 1324*61046927SAndroid Build Coastguard Worker $$[1] = $1; 1325*61046927SAndroid Build Coastguard Worker } 1326*61046927SAndroid Build Coastguard Worker ; 1327*61046927SAndroid Build Coastguard Worker 1328*61046927SAndroid Build Coastguard Worker stateLightProdItem: LIGHTPROD '[' stateLightNumber ']' optFaceType stateLProdProperty 1329*61046927SAndroid Build Coastguard Worker { 1330*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1331*61046927SAndroid Build Coastguard Worker $$[0] = STATE_LIGHTPROD; 1332*61046927SAndroid Build Coastguard Worker $$[1] = $3; 1333*61046927SAndroid Build Coastguard Worker $$[2] = $6 + $5; 1334*61046927SAndroid Build Coastguard Worker $$[3] = 0; 1335*61046927SAndroid Build Coastguard Worker } 1336*61046927SAndroid Build Coastguard Worker ; 1337*61046927SAndroid Build Coastguard Worker 1338*61046927SAndroid Build Coastguard Worker stateLProdProperty: ambDiffSpecPropertyMaterial; 1339*61046927SAndroid Build Coastguard Worker 1340*61046927SAndroid Build Coastguard Worker stateTexEnvItem: TEXENV optLegacyTexUnitNum stateTexEnvProperty 1341*61046927SAndroid Build Coastguard Worker { 1342*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1343*61046927SAndroid Build Coastguard Worker $$[0] = $3; 1344*61046927SAndroid Build Coastguard Worker $$[1] = $2; 1345*61046927SAndroid Build Coastguard Worker } 1346*61046927SAndroid Build Coastguard Worker ; 1347*61046927SAndroid Build Coastguard Worker 1348*61046927SAndroid Build Coastguard Worker stateTexEnvProperty: COLOR 1349*61046927SAndroid Build Coastguard Worker { 1350*61046927SAndroid Build Coastguard Worker $$ = STATE_TEXENV_COLOR; 1351*61046927SAndroid Build Coastguard Worker } 1352*61046927SAndroid Build Coastguard Worker ; 1353*61046927SAndroid Build Coastguard Worker 1354*61046927SAndroid Build Coastguard Worker ambDiffSpecPropertyMaterial: AMBIENT 1355*61046927SAndroid Build Coastguard Worker { 1356*61046927SAndroid Build Coastguard Worker $$ = MAT_ATTRIB_FRONT_AMBIENT; 1357*61046927SAndroid Build Coastguard Worker } 1358*61046927SAndroid Build Coastguard Worker | DIFFUSE 1359*61046927SAndroid Build Coastguard Worker { 1360*61046927SAndroid Build Coastguard Worker $$ = MAT_ATTRIB_FRONT_DIFFUSE; 1361*61046927SAndroid Build Coastguard Worker } 1362*61046927SAndroid Build Coastguard Worker | SPECULAR 1363*61046927SAndroid Build Coastguard Worker { 1364*61046927SAndroid Build Coastguard Worker $$ = MAT_ATTRIB_FRONT_SPECULAR; 1365*61046927SAndroid Build Coastguard Worker } 1366*61046927SAndroid Build Coastguard Worker ; 1367*61046927SAndroid Build Coastguard Worker 1368*61046927SAndroid Build Coastguard Worker ambDiffSpecPropertyLight: AMBIENT 1369*61046927SAndroid Build Coastguard Worker { 1370*61046927SAndroid Build Coastguard Worker $$ = STATE_AMBIENT; 1371*61046927SAndroid Build Coastguard Worker } 1372*61046927SAndroid Build Coastguard Worker | DIFFUSE 1373*61046927SAndroid Build Coastguard Worker { 1374*61046927SAndroid Build Coastguard Worker $$ = STATE_DIFFUSE; 1375*61046927SAndroid Build Coastguard Worker } 1376*61046927SAndroid Build Coastguard Worker | SPECULAR 1377*61046927SAndroid Build Coastguard Worker { 1378*61046927SAndroid Build Coastguard Worker $$ = STATE_SPECULAR; 1379*61046927SAndroid Build Coastguard Worker } 1380*61046927SAndroid Build Coastguard Worker ; 1381*61046927SAndroid Build Coastguard Worker 1382*61046927SAndroid Build Coastguard Worker stateLightNumber: INTEGER 1383*61046927SAndroid Build Coastguard Worker { 1384*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->MaxLights) { 1385*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid light selector"); 1386*61046927SAndroid Build Coastguard Worker YYERROR; 1387*61046927SAndroid Build Coastguard Worker } 1388*61046927SAndroid Build Coastguard Worker 1389*61046927SAndroid Build Coastguard Worker $$ = $1; 1390*61046927SAndroid Build Coastguard Worker } 1391*61046927SAndroid Build Coastguard Worker ; 1392*61046927SAndroid Build Coastguard Worker 1393*61046927SAndroid Build Coastguard Worker stateTexGenItem: TEXGEN optTexCoordUnitNum stateTexGenType stateTexGenCoord 1394*61046927SAndroid Build Coastguard Worker { 1395*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1396*61046927SAndroid Build Coastguard Worker $$[0] = STATE_TEXGEN; 1397*61046927SAndroid Build Coastguard Worker $$[1] = $2; 1398*61046927SAndroid Build Coastguard Worker $$[2] = $3 + $4; 1399*61046927SAndroid Build Coastguard Worker } 1400*61046927SAndroid Build Coastguard Worker ; 1401*61046927SAndroid Build Coastguard Worker 1402*61046927SAndroid Build Coastguard Worker stateTexGenType: EYE 1403*61046927SAndroid Build Coastguard Worker { 1404*61046927SAndroid Build Coastguard Worker $$ = STATE_TEXGEN_EYE_S; 1405*61046927SAndroid Build Coastguard Worker } 1406*61046927SAndroid Build Coastguard Worker | OBJECT 1407*61046927SAndroid Build Coastguard Worker { 1408*61046927SAndroid Build Coastguard Worker $$ = STATE_TEXGEN_OBJECT_S; 1409*61046927SAndroid Build Coastguard Worker } 1410*61046927SAndroid Build Coastguard Worker ; 1411*61046927SAndroid Build Coastguard Worker stateTexGenCoord: TEXGEN_S 1412*61046927SAndroid Build Coastguard Worker { 1413*61046927SAndroid Build Coastguard Worker $$ = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S; 1414*61046927SAndroid Build Coastguard Worker } 1415*61046927SAndroid Build Coastguard Worker | TEXGEN_T 1416*61046927SAndroid Build Coastguard Worker { 1417*61046927SAndroid Build Coastguard Worker $$ = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S; 1418*61046927SAndroid Build Coastguard Worker } 1419*61046927SAndroid Build Coastguard Worker | TEXGEN_R 1420*61046927SAndroid Build Coastguard Worker { 1421*61046927SAndroid Build Coastguard Worker $$ = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S; 1422*61046927SAndroid Build Coastguard Worker } 1423*61046927SAndroid Build Coastguard Worker | TEXGEN_Q 1424*61046927SAndroid Build Coastguard Worker { 1425*61046927SAndroid Build Coastguard Worker $$ = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S; 1426*61046927SAndroid Build Coastguard Worker } 1427*61046927SAndroid Build Coastguard Worker ; 1428*61046927SAndroid Build Coastguard Worker 1429*61046927SAndroid Build Coastguard Worker stateFogItem: FOG stateFogProperty 1430*61046927SAndroid Build Coastguard Worker { 1431*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1432*61046927SAndroid Build Coastguard Worker $$[0] = $2; 1433*61046927SAndroid Build Coastguard Worker } 1434*61046927SAndroid Build Coastguard Worker ; 1435*61046927SAndroid Build Coastguard Worker 1436*61046927SAndroid Build Coastguard Worker stateFogProperty: COLOR 1437*61046927SAndroid Build Coastguard Worker { 1438*61046927SAndroid Build Coastguard Worker $$ = STATE_FOG_COLOR; 1439*61046927SAndroid Build Coastguard Worker } 1440*61046927SAndroid Build Coastguard Worker | PARAMS 1441*61046927SAndroid Build Coastguard Worker { 1442*61046927SAndroid Build Coastguard Worker $$ = STATE_FOG_PARAMS; 1443*61046927SAndroid Build Coastguard Worker } 1444*61046927SAndroid Build Coastguard Worker ; 1445*61046927SAndroid Build Coastguard Worker 1446*61046927SAndroid Build Coastguard Worker stateClipPlaneItem: CLIP '[' stateClipPlaneNum ']' PLANE 1447*61046927SAndroid Build Coastguard Worker { 1448*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1449*61046927SAndroid Build Coastguard Worker $$[0] = STATE_CLIPPLANE; 1450*61046927SAndroid Build Coastguard Worker $$[1] = $3; 1451*61046927SAndroid Build Coastguard Worker } 1452*61046927SAndroid Build Coastguard Worker ; 1453*61046927SAndroid Build Coastguard Worker 1454*61046927SAndroid Build Coastguard Worker stateClipPlaneNum: INTEGER 1455*61046927SAndroid Build Coastguard Worker { 1456*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->MaxClipPlanes) { 1457*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid clip plane selector"); 1458*61046927SAndroid Build Coastguard Worker YYERROR; 1459*61046927SAndroid Build Coastguard Worker } 1460*61046927SAndroid Build Coastguard Worker 1461*61046927SAndroid Build Coastguard Worker $$ = $1; 1462*61046927SAndroid Build Coastguard Worker } 1463*61046927SAndroid Build Coastguard Worker ; 1464*61046927SAndroid Build Coastguard Worker 1465*61046927SAndroid Build Coastguard Worker statePointItem: POINT_TOK statePointProperty 1466*61046927SAndroid Build Coastguard Worker { 1467*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1468*61046927SAndroid Build Coastguard Worker $$[0] = $2; 1469*61046927SAndroid Build Coastguard Worker } 1470*61046927SAndroid Build Coastguard Worker ; 1471*61046927SAndroid Build Coastguard Worker 1472*61046927SAndroid Build Coastguard Worker statePointProperty: SIZE_TOK 1473*61046927SAndroid Build Coastguard Worker { 1474*61046927SAndroid Build Coastguard Worker $$ = STATE_POINT_SIZE; 1475*61046927SAndroid Build Coastguard Worker } 1476*61046927SAndroid Build Coastguard Worker | ATTENUATION 1477*61046927SAndroid Build Coastguard Worker { 1478*61046927SAndroid Build Coastguard Worker $$ = STATE_POINT_ATTENUATION; 1479*61046927SAndroid Build Coastguard Worker } 1480*61046927SAndroid Build Coastguard Worker ; 1481*61046927SAndroid Build Coastguard Worker 1482*61046927SAndroid Build Coastguard Worker stateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']' 1483*61046927SAndroid Build Coastguard Worker { 1484*61046927SAndroid Build Coastguard Worker $$[0] = $1[0] + $1[2]; 1485*61046927SAndroid Build Coastguard Worker $$[1] = $1[1]; 1486*61046927SAndroid Build Coastguard Worker $$[2] = $4; 1487*61046927SAndroid Build Coastguard Worker $$[3] = $4; 1488*61046927SAndroid Build Coastguard Worker } 1489*61046927SAndroid Build Coastguard Worker ; 1490*61046927SAndroid Build Coastguard Worker 1491*61046927SAndroid Build Coastguard Worker stateMatrixRows: stateMatrixItem optMatrixRows 1492*61046927SAndroid Build Coastguard Worker { 1493*61046927SAndroid Build Coastguard Worker $$[0] = $1[0] + $1[2]; 1494*61046927SAndroid Build Coastguard Worker $$[1] = $1[1]; 1495*61046927SAndroid Build Coastguard Worker $$[2] = $2[2]; 1496*61046927SAndroid Build Coastguard Worker $$[3] = $2[3]; 1497*61046927SAndroid Build Coastguard Worker } 1498*61046927SAndroid Build Coastguard Worker ; 1499*61046927SAndroid Build Coastguard Worker 1500*61046927SAndroid Build Coastguard Worker optMatrixRows: 1501*61046927SAndroid Build Coastguard Worker { 1502*61046927SAndroid Build Coastguard Worker $$[2] = 0; 1503*61046927SAndroid Build Coastguard Worker $$[3] = 3; 1504*61046927SAndroid Build Coastguard Worker } 1505*61046927SAndroid Build Coastguard Worker | ROW '[' stateMatrixRowNum DOT_DOT stateMatrixRowNum ']' 1506*61046927SAndroid Build Coastguard Worker { 1507*61046927SAndroid Build Coastguard Worker /* It seems logical that the matrix row range specifier would have 1508*61046927SAndroid Build Coastguard Worker * to specify a range or more than one row (i.e., $5 > $3). 1509*61046927SAndroid Build Coastguard Worker * However, the ARB_vertex_program spec says "a program will fail 1510*61046927SAndroid Build Coastguard Worker * to load if <a> is greater than <b>." This means that $3 == $5 1511*61046927SAndroid Build Coastguard Worker * is valid. 1512*61046927SAndroid Build Coastguard Worker */ 1513*61046927SAndroid Build Coastguard Worker if ($3 > $5) { 1514*61046927SAndroid Build Coastguard Worker yyerror(& @3, state, "invalid matrix row range"); 1515*61046927SAndroid Build Coastguard Worker YYERROR; 1516*61046927SAndroid Build Coastguard Worker } 1517*61046927SAndroid Build Coastguard Worker 1518*61046927SAndroid Build Coastguard Worker $$[2] = $3; 1519*61046927SAndroid Build Coastguard Worker $$[3] = $5; 1520*61046927SAndroid Build Coastguard Worker } 1521*61046927SAndroid Build Coastguard Worker ; 1522*61046927SAndroid Build Coastguard Worker 1523*61046927SAndroid Build Coastguard Worker stateMatrixItem: MATRIX stateMatrixName stateOptMatModifier 1524*61046927SAndroid Build Coastguard Worker { 1525*61046927SAndroid Build Coastguard Worker $$[0] = $2[0]; 1526*61046927SAndroid Build Coastguard Worker $$[1] = $2[1]; 1527*61046927SAndroid Build Coastguard Worker $$[2] = $3; 1528*61046927SAndroid Build Coastguard Worker } 1529*61046927SAndroid Build Coastguard Worker ; 1530*61046927SAndroid Build Coastguard Worker 1531*61046927SAndroid Build Coastguard Worker stateOptMatModifier: 1532*61046927SAndroid Build Coastguard Worker { 1533*61046927SAndroid Build Coastguard Worker $$ = STATE_MATRIX_NO_MODIFIER; 1534*61046927SAndroid Build Coastguard Worker } 1535*61046927SAndroid Build Coastguard Worker | stateMatModifier 1536*61046927SAndroid Build Coastguard Worker { 1537*61046927SAndroid Build Coastguard Worker $$ = $1; 1538*61046927SAndroid Build Coastguard Worker } 1539*61046927SAndroid Build Coastguard Worker ; 1540*61046927SAndroid Build Coastguard Worker 1541*61046927SAndroid Build Coastguard Worker stateMatModifier: INVERSE 1542*61046927SAndroid Build Coastguard Worker { 1543*61046927SAndroid Build Coastguard Worker $$ = STATE_MATRIX_INVERSE; 1544*61046927SAndroid Build Coastguard Worker } 1545*61046927SAndroid Build Coastguard Worker | TRANSPOSE 1546*61046927SAndroid Build Coastguard Worker { 1547*61046927SAndroid Build Coastguard Worker $$ = STATE_MATRIX_TRANSPOSE; 1548*61046927SAndroid Build Coastguard Worker } 1549*61046927SAndroid Build Coastguard Worker | INVTRANS 1550*61046927SAndroid Build Coastguard Worker { 1551*61046927SAndroid Build Coastguard Worker $$ = STATE_MATRIX_INVTRANS; 1552*61046927SAndroid Build Coastguard Worker } 1553*61046927SAndroid Build Coastguard Worker ; 1554*61046927SAndroid Build Coastguard Worker 1555*61046927SAndroid Build Coastguard Worker stateMatrixRowNum: INTEGER 1556*61046927SAndroid Build Coastguard Worker { 1557*61046927SAndroid Build Coastguard Worker if ($1 > 3) { 1558*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid matrix row reference"); 1559*61046927SAndroid Build Coastguard Worker YYERROR; 1560*61046927SAndroid Build Coastguard Worker } 1561*61046927SAndroid Build Coastguard Worker 1562*61046927SAndroid Build Coastguard Worker $$ = $1; 1563*61046927SAndroid Build Coastguard Worker } 1564*61046927SAndroid Build Coastguard Worker ; 1565*61046927SAndroid Build Coastguard Worker 1566*61046927SAndroid Build Coastguard Worker stateMatrixName: MODELVIEW stateOptModMatNum 1567*61046927SAndroid Build Coastguard Worker { 1568*61046927SAndroid Build Coastguard Worker $$[0] = STATE_MODELVIEW_MATRIX; 1569*61046927SAndroid Build Coastguard Worker $$[1] = $2; 1570*61046927SAndroid Build Coastguard Worker } 1571*61046927SAndroid Build Coastguard Worker | PROJECTION 1572*61046927SAndroid Build Coastguard Worker { 1573*61046927SAndroid Build Coastguard Worker $$[0] = STATE_PROJECTION_MATRIX; 1574*61046927SAndroid Build Coastguard Worker $$[1] = 0; 1575*61046927SAndroid Build Coastguard Worker } 1576*61046927SAndroid Build Coastguard Worker | MVP 1577*61046927SAndroid Build Coastguard Worker { 1578*61046927SAndroid Build Coastguard Worker $$[0] = STATE_MVP_MATRIX; 1579*61046927SAndroid Build Coastguard Worker $$[1] = 0; 1580*61046927SAndroid Build Coastguard Worker } 1581*61046927SAndroid Build Coastguard Worker | TEXTURE optTexCoordUnitNum 1582*61046927SAndroid Build Coastguard Worker { 1583*61046927SAndroid Build Coastguard Worker $$[0] = STATE_TEXTURE_MATRIX; 1584*61046927SAndroid Build Coastguard Worker $$[1] = $2; 1585*61046927SAndroid Build Coastguard Worker } 1586*61046927SAndroid Build Coastguard Worker | PALETTE '[' statePaletteMatNum ']' 1587*61046927SAndroid Build Coastguard Worker { 1588*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "GL_ARB_matrix_palette not supported"); 1589*61046927SAndroid Build Coastguard Worker YYERROR; 1590*61046927SAndroid Build Coastguard Worker } 1591*61046927SAndroid Build Coastguard Worker | MAT_PROGRAM '[' stateProgramMatNum ']' 1592*61046927SAndroid Build Coastguard Worker { 1593*61046927SAndroid Build Coastguard Worker $$[0] = STATE_PROGRAM_MATRIX; 1594*61046927SAndroid Build Coastguard Worker $$[1] = $3; 1595*61046927SAndroid Build Coastguard Worker } 1596*61046927SAndroid Build Coastguard Worker ; 1597*61046927SAndroid Build Coastguard Worker 1598*61046927SAndroid Build Coastguard Worker stateOptModMatNum: 1599*61046927SAndroid Build Coastguard Worker { 1600*61046927SAndroid Build Coastguard Worker $$ = 0; 1601*61046927SAndroid Build Coastguard Worker } 1602*61046927SAndroid Build Coastguard Worker | '[' stateModMatNum ']' 1603*61046927SAndroid Build Coastguard Worker { 1604*61046927SAndroid Build Coastguard Worker $$ = $2; 1605*61046927SAndroid Build Coastguard Worker } 1606*61046927SAndroid Build Coastguard Worker ; 1607*61046927SAndroid Build Coastguard Worker stateModMatNum: INTEGER 1608*61046927SAndroid Build Coastguard Worker { 1609*61046927SAndroid Build Coastguard Worker /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix 1610*61046927SAndroid Build Coastguard Worker * zero is valid. 1611*61046927SAndroid Build Coastguard Worker */ 1612*61046927SAndroid Build Coastguard Worker if ($1 != 0) { 1613*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid modelview matrix index"); 1614*61046927SAndroid Build Coastguard Worker YYERROR; 1615*61046927SAndroid Build Coastguard Worker } 1616*61046927SAndroid Build Coastguard Worker 1617*61046927SAndroid Build Coastguard Worker $$ = $1; 1618*61046927SAndroid Build Coastguard Worker } 1619*61046927SAndroid Build Coastguard Worker ; 1620*61046927SAndroid Build Coastguard Worker statePaletteMatNum: INTEGER 1621*61046927SAndroid Build Coastguard Worker { 1622*61046927SAndroid Build Coastguard Worker /* Since GL_ARB_matrix_palette isn't supported, just let any value 1623*61046927SAndroid Build Coastguard Worker * through here. The error will be generated later. 1624*61046927SAndroid Build Coastguard Worker */ 1625*61046927SAndroid Build Coastguard Worker $$ = $1; 1626*61046927SAndroid Build Coastguard Worker } 1627*61046927SAndroid Build Coastguard Worker ; 1628*61046927SAndroid Build Coastguard Worker stateProgramMatNum: INTEGER 1629*61046927SAndroid Build Coastguard Worker { 1630*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->MaxProgramMatrices) { 1631*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid program matrix selector"); 1632*61046927SAndroid Build Coastguard Worker YYERROR; 1633*61046927SAndroid Build Coastguard Worker } 1634*61046927SAndroid Build Coastguard Worker 1635*61046927SAndroid Build Coastguard Worker $$ = $1; 1636*61046927SAndroid Build Coastguard Worker } 1637*61046927SAndroid Build Coastguard Worker ; 1638*61046927SAndroid Build Coastguard Worker 1639*61046927SAndroid Build Coastguard Worker stateDepthItem: DEPTH RANGE 1640*61046927SAndroid Build Coastguard Worker { 1641*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1642*61046927SAndroid Build Coastguard Worker $$[0] = STATE_DEPTH_RANGE; 1643*61046927SAndroid Build Coastguard Worker } 1644*61046927SAndroid Build Coastguard Worker ; 1645*61046927SAndroid Build Coastguard Worker 1646*61046927SAndroid Build Coastguard Worker 1647*61046927SAndroid Build Coastguard Worker programSingleItem: progEnvParam | progLocalParam; 1648*61046927SAndroid Build Coastguard Worker 1649*61046927SAndroid Build Coastguard Worker programMultipleItem: progEnvParams | progLocalParams; 1650*61046927SAndroid Build Coastguard Worker 1651*61046927SAndroid Build Coastguard Worker progEnvParams: PROGRAM ENV '[' progEnvParamNums ']' 1652*61046927SAndroid Build Coastguard Worker { 1653*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1654*61046927SAndroid Build Coastguard Worker $$[0] = state->state_param_enum_env; 1655*61046927SAndroid Build Coastguard Worker $$[1] = $4[0]; 1656*61046927SAndroid Build Coastguard Worker $$[2] = $4[1]; 1657*61046927SAndroid Build Coastguard Worker $$[3] = 0; 1658*61046927SAndroid Build Coastguard Worker } 1659*61046927SAndroid Build Coastguard Worker ; 1660*61046927SAndroid Build Coastguard Worker 1661*61046927SAndroid Build Coastguard Worker progEnvParamNums: progEnvParamNum 1662*61046927SAndroid Build Coastguard Worker { 1663*61046927SAndroid Build Coastguard Worker $$[0] = $1; 1664*61046927SAndroid Build Coastguard Worker $$[1] = $1; 1665*61046927SAndroid Build Coastguard Worker } 1666*61046927SAndroid Build Coastguard Worker | progEnvParamNum DOT_DOT progEnvParamNum 1667*61046927SAndroid Build Coastguard Worker { 1668*61046927SAndroid Build Coastguard Worker $$[0] = $1; 1669*61046927SAndroid Build Coastguard Worker $$[1] = $3; 1670*61046927SAndroid Build Coastguard Worker } 1671*61046927SAndroid Build Coastguard Worker ; 1672*61046927SAndroid Build Coastguard Worker 1673*61046927SAndroid Build Coastguard Worker progEnvParam: PROGRAM ENV '[' progEnvParamNum ']' 1674*61046927SAndroid Build Coastguard Worker { 1675*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1676*61046927SAndroid Build Coastguard Worker $$[0] = state->state_param_enum_env; 1677*61046927SAndroid Build Coastguard Worker $$[1] = $4; 1678*61046927SAndroid Build Coastguard Worker $$[2] = $4; 1679*61046927SAndroid Build Coastguard Worker $$[3] = 0; 1680*61046927SAndroid Build Coastguard Worker } 1681*61046927SAndroid Build Coastguard Worker ; 1682*61046927SAndroid Build Coastguard Worker 1683*61046927SAndroid Build Coastguard Worker progLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']' 1684*61046927SAndroid Build Coastguard Worker { 1685*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1686*61046927SAndroid Build Coastguard Worker $$[0] = state->state_param_enum_local; 1687*61046927SAndroid Build Coastguard Worker $$[1] = $4[0]; 1688*61046927SAndroid Build Coastguard Worker $$[2] = $4[1]; 1689*61046927SAndroid Build Coastguard Worker $$[3] = 0; 1690*61046927SAndroid Build Coastguard Worker } 1691*61046927SAndroid Build Coastguard Worker 1692*61046927SAndroid Build Coastguard Worker progLocalParamNums: progLocalParamNum 1693*61046927SAndroid Build Coastguard Worker { 1694*61046927SAndroid Build Coastguard Worker $$[0] = $1; 1695*61046927SAndroid Build Coastguard Worker $$[1] = $1; 1696*61046927SAndroid Build Coastguard Worker } 1697*61046927SAndroid Build Coastguard Worker | progLocalParamNum DOT_DOT progLocalParamNum 1698*61046927SAndroid Build Coastguard Worker { 1699*61046927SAndroid Build Coastguard Worker $$[0] = $1; 1700*61046927SAndroid Build Coastguard Worker $$[1] = $3; 1701*61046927SAndroid Build Coastguard Worker } 1702*61046927SAndroid Build Coastguard Worker ; 1703*61046927SAndroid Build Coastguard Worker 1704*61046927SAndroid Build Coastguard Worker progLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']' 1705*61046927SAndroid Build Coastguard Worker { 1706*61046927SAndroid Build Coastguard Worker memset($$, 0, sizeof($$)); 1707*61046927SAndroid Build Coastguard Worker $$[0] = state->state_param_enum_local; 1708*61046927SAndroid Build Coastguard Worker $$[1] = $4; 1709*61046927SAndroid Build Coastguard Worker $$[2] = $4; 1710*61046927SAndroid Build Coastguard Worker $$[3] = 0; 1711*61046927SAndroid Build Coastguard Worker } 1712*61046927SAndroid Build Coastguard Worker ; 1713*61046927SAndroid Build Coastguard Worker 1714*61046927SAndroid Build Coastguard Worker progEnvParamNum: INTEGER 1715*61046927SAndroid Build Coastguard Worker { 1716*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->limits->MaxEnvParams) { 1717*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid environment parameter reference"); 1718*61046927SAndroid Build Coastguard Worker YYERROR; 1719*61046927SAndroid Build Coastguard Worker } 1720*61046927SAndroid Build Coastguard Worker $$ = $1; 1721*61046927SAndroid Build Coastguard Worker } 1722*61046927SAndroid Build Coastguard Worker ; 1723*61046927SAndroid Build Coastguard Worker 1724*61046927SAndroid Build Coastguard Worker progLocalParamNum: INTEGER 1725*61046927SAndroid Build Coastguard Worker { 1726*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->limits->MaxLocalParams) { 1727*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid local parameter reference"); 1728*61046927SAndroid Build Coastguard Worker YYERROR; 1729*61046927SAndroid Build Coastguard Worker } 1730*61046927SAndroid Build Coastguard Worker $$ = $1; 1731*61046927SAndroid Build Coastguard Worker } 1732*61046927SAndroid Build Coastguard Worker ; 1733*61046927SAndroid Build Coastguard Worker 1734*61046927SAndroid Build Coastguard Worker 1735*61046927SAndroid Build Coastguard Worker 1736*61046927SAndroid Build Coastguard Worker paramConstDecl: paramConstScalarDecl | paramConstVector; 1737*61046927SAndroid Build Coastguard Worker paramConstUse: paramConstScalarUse | paramConstVector; 1738*61046927SAndroid Build Coastguard Worker 1739*61046927SAndroid Build Coastguard Worker paramConstScalarDecl: signedFloatConstant 1740*61046927SAndroid Build Coastguard Worker { 1741*61046927SAndroid Build Coastguard Worker $$.count = 4; 1742*61046927SAndroid Build Coastguard Worker $$.data[0].f = $1; 1743*61046927SAndroid Build Coastguard Worker $$.data[1].f = $1; 1744*61046927SAndroid Build Coastguard Worker $$.data[2].f = $1; 1745*61046927SAndroid Build Coastguard Worker $$.data[3].f = $1; 1746*61046927SAndroid Build Coastguard Worker } 1747*61046927SAndroid Build Coastguard Worker ; 1748*61046927SAndroid Build Coastguard Worker 1749*61046927SAndroid Build Coastguard Worker paramConstScalarUse: REAL 1750*61046927SAndroid Build Coastguard Worker { 1751*61046927SAndroid Build Coastguard Worker $$.count = 1; 1752*61046927SAndroid Build Coastguard Worker $$.data[0].f = $1; 1753*61046927SAndroid Build Coastguard Worker $$.data[1].f = $1; 1754*61046927SAndroid Build Coastguard Worker $$.data[2].f = $1; 1755*61046927SAndroid Build Coastguard Worker $$.data[3].f = $1; 1756*61046927SAndroid Build Coastguard Worker } 1757*61046927SAndroid Build Coastguard Worker | INTEGER 1758*61046927SAndroid Build Coastguard Worker { 1759*61046927SAndroid Build Coastguard Worker $$.count = 1; 1760*61046927SAndroid Build Coastguard Worker $$.data[0].f = (float) $1; 1761*61046927SAndroid Build Coastguard Worker $$.data[1].f = (float) $1; 1762*61046927SAndroid Build Coastguard Worker $$.data[2].f = (float) $1; 1763*61046927SAndroid Build Coastguard Worker $$.data[3].f = (float) $1; 1764*61046927SAndroid Build Coastguard Worker } 1765*61046927SAndroid Build Coastguard Worker ; 1766*61046927SAndroid Build Coastguard Worker 1767*61046927SAndroid Build Coastguard Worker paramConstVector: '{' signedFloatConstant '}' 1768*61046927SAndroid Build Coastguard Worker { 1769*61046927SAndroid Build Coastguard Worker $$.count = 4; 1770*61046927SAndroid Build Coastguard Worker $$.data[0].f = $2; 1771*61046927SAndroid Build Coastguard Worker $$.data[1].f = 0.0f; 1772*61046927SAndroid Build Coastguard Worker $$.data[2].f = 0.0f; 1773*61046927SAndroid Build Coastguard Worker $$.data[3].f = 1.0f; 1774*61046927SAndroid Build Coastguard Worker } 1775*61046927SAndroid Build Coastguard Worker | '{' signedFloatConstant ',' signedFloatConstant '}' 1776*61046927SAndroid Build Coastguard Worker { 1777*61046927SAndroid Build Coastguard Worker $$.count = 4; 1778*61046927SAndroid Build Coastguard Worker $$.data[0].f = $2; 1779*61046927SAndroid Build Coastguard Worker $$.data[1].f = $4; 1780*61046927SAndroid Build Coastguard Worker $$.data[2].f = 0.0f; 1781*61046927SAndroid Build Coastguard Worker $$.data[3].f = 1.0f; 1782*61046927SAndroid Build Coastguard Worker } 1783*61046927SAndroid Build Coastguard Worker | '{' signedFloatConstant ',' signedFloatConstant ',' 1784*61046927SAndroid Build Coastguard Worker signedFloatConstant '}' 1785*61046927SAndroid Build Coastguard Worker { 1786*61046927SAndroid Build Coastguard Worker $$.count = 4; 1787*61046927SAndroid Build Coastguard Worker $$.data[0].f = $2; 1788*61046927SAndroid Build Coastguard Worker $$.data[1].f = $4; 1789*61046927SAndroid Build Coastguard Worker $$.data[2].f = $6; 1790*61046927SAndroid Build Coastguard Worker $$.data[3].f = 1.0f; 1791*61046927SAndroid Build Coastguard Worker } 1792*61046927SAndroid Build Coastguard Worker | '{' signedFloatConstant ',' signedFloatConstant ',' 1793*61046927SAndroid Build Coastguard Worker signedFloatConstant ',' signedFloatConstant '}' 1794*61046927SAndroid Build Coastguard Worker { 1795*61046927SAndroid Build Coastguard Worker $$.count = 4; 1796*61046927SAndroid Build Coastguard Worker $$.data[0].f = $2; 1797*61046927SAndroid Build Coastguard Worker $$.data[1].f = $4; 1798*61046927SAndroid Build Coastguard Worker $$.data[2].f = $6; 1799*61046927SAndroid Build Coastguard Worker $$.data[3].f = $8; 1800*61046927SAndroid Build Coastguard Worker } 1801*61046927SAndroid Build Coastguard Worker ; 1802*61046927SAndroid Build Coastguard Worker 1803*61046927SAndroid Build Coastguard Worker signedFloatConstant: optionalSign REAL 1804*61046927SAndroid Build Coastguard Worker { 1805*61046927SAndroid Build Coastguard Worker $$ = ($1) ? -$2 : $2; 1806*61046927SAndroid Build Coastguard Worker } 1807*61046927SAndroid Build Coastguard Worker | optionalSign INTEGER 1808*61046927SAndroid Build Coastguard Worker { 1809*61046927SAndroid Build Coastguard Worker $$ = (float)(($1) ? -$2 : $2); 1810*61046927SAndroid Build Coastguard Worker } 1811*61046927SAndroid Build Coastguard Worker ; 1812*61046927SAndroid Build Coastguard Worker 1813*61046927SAndroid Build Coastguard Worker optionalSign: '+' { $$ = FALSE; } 1814*61046927SAndroid Build Coastguard Worker | '-' { $$ = TRUE; } 1815*61046927SAndroid Build Coastguard Worker | { $$ = FALSE; } 1816*61046927SAndroid Build Coastguard Worker ; 1817*61046927SAndroid Build Coastguard Worker 1818*61046927SAndroid Build Coastguard Worker TEMP_statement: TEMP { $<integer>$ = $1; } varNameList 1819*61046927SAndroid Build Coastguard Worker ; 1820*61046927SAndroid Build Coastguard Worker 1821*61046927SAndroid Build Coastguard Worker ADDRESS_statement: ADDRESS { $<integer>$ = $1; } varNameList 1822*61046927SAndroid Build Coastguard Worker ; 1823*61046927SAndroid Build Coastguard Worker 1824*61046927SAndroid Build Coastguard Worker varNameList: varNameList ',' IDENTIFIER 1825*61046927SAndroid Build Coastguard Worker { 1826*61046927SAndroid Build Coastguard Worker if (!declare_variable(state, $3, $<integer>0, & @3)) { 1827*61046927SAndroid Build Coastguard Worker free($3); 1828*61046927SAndroid Build Coastguard Worker YYERROR; 1829*61046927SAndroid Build Coastguard Worker } 1830*61046927SAndroid Build Coastguard Worker } 1831*61046927SAndroid Build Coastguard Worker | IDENTIFIER 1832*61046927SAndroid Build Coastguard Worker { 1833*61046927SAndroid Build Coastguard Worker if (!declare_variable(state, $1, $<integer>0, & @1)) { 1834*61046927SAndroid Build Coastguard Worker free($1); 1835*61046927SAndroid Build Coastguard Worker YYERROR; 1836*61046927SAndroid Build Coastguard Worker } 1837*61046927SAndroid Build Coastguard Worker } 1838*61046927SAndroid Build Coastguard Worker ; 1839*61046927SAndroid Build Coastguard Worker 1840*61046927SAndroid Build Coastguard Worker OUTPUT_statement: OUTPUT IDENTIFIER '=' resultBinding 1841*61046927SAndroid Build Coastguard Worker { 1842*61046927SAndroid Build Coastguard Worker struct asm_symbol *const s = 1843*61046927SAndroid Build Coastguard Worker declare_variable(state, $2, at_output, & @2); 1844*61046927SAndroid Build Coastguard Worker 1845*61046927SAndroid Build Coastguard Worker if (s == NULL) { 1846*61046927SAndroid Build Coastguard Worker free($2); 1847*61046927SAndroid Build Coastguard Worker YYERROR; 1848*61046927SAndroid Build Coastguard Worker } else { 1849*61046927SAndroid Build Coastguard Worker s->output_binding = $4; 1850*61046927SAndroid Build Coastguard Worker } 1851*61046927SAndroid Build Coastguard Worker } 1852*61046927SAndroid Build Coastguard Worker ; 1853*61046927SAndroid Build Coastguard Worker 1854*61046927SAndroid Build Coastguard Worker resultBinding: RESULT POSITION 1855*61046927SAndroid Build Coastguard Worker { 1856*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1857*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_POS; 1858*61046927SAndroid Build Coastguard Worker } else { 1859*61046927SAndroid Build Coastguard Worker yyerror(& @2, state, "invalid program result name"); 1860*61046927SAndroid Build Coastguard Worker YYERROR; 1861*61046927SAndroid Build Coastguard Worker } 1862*61046927SAndroid Build Coastguard Worker } 1863*61046927SAndroid Build Coastguard Worker | RESULT FOGCOORD 1864*61046927SAndroid Build Coastguard Worker { 1865*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1866*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_FOGC; 1867*61046927SAndroid Build Coastguard Worker } else { 1868*61046927SAndroid Build Coastguard Worker yyerror(& @2, state, "invalid program result name"); 1869*61046927SAndroid Build Coastguard Worker YYERROR; 1870*61046927SAndroid Build Coastguard Worker } 1871*61046927SAndroid Build Coastguard Worker } 1872*61046927SAndroid Build Coastguard Worker | RESULT resultColBinding 1873*61046927SAndroid Build Coastguard Worker { 1874*61046927SAndroid Build Coastguard Worker $$ = $2; 1875*61046927SAndroid Build Coastguard Worker } 1876*61046927SAndroid Build Coastguard Worker | RESULT POINTSIZE 1877*61046927SAndroid Build Coastguard Worker { 1878*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1879*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_PSIZ; 1880*61046927SAndroid Build Coastguard Worker } else { 1881*61046927SAndroid Build Coastguard Worker yyerror(& @2, state, "invalid program result name"); 1882*61046927SAndroid Build Coastguard Worker YYERROR; 1883*61046927SAndroid Build Coastguard Worker } 1884*61046927SAndroid Build Coastguard Worker } 1885*61046927SAndroid Build Coastguard Worker | RESULT TEXCOORD optTexCoordUnitNum 1886*61046927SAndroid Build Coastguard Worker { 1887*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1888*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_TEX0 + $3; 1889*61046927SAndroid Build Coastguard Worker } else { 1890*61046927SAndroid Build Coastguard Worker yyerror(& @2, state, "invalid program result name"); 1891*61046927SAndroid Build Coastguard Worker YYERROR; 1892*61046927SAndroid Build Coastguard Worker } 1893*61046927SAndroid Build Coastguard Worker } 1894*61046927SAndroid Build Coastguard Worker | RESULT DEPTH 1895*61046927SAndroid Build Coastguard Worker { 1896*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_fragment) { 1897*61046927SAndroid Build Coastguard Worker $$ = FRAG_RESULT_DEPTH; 1898*61046927SAndroid Build Coastguard Worker } else { 1899*61046927SAndroid Build Coastguard Worker yyerror(& @2, state, "invalid program result name"); 1900*61046927SAndroid Build Coastguard Worker YYERROR; 1901*61046927SAndroid Build Coastguard Worker } 1902*61046927SAndroid Build Coastguard Worker } 1903*61046927SAndroid Build Coastguard Worker ; 1904*61046927SAndroid Build Coastguard Worker 1905*61046927SAndroid Build Coastguard Worker resultColBinding: COLOR optResultFaceType optResultColorType 1906*61046927SAndroid Build Coastguard Worker { 1907*61046927SAndroid Build Coastguard Worker $$ = $2 + $3; 1908*61046927SAndroid Build Coastguard Worker } 1909*61046927SAndroid Build Coastguard Worker ; 1910*61046927SAndroid Build Coastguard Worker 1911*61046927SAndroid Build Coastguard Worker optResultFaceType: 1912*61046927SAndroid Build Coastguard Worker { 1913*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1914*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_COL0; 1915*61046927SAndroid Build Coastguard Worker } else { 1916*61046927SAndroid Build Coastguard Worker if (state->option.DrawBuffers) 1917*61046927SAndroid Build Coastguard Worker $$ = FRAG_RESULT_DATA0; 1918*61046927SAndroid Build Coastguard Worker else 1919*61046927SAndroid Build Coastguard Worker $$ = FRAG_RESULT_COLOR; 1920*61046927SAndroid Build Coastguard Worker } 1921*61046927SAndroid Build Coastguard Worker } 1922*61046927SAndroid Build Coastguard Worker | '[' INTEGER ']' 1923*61046927SAndroid Build Coastguard Worker { 1924*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1925*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid program result name"); 1926*61046927SAndroid Build Coastguard Worker YYERROR; 1927*61046927SAndroid Build Coastguard Worker } else { 1928*61046927SAndroid Build Coastguard Worker if (!state->option.DrawBuffers) { 1929*61046927SAndroid Build Coastguard Worker /* From the ARB_draw_buffers spec (same text exists 1930*61046927SAndroid Build Coastguard Worker * for ATI_draw_buffers): 1931*61046927SAndroid Build Coastguard Worker * 1932*61046927SAndroid Build Coastguard Worker * If this option is not specified, a fragment 1933*61046927SAndroid Build Coastguard Worker * program that attempts to bind 1934*61046927SAndroid Build Coastguard Worker * "result.color[n]" will fail to load, and only 1935*61046927SAndroid Build Coastguard Worker * "result.color" will be allowed. 1936*61046927SAndroid Build Coastguard Worker */ 1937*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, 1938*61046927SAndroid Build Coastguard Worker "result.color[] used without " 1939*61046927SAndroid Build Coastguard Worker "`OPTION ARB_draw_buffers' or " 1940*61046927SAndroid Build Coastguard Worker "`OPTION ATI_draw_buffers'"); 1941*61046927SAndroid Build Coastguard Worker YYERROR; 1942*61046927SAndroid Build Coastguard Worker } else if ($2 >= state->MaxDrawBuffers) { 1943*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, 1944*61046927SAndroid Build Coastguard Worker "result.color[] exceeds MAX_DRAW_BUFFERS_ARB"); 1945*61046927SAndroid Build Coastguard Worker YYERROR; 1946*61046927SAndroid Build Coastguard Worker } 1947*61046927SAndroid Build Coastguard Worker $$ = FRAG_RESULT_DATA0 + $2; 1948*61046927SAndroid Build Coastguard Worker } 1949*61046927SAndroid Build Coastguard Worker } 1950*61046927SAndroid Build Coastguard Worker | FRONT 1951*61046927SAndroid Build Coastguard Worker { 1952*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1953*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_COL0; 1954*61046927SAndroid Build Coastguard Worker } else { 1955*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid program result name"); 1956*61046927SAndroid Build Coastguard Worker YYERROR; 1957*61046927SAndroid Build Coastguard Worker } 1958*61046927SAndroid Build Coastguard Worker } 1959*61046927SAndroid Build Coastguard Worker | BACK 1960*61046927SAndroid Build Coastguard Worker { 1961*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1962*61046927SAndroid Build Coastguard Worker $$ = VARYING_SLOT_BFC0; 1963*61046927SAndroid Build Coastguard Worker } else { 1964*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid program result name"); 1965*61046927SAndroid Build Coastguard Worker YYERROR; 1966*61046927SAndroid Build Coastguard Worker } 1967*61046927SAndroid Build Coastguard Worker } 1968*61046927SAndroid Build Coastguard Worker ; 1969*61046927SAndroid Build Coastguard Worker 1970*61046927SAndroid Build Coastguard Worker optResultColorType: 1971*61046927SAndroid Build Coastguard Worker { 1972*61046927SAndroid Build Coastguard Worker $$ = 0; 1973*61046927SAndroid Build Coastguard Worker } 1974*61046927SAndroid Build Coastguard Worker | PRIMARY 1975*61046927SAndroid Build Coastguard Worker { 1976*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1977*61046927SAndroid Build Coastguard Worker $$ = 0; 1978*61046927SAndroid Build Coastguard Worker } else { 1979*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid program result name"); 1980*61046927SAndroid Build Coastguard Worker YYERROR; 1981*61046927SAndroid Build Coastguard Worker } 1982*61046927SAndroid Build Coastguard Worker } 1983*61046927SAndroid Build Coastguard Worker | SECONDARY 1984*61046927SAndroid Build Coastguard Worker { 1985*61046927SAndroid Build Coastguard Worker if (state->mode == ARB_vertex) { 1986*61046927SAndroid Build Coastguard Worker $$ = 1; 1987*61046927SAndroid Build Coastguard Worker } else { 1988*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid program result name"); 1989*61046927SAndroid Build Coastguard Worker YYERROR; 1990*61046927SAndroid Build Coastguard Worker } 1991*61046927SAndroid Build Coastguard Worker } 1992*61046927SAndroid Build Coastguard Worker ; 1993*61046927SAndroid Build Coastguard Worker 1994*61046927SAndroid Build Coastguard Worker optFaceType: { $$ = 0; } 1995*61046927SAndroid Build Coastguard Worker | FRONT { $$ = 0; } 1996*61046927SAndroid Build Coastguard Worker | BACK { $$ = 1; } 1997*61046927SAndroid Build Coastguard Worker ; 1998*61046927SAndroid Build Coastguard Worker 1999*61046927SAndroid Build Coastguard Worker optColorType: { $$ = 0; } 2000*61046927SAndroid Build Coastguard Worker | PRIMARY { $$ = 0; } 2001*61046927SAndroid Build Coastguard Worker | SECONDARY { $$ = 1; } 2002*61046927SAndroid Build Coastguard Worker ; 2003*61046927SAndroid Build Coastguard Worker 2004*61046927SAndroid Build Coastguard Worker optTexCoordUnitNum: { $$ = 0; } 2005*61046927SAndroid Build Coastguard Worker | '[' texCoordUnitNum ']' { $$ = $2; } 2006*61046927SAndroid Build Coastguard Worker ; 2007*61046927SAndroid Build Coastguard Worker 2008*61046927SAndroid Build Coastguard Worker optTexImageUnitNum: { $$ = 0; } 2009*61046927SAndroid Build Coastguard Worker | '[' texImageUnitNum ']' { $$ = $2; } 2010*61046927SAndroid Build Coastguard Worker ; 2011*61046927SAndroid Build Coastguard Worker 2012*61046927SAndroid Build Coastguard Worker optLegacyTexUnitNum: { $$ = 0; } 2013*61046927SAndroid Build Coastguard Worker | '[' legacyTexUnitNum ']' { $$ = $2; } 2014*61046927SAndroid Build Coastguard Worker ; 2015*61046927SAndroid Build Coastguard Worker 2016*61046927SAndroid Build Coastguard Worker texCoordUnitNum: INTEGER 2017*61046927SAndroid Build Coastguard Worker { 2018*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->MaxTextureCoordUnits) { 2019*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid texture coordinate unit selector"); 2020*61046927SAndroid Build Coastguard Worker YYERROR; 2021*61046927SAndroid Build Coastguard Worker } 2022*61046927SAndroid Build Coastguard Worker 2023*61046927SAndroid Build Coastguard Worker $$ = $1; 2024*61046927SAndroid Build Coastguard Worker } 2025*61046927SAndroid Build Coastguard Worker ; 2026*61046927SAndroid Build Coastguard Worker 2027*61046927SAndroid Build Coastguard Worker texImageUnitNum: INTEGER 2028*61046927SAndroid Build Coastguard Worker { 2029*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->MaxTextureImageUnits) { 2030*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid texture image unit selector"); 2031*61046927SAndroid Build Coastguard Worker YYERROR; 2032*61046927SAndroid Build Coastguard Worker } 2033*61046927SAndroid Build Coastguard Worker 2034*61046927SAndroid Build Coastguard Worker $$ = $1; 2035*61046927SAndroid Build Coastguard Worker } 2036*61046927SAndroid Build Coastguard Worker ; 2037*61046927SAndroid Build Coastguard Worker 2038*61046927SAndroid Build Coastguard Worker legacyTexUnitNum: INTEGER 2039*61046927SAndroid Build Coastguard Worker { 2040*61046927SAndroid Build Coastguard Worker if ((unsigned) $1 >= state->MaxTextureUnits) { 2041*61046927SAndroid Build Coastguard Worker yyerror(& @1, state, "invalid texture unit selector"); 2042*61046927SAndroid Build Coastguard Worker YYERROR; 2043*61046927SAndroid Build Coastguard Worker } 2044*61046927SAndroid Build Coastguard Worker 2045*61046927SAndroid Build Coastguard Worker $$ = $1; 2046*61046927SAndroid Build Coastguard Worker } 2047*61046927SAndroid Build Coastguard Worker ; 2048*61046927SAndroid Build Coastguard Worker 2049*61046927SAndroid Build Coastguard Worker ALIAS_statement: ALIAS IDENTIFIER '=' USED_IDENTIFIER 2050*61046927SAndroid Build Coastguard Worker { 2051*61046927SAndroid Build Coastguard Worker struct asm_symbol *exist = (struct asm_symbol *) 2052*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_find_symbol(state->st, $2); 2053*61046927SAndroid Build Coastguard Worker struct asm_symbol *target = (struct asm_symbol *) 2054*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_find_symbol(state->st, $4); 2055*61046927SAndroid Build Coastguard Worker 2056*61046927SAndroid Build Coastguard Worker free($4); 2057*61046927SAndroid Build Coastguard Worker 2058*61046927SAndroid Build Coastguard Worker if (exist != NULL) { 2059*61046927SAndroid Build Coastguard Worker char m[1000]; 2060*61046927SAndroid Build Coastguard Worker snprintf(m, sizeof(m), "redeclared identifier: %s", $2); 2061*61046927SAndroid Build Coastguard Worker free($2); 2062*61046927SAndroid Build Coastguard Worker yyerror(& @2, state, m); 2063*61046927SAndroid Build Coastguard Worker YYERROR; 2064*61046927SAndroid Build Coastguard Worker } else if (target == NULL) { 2065*61046927SAndroid Build Coastguard Worker free($2); 2066*61046927SAndroid Build Coastguard Worker yyerror(& @4, state, 2067*61046927SAndroid Build Coastguard Worker "undefined variable binding in ALIAS statement"); 2068*61046927SAndroid Build Coastguard Worker YYERROR; 2069*61046927SAndroid Build Coastguard Worker } else { 2070*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_add_symbol(state->st, $2, target); 2071*61046927SAndroid Build Coastguard Worker free($2); 2072*61046927SAndroid Build Coastguard Worker } 2073*61046927SAndroid Build Coastguard Worker (void)yynerrs; 2074*61046927SAndroid Build Coastguard Worker } 2075*61046927SAndroid Build Coastguard Worker ; 2076*61046927SAndroid Build Coastguard Worker 2077*61046927SAndroid Build Coastguard Worker string: IDENTIFIER 2078*61046927SAndroid Build Coastguard Worker | USED_IDENTIFIER 2079*61046927SAndroid Build Coastguard Worker ; 2080*61046927SAndroid Build Coastguard Worker 2081*61046927SAndroid Build Coastguard Worker %% 2082*61046927SAndroid Build Coastguard Worker 2083*61046927SAndroid Build Coastguard Worker void 2084*61046927SAndroid Build Coastguard Worker asm_instruction_set_operands(struct asm_instruction *inst, 2085*61046927SAndroid Build Coastguard Worker const struct prog_dst_register *dst, 2086*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src0, 2087*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src1, 2088*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src2) 2089*61046927SAndroid Build Coastguard Worker { 2090*61046927SAndroid Build Coastguard Worker /* In the core ARB extensions only the KIL instruction doesn't have a 2091*61046927SAndroid Build Coastguard Worker * destination register. 2092*61046927SAndroid Build Coastguard Worker */ 2093*61046927SAndroid Build Coastguard Worker if (dst == NULL) { 2094*61046927SAndroid Build Coastguard Worker init_dst_reg(& inst->Base.DstReg); 2095*61046927SAndroid Build Coastguard Worker } else { 2096*61046927SAndroid Build Coastguard Worker inst->Base.DstReg = *dst; 2097*61046927SAndroid Build Coastguard Worker } 2098*61046927SAndroid Build Coastguard Worker 2099*61046927SAndroid Build Coastguard Worker if (src0 != NULL) { 2100*61046927SAndroid Build Coastguard Worker inst->Base.SrcReg[0] = src0->Base; 2101*61046927SAndroid Build Coastguard Worker inst->SrcReg[0] = *src0; 2102*61046927SAndroid Build Coastguard Worker } else { 2103*61046927SAndroid Build Coastguard Worker init_src_reg(& inst->SrcReg[0]); 2104*61046927SAndroid Build Coastguard Worker } 2105*61046927SAndroid Build Coastguard Worker 2106*61046927SAndroid Build Coastguard Worker if (src1 != NULL) { 2107*61046927SAndroid Build Coastguard Worker inst->Base.SrcReg[1] = src1->Base; 2108*61046927SAndroid Build Coastguard Worker inst->SrcReg[1] = *src1; 2109*61046927SAndroid Build Coastguard Worker } else { 2110*61046927SAndroid Build Coastguard Worker init_src_reg(& inst->SrcReg[1]); 2111*61046927SAndroid Build Coastguard Worker } 2112*61046927SAndroid Build Coastguard Worker 2113*61046927SAndroid Build Coastguard Worker if (src2 != NULL) { 2114*61046927SAndroid Build Coastguard Worker inst->Base.SrcReg[2] = src2->Base; 2115*61046927SAndroid Build Coastguard Worker inst->SrcReg[2] = *src2; 2116*61046927SAndroid Build Coastguard Worker } else { 2117*61046927SAndroid Build Coastguard Worker init_src_reg(& inst->SrcReg[2]); 2118*61046927SAndroid Build Coastguard Worker } 2119*61046927SAndroid Build Coastguard Worker } 2120*61046927SAndroid Build Coastguard Worker 2121*61046927SAndroid Build Coastguard Worker 2122*61046927SAndroid Build Coastguard Worker struct asm_instruction * 2123*61046927SAndroid Build Coastguard Worker asm_instruction_ctor(enum prog_opcode op, 2124*61046927SAndroid Build Coastguard Worker const struct prog_dst_register *dst, 2125*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src0, 2126*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src1, 2127*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src2) 2128*61046927SAndroid Build Coastguard Worker { 2129*61046927SAndroid Build Coastguard Worker struct asm_instruction *inst = calloc(1, sizeof(struct asm_instruction)); 2130*61046927SAndroid Build Coastguard Worker 2131*61046927SAndroid Build Coastguard Worker if (inst) { 2132*61046927SAndroid Build Coastguard Worker _mesa_init_instructions(& inst->Base, 1); 2133*61046927SAndroid Build Coastguard Worker inst->Base.Opcode = op; 2134*61046927SAndroid Build Coastguard Worker 2135*61046927SAndroid Build Coastguard Worker asm_instruction_set_operands(inst, dst, src0, src1, src2); 2136*61046927SAndroid Build Coastguard Worker } 2137*61046927SAndroid Build Coastguard Worker 2138*61046927SAndroid Build Coastguard Worker return inst; 2139*61046927SAndroid Build Coastguard Worker } 2140*61046927SAndroid Build Coastguard Worker 2141*61046927SAndroid Build Coastguard Worker 2142*61046927SAndroid Build Coastguard Worker struct asm_instruction * 2143*61046927SAndroid Build Coastguard Worker asm_instruction_copy_ctor(const struct prog_instruction *base, 2144*61046927SAndroid Build Coastguard Worker const struct prog_dst_register *dst, 2145*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src0, 2146*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src1, 2147*61046927SAndroid Build Coastguard Worker const struct asm_src_register *src2) 2148*61046927SAndroid Build Coastguard Worker { 2149*61046927SAndroid Build Coastguard Worker struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction); 2150*61046927SAndroid Build Coastguard Worker 2151*61046927SAndroid Build Coastguard Worker if (inst) { 2152*61046927SAndroid Build Coastguard Worker _mesa_init_instructions(& inst->Base, 1); 2153*61046927SAndroid Build Coastguard Worker inst->Base.Opcode = base->Opcode; 2154*61046927SAndroid Build Coastguard Worker inst->Base.Saturate = base->Saturate; 2155*61046927SAndroid Build Coastguard Worker 2156*61046927SAndroid Build Coastguard Worker asm_instruction_set_operands(inst, dst, src0, src1, src2); 2157*61046927SAndroid Build Coastguard Worker } 2158*61046927SAndroid Build Coastguard Worker 2159*61046927SAndroid Build Coastguard Worker return inst; 2160*61046927SAndroid Build Coastguard Worker } 2161*61046927SAndroid Build Coastguard Worker 2162*61046927SAndroid Build Coastguard Worker 2163*61046927SAndroid Build Coastguard Worker void 2164*61046927SAndroid Build Coastguard Worker init_dst_reg(struct prog_dst_register *r) 2165*61046927SAndroid Build Coastguard Worker { 2166*61046927SAndroid Build Coastguard Worker memset(r, 0, sizeof(*r)); 2167*61046927SAndroid Build Coastguard Worker r->File = PROGRAM_UNDEFINED; 2168*61046927SAndroid Build Coastguard Worker r->WriteMask = WRITEMASK_XYZW; 2169*61046927SAndroid Build Coastguard Worker } 2170*61046927SAndroid Build Coastguard Worker 2171*61046927SAndroid Build Coastguard Worker 2172*61046927SAndroid Build Coastguard Worker /** Like init_dst_reg() but set the File and Index fields. */ 2173*61046927SAndroid Build Coastguard Worker void 2174*61046927SAndroid Build Coastguard Worker set_dst_reg(struct prog_dst_register *r, gl_register_file file, GLint index) 2175*61046927SAndroid Build Coastguard Worker { 2176*61046927SAndroid Build Coastguard Worker const GLint maxIndex = 1 << INST_INDEX_BITS; 2177*61046927SAndroid Build Coastguard Worker const GLint minIndex = 0; 2178*61046927SAndroid Build Coastguard Worker assert(index >= minIndex); 2179*61046927SAndroid Build Coastguard Worker (void) minIndex; 2180*61046927SAndroid Build Coastguard Worker assert(index <= maxIndex); 2181*61046927SAndroid Build Coastguard Worker (void) maxIndex; 2182*61046927SAndroid Build Coastguard Worker assert(file == PROGRAM_TEMPORARY || 2183*61046927SAndroid Build Coastguard Worker file == PROGRAM_ADDRESS || 2184*61046927SAndroid Build Coastguard Worker file == PROGRAM_OUTPUT); 2185*61046927SAndroid Build Coastguard Worker memset(r, 0, sizeof(*r)); 2186*61046927SAndroid Build Coastguard Worker r->File = file; 2187*61046927SAndroid Build Coastguard Worker r->Index = index; 2188*61046927SAndroid Build Coastguard Worker r->WriteMask = WRITEMASK_XYZW; 2189*61046927SAndroid Build Coastguard Worker } 2190*61046927SAndroid Build Coastguard Worker 2191*61046927SAndroid Build Coastguard Worker 2192*61046927SAndroid Build Coastguard Worker void 2193*61046927SAndroid Build Coastguard Worker init_src_reg(struct asm_src_register *r) 2194*61046927SAndroid Build Coastguard Worker { 2195*61046927SAndroid Build Coastguard Worker memset(r, 0, sizeof(*r)); 2196*61046927SAndroid Build Coastguard Worker r->Base.File = PROGRAM_UNDEFINED; 2197*61046927SAndroid Build Coastguard Worker r->Base.Swizzle = SWIZZLE_NOOP; 2198*61046927SAndroid Build Coastguard Worker r->Symbol = NULL; 2199*61046927SAndroid Build Coastguard Worker } 2200*61046927SAndroid Build Coastguard Worker 2201*61046927SAndroid Build Coastguard Worker 2202*61046927SAndroid Build Coastguard Worker /** Like init_src_reg() but set the File and Index fields. 2203*61046927SAndroid Build Coastguard Worker * \return GL_TRUE if a valid src register, GL_FALSE otherwise 2204*61046927SAndroid Build Coastguard Worker */ 2205*61046927SAndroid Build Coastguard Worker void 2206*61046927SAndroid Build Coastguard Worker set_src_reg(struct asm_src_register *r, gl_register_file file, GLint index) 2207*61046927SAndroid Build Coastguard Worker { 2208*61046927SAndroid Build Coastguard Worker set_src_reg_swz(r, file, index, SWIZZLE_XYZW); 2209*61046927SAndroid Build Coastguard Worker } 2210*61046927SAndroid Build Coastguard Worker 2211*61046927SAndroid Build Coastguard Worker 2212*61046927SAndroid Build Coastguard Worker void 2213*61046927SAndroid Build Coastguard Worker set_src_reg_swz(struct asm_src_register *r, gl_register_file file, GLint index, 2214*61046927SAndroid Build Coastguard Worker GLuint swizzle) 2215*61046927SAndroid Build Coastguard Worker { 2216*61046927SAndroid Build Coastguard Worker const GLint maxIndex = (1 << INST_INDEX_BITS) - 1; 2217*61046927SAndroid Build Coastguard Worker const GLint minIndex = -(1 << INST_INDEX_BITS); 2218*61046927SAndroid Build Coastguard Worker assert(file < PROGRAM_FILE_MAX); 2219*61046927SAndroid Build Coastguard Worker assert(index >= minIndex); 2220*61046927SAndroid Build Coastguard Worker (void) minIndex; 2221*61046927SAndroid Build Coastguard Worker assert(index <= maxIndex); 2222*61046927SAndroid Build Coastguard Worker (void) maxIndex; 2223*61046927SAndroid Build Coastguard Worker memset(r, 0, sizeof(*r)); 2224*61046927SAndroid Build Coastguard Worker r->Base.File = file; 2225*61046927SAndroid Build Coastguard Worker r->Base.Index = index; 2226*61046927SAndroid Build Coastguard Worker r->Base.Swizzle = swizzle; 2227*61046927SAndroid Build Coastguard Worker r->Symbol = NULL; 2228*61046927SAndroid Build Coastguard Worker } 2229*61046927SAndroid Build Coastguard Worker 2230*61046927SAndroid Build Coastguard Worker 2231*61046927SAndroid Build Coastguard Worker /** 2232*61046927SAndroid Build Coastguard Worker * Validate the set of inputs used by a program 2233*61046927SAndroid Build Coastguard Worker * 2234*61046927SAndroid Build Coastguard Worker * Validates that legal sets of inputs are used by the program. In this case 2235*61046927SAndroid Build Coastguard Worker * "used" included both reading the input or binding the input to a name using 2236*61046927SAndroid Build Coastguard Worker * the \c ATTRIB command. 2237*61046927SAndroid Build Coastguard Worker * 2238*61046927SAndroid Build Coastguard Worker * \return 2239*61046927SAndroid Build Coastguard Worker * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise. 2240*61046927SAndroid Build Coastguard Worker */ 2241*61046927SAndroid Build Coastguard Worker int 2242*61046927SAndroid Build Coastguard Worker validate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state) 2243*61046927SAndroid Build Coastguard Worker { 2244*61046927SAndroid Build Coastguard Worker const GLbitfield64 inputs = state->prog->info.inputs_read | state->InputsBound; 2245*61046927SAndroid Build Coastguard Worker GLbitfield ff_inputs = 0; 2246*61046927SAndroid Build Coastguard Worker 2247*61046927SAndroid Build Coastguard Worker /* Since Mesa internal attribute indices are different from 2248*61046927SAndroid Build Coastguard Worker * how NV_vertex_program defines attribute aliasing, we have to construct 2249*61046927SAndroid Build Coastguard Worker * a separate usage mask based on how the aliasing is defined. 2250*61046927SAndroid Build Coastguard Worker * 2251*61046927SAndroid Build Coastguard Worker * Note that attribute aliasing is optional if NV_vertex_program is 2252*61046927SAndroid Build Coastguard Worker * unsupported. 2253*61046927SAndroid Build Coastguard Worker */ 2254*61046927SAndroid Build Coastguard Worker if (inputs & VERT_BIT_POS) 2255*61046927SAndroid Build Coastguard Worker ff_inputs |= 1 << 0; 2256*61046927SAndroid Build Coastguard Worker if (inputs & VERT_BIT_NORMAL) 2257*61046927SAndroid Build Coastguard Worker ff_inputs |= 1 << 2; 2258*61046927SAndroid Build Coastguard Worker if (inputs & VERT_BIT_COLOR0) 2259*61046927SAndroid Build Coastguard Worker ff_inputs |= 1 << 3; 2260*61046927SAndroid Build Coastguard Worker if (inputs & VERT_BIT_COLOR1) 2261*61046927SAndroid Build Coastguard Worker ff_inputs |= 1 << 4; 2262*61046927SAndroid Build Coastguard Worker if (inputs & VERT_BIT_FOG) 2263*61046927SAndroid Build Coastguard Worker ff_inputs |= 1 << 5; 2264*61046927SAndroid Build Coastguard Worker 2265*61046927SAndroid Build Coastguard Worker ff_inputs |= ((inputs & VERT_BIT_TEX_ALL) >> VERT_ATTRIB_TEX0) << 8; 2266*61046927SAndroid Build Coastguard Worker 2267*61046927SAndroid Build Coastguard Worker if ((ff_inputs & (inputs >> VERT_ATTRIB_GENERIC0)) != 0) { 2268*61046927SAndroid Build Coastguard Worker yyerror(locp, state, "illegal use of generic attribute and name attribute"); 2269*61046927SAndroid Build Coastguard Worker return 0; 2270*61046927SAndroid Build Coastguard Worker } 2271*61046927SAndroid Build Coastguard Worker 2272*61046927SAndroid Build Coastguard Worker return 1; 2273*61046927SAndroid Build Coastguard Worker } 2274*61046927SAndroid Build Coastguard Worker 2275*61046927SAndroid Build Coastguard Worker 2276*61046927SAndroid Build Coastguard Worker struct asm_symbol * 2277*61046927SAndroid Build Coastguard Worker declare_variable(struct asm_parser_state *state, char *name, enum asm_type t, 2278*61046927SAndroid Build Coastguard Worker struct YYLTYPE *locp) 2279*61046927SAndroid Build Coastguard Worker { 2280*61046927SAndroid Build Coastguard Worker struct asm_symbol *s = NULL; 2281*61046927SAndroid Build Coastguard Worker struct asm_symbol *exist = (struct asm_symbol *) 2282*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_find_symbol(state->st, name); 2283*61046927SAndroid Build Coastguard Worker 2284*61046927SAndroid Build Coastguard Worker 2285*61046927SAndroid Build Coastguard Worker if (exist != NULL) { 2286*61046927SAndroid Build Coastguard Worker yyerror(locp, state, "redeclared identifier"); 2287*61046927SAndroid Build Coastguard Worker } else { 2288*61046927SAndroid Build Coastguard Worker s = calloc(1, sizeof(struct asm_symbol)); 2289*61046927SAndroid Build Coastguard Worker s->name = name; 2290*61046927SAndroid Build Coastguard Worker s->type = t; 2291*61046927SAndroid Build Coastguard Worker 2292*61046927SAndroid Build Coastguard Worker switch (t) { 2293*61046927SAndroid Build Coastguard Worker case at_temp: 2294*61046927SAndroid Build Coastguard Worker if (state->prog->arb.NumTemporaries >= state->limits->MaxTemps) { 2295*61046927SAndroid Build Coastguard Worker yyerror(locp, state, "too many temporaries declared"); 2296*61046927SAndroid Build Coastguard Worker free(s); 2297*61046927SAndroid Build Coastguard Worker return NULL; 2298*61046927SAndroid Build Coastguard Worker } 2299*61046927SAndroid Build Coastguard Worker 2300*61046927SAndroid Build Coastguard Worker s->temp_binding = state->prog->arb.NumTemporaries; 2301*61046927SAndroid Build Coastguard Worker state->prog->arb.NumTemporaries++; 2302*61046927SAndroid Build Coastguard Worker break; 2303*61046927SAndroid Build Coastguard Worker 2304*61046927SAndroid Build Coastguard Worker case at_address: 2305*61046927SAndroid Build Coastguard Worker if (state->prog->arb.NumAddressRegs >= 2306*61046927SAndroid Build Coastguard Worker state->limits->MaxAddressRegs) { 2307*61046927SAndroid Build Coastguard Worker yyerror(locp, state, "too many address registers declared"); 2308*61046927SAndroid Build Coastguard Worker free(s); 2309*61046927SAndroid Build Coastguard Worker return NULL; 2310*61046927SAndroid Build Coastguard Worker } 2311*61046927SAndroid Build Coastguard Worker 2312*61046927SAndroid Build Coastguard Worker /* FINISHME: Add support for multiple address registers. 2313*61046927SAndroid Build Coastguard Worker */ 2314*61046927SAndroid Build Coastguard Worker state->prog->arb.NumAddressRegs++; 2315*61046927SAndroid Build Coastguard Worker break; 2316*61046927SAndroid Build Coastguard Worker 2317*61046927SAndroid Build Coastguard Worker default: 2318*61046927SAndroid Build Coastguard Worker break; 2319*61046927SAndroid Build Coastguard Worker } 2320*61046927SAndroid Build Coastguard Worker 2321*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_add_symbol(state->st, s->name, s); 2322*61046927SAndroid Build Coastguard Worker s->next = state->sym; 2323*61046927SAndroid Build Coastguard Worker state->sym = s; 2324*61046927SAndroid Build Coastguard Worker } 2325*61046927SAndroid Build Coastguard Worker 2326*61046927SAndroid Build Coastguard Worker return s; 2327*61046927SAndroid Build Coastguard Worker } 2328*61046927SAndroid Build Coastguard Worker 2329*61046927SAndroid Build Coastguard Worker 2330*61046927SAndroid Build Coastguard Worker int add_state_reference(struct gl_program_parameter_list *param_list, 2331*61046927SAndroid Build Coastguard Worker const gl_state_index16 tokens[STATE_LENGTH]) 2332*61046927SAndroid Build Coastguard Worker { 2333*61046927SAndroid Build Coastguard Worker const GLuint size = 4; /* XXX fix */ 2334*61046927SAndroid Build Coastguard Worker char *name; 2335*61046927SAndroid Build Coastguard Worker GLint index; 2336*61046927SAndroid Build Coastguard Worker 2337*61046927SAndroid Build Coastguard Worker name = _mesa_program_state_string(tokens); 2338*61046927SAndroid Build Coastguard Worker index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name, 2339*61046927SAndroid Build Coastguard Worker size, GL_NONE, NULL, tokens, true); 2340*61046927SAndroid Build Coastguard Worker param_list->StateFlags |= _mesa_program_state_flags(tokens); 2341*61046927SAndroid Build Coastguard Worker 2342*61046927SAndroid Build Coastguard Worker /* free name string here since we duplicated it in add_parameter() */ 2343*61046927SAndroid Build Coastguard Worker free(name); 2344*61046927SAndroid Build Coastguard Worker 2345*61046927SAndroid Build Coastguard Worker return index; 2346*61046927SAndroid Build Coastguard Worker } 2347*61046927SAndroid Build Coastguard Worker 2348*61046927SAndroid Build Coastguard Worker 2349*61046927SAndroid Build Coastguard Worker int 2350*61046927SAndroid Build Coastguard Worker initialize_symbol_from_state(struct gl_program *prog, 2351*61046927SAndroid Build Coastguard Worker struct asm_symbol *param_var, 2352*61046927SAndroid Build Coastguard Worker const gl_state_index16 tokens[STATE_LENGTH]) 2353*61046927SAndroid Build Coastguard Worker { 2354*61046927SAndroid Build Coastguard Worker int idx = -1; 2355*61046927SAndroid Build Coastguard Worker gl_state_index16 state_tokens[STATE_LENGTH]; 2356*61046927SAndroid Build Coastguard Worker 2357*61046927SAndroid Build Coastguard Worker 2358*61046927SAndroid Build Coastguard Worker memcpy(state_tokens, tokens, sizeof(state_tokens)); 2359*61046927SAndroid Build Coastguard Worker 2360*61046927SAndroid Build Coastguard Worker param_var->type = at_param; 2361*61046927SAndroid Build Coastguard Worker param_var->param_binding_type = PROGRAM_STATE_VAR; 2362*61046927SAndroid Build Coastguard Worker 2363*61046927SAndroid Build Coastguard Worker /* If we are adding a STATE_MATRIX that has multiple rows, we need to 2364*61046927SAndroid Build Coastguard Worker * unroll it and call add_state_reference() for each row 2365*61046927SAndroid Build Coastguard Worker */ 2366*61046927SAndroid Build Coastguard Worker if (state_tokens[0] >= STATE_MODELVIEW_MATRIX && 2367*61046927SAndroid Build Coastguard Worker state_tokens[0] <= STATE_PROGRAM_MATRIX_INVTRANS 2368*61046927SAndroid Build Coastguard Worker && (state_tokens[2] != state_tokens[3])) { 2369*61046927SAndroid Build Coastguard Worker int row; 2370*61046927SAndroid Build Coastguard Worker const int first_row = state_tokens[2]; 2371*61046927SAndroid Build Coastguard Worker const int last_row = state_tokens[3]; 2372*61046927SAndroid Build Coastguard Worker 2373*61046927SAndroid Build Coastguard Worker for (row = first_row; row <= last_row; row++) { 2374*61046927SAndroid Build Coastguard Worker state_tokens[2] = state_tokens[3] = row; 2375*61046927SAndroid Build Coastguard Worker 2376*61046927SAndroid Build Coastguard Worker idx = add_state_reference(prog->Parameters, state_tokens); 2377*61046927SAndroid Build Coastguard Worker if (param_var->param_binding_begin == ~0U) { 2378*61046927SAndroid Build Coastguard Worker param_var->param_binding_begin = idx; 2379*61046927SAndroid Build Coastguard Worker param_var->param_binding_swizzle = SWIZZLE_XYZW; 2380*61046927SAndroid Build Coastguard Worker } 2381*61046927SAndroid Build Coastguard Worker 2382*61046927SAndroid Build Coastguard Worker param_var->param_binding_length++; 2383*61046927SAndroid Build Coastguard Worker } 2384*61046927SAndroid Build Coastguard Worker } 2385*61046927SAndroid Build Coastguard Worker else { 2386*61046927SAndroid Build Coastguard Worker idx = add_state_reference(prog->Parameters, state_tokens); 2387*61046927SAndroid Build Coastguard Worker if (param_var->param_binding_begin == ~0U) { 2388*61046927SAndroid Build Coastguard Worker param_var->param_binding_begin = idx; 2389*61046927SAndroid Build Coastguard Worker param_var->param_binding_swizzle = SWIZZLE_XYZW; 2390*61046927SAndroid Build Coastguard Worker } 2391*61046927SAndroid Build Coastguard Worker param_var->param_binding_length++; 2392*61046927SAndroid Build Coastguard Worker } 2393*61046927SAndroid Build Coastguard Worker 2394*61046927SAndroid Build Coastguard Worker return idx; 2395*61046927SAndroid Build Coastguard Worker } 2396*61046927SAndroid Build Coastguard Worker 2397*61046927SAndroid Build Coastguard Worker 2398*61046927SAndroid Build Coastguard Worker int 2399*61046927SAndroid Build Coastguard Worker initialize_symbol_from_param(struct gl_program *prog, 2400*61046927SAndroid Build Coastguard Worker struct asm_symbol *param_var, 2401*61046927SAndroid Build Coastguard Worker const gl_state_index16 tokens[STATE_LENGTH]) 2402*61046927SAndroid Build Coastguard Worker { 2403*61046927SAndroid Build Coastguard Worker int idx = -1; 2404*61046927SAndroid Build Coastguard Worker gl_state_index16 state_tokens[STATE_LENGTH]; 2405*61046927SAndroid Build Coastguard Worker 2406*61046927SAndroid Build Coastguard Worker 2407*61046927SAndroid Build Coastguard Worker memcpy(state_tokens, tokens, sizeof(state_tokens)); 2408*61046927SAndroid Build Coastguard Worker 2409*61046927SAndroid Build Coastguard Worker assert(state_tokens[0] == STATE_VERTEX_PROGRAM_ENV || 2410*61046927SAndroid Build Coastguard Worker state_tokens[0] == STATE_VERTEX_PROGRAM_LOCAL || 2411*61046927SAndroid Build Coastguard Worker state_tokens[0] == STATE_FRAGMENT_PROGRAM_ENV || 2412*61046927SAndroid Build Coastguard Worker state_tokens[0] == STATE_FRAGMENT_PROGRAM_LOCAL); 2413*61046927SAndroid Build Coastguard Worker 2414*61046927SAndroid Build Coastguard Worker /* 2415*61046927SAndroid Build Coastguard Worker * The param type is STATE_VAR. The program parameter entry will 2416*61046927SAndroid Build Coastguard Worker * effectively be a pointer into the LOCAL or ENV parameter array. 2417*61046927SAndroid Build Coastguard Worker */ 2418*61046927SAndroid Build Coastguard Worker param_var->type = at_param; 2419*61046927SAndroid Build Coastguard Worker param_var->param_binding_type = PROGRAM_STATE_VAR; 2420*61046927SAndroid Build Coastguard Worker 2421*61046927SAndroid Build Coastguard Worker /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements, 2422*61046927SAndroid Build Coastguard Worker * we need to unroll it and call add_state_reference() for each row 2423*61046927SAndroid Build Coastguard Worker */ 2424*61046927SAndroid Build Coastguard Worker if (state_tokens[1] != state_tokens[2]) { 2425*61046927SAndroid Build Coastguard Worker int row; 2426*61046927SAndroid Build Coastguard Worker const int first_row = state_tokens[1]; 2427*61046927SAndroid Build Coastguard Worker const int last_row = state_tokens[2]; 2428*61046927SAndroid Build Coastguard Worker 2429*61046927SAndroid Build Coastguard Worker for (row = first_row; row <= last_row; row++) { 2430*61046927SAndroid Build Coastguard Worker state_tokens[1] = state_tokens[2] = row; 2431*61046927SAndroid Build Coastguard Worker 2432*61046927SAndroid Build Coastguard Worker idx = add_state_reference(prog->Parameters, state_tokens); 2433*61046927SAndroid Build Coastguard Worker if (param_var->param_binding_begin == ~0U) { 2434*61046927SAndroid Build Coastguard Worker param_var->param_binding_begin = idx; 2435*61046927SAndroid Build Coastguard Worker param_var->param_binding_swizzle = SWIZZLE_XYZW; 2436*61046927SAndroid Build Coastguard Worker } 2437*61046927SAndroid Build Coastguard Worker param_var->param_binding_length++; 2438*61046927SAndroid Build Coastguard Worker } 2439*61046927SAndroid Build Coastguard Worker } 2440*61046927SAndroid Build Coastguard Worker else { 2441*61046927SAndroid Build Coastguard Worker idx = add_state_reference(prog->Parameters, state_tokens); 2442*61046927SAndroid Build Coastguard Worker if (param_var->param_binding_begin == ~0U) { 2443*61046927SAndroid Build Coastguard Worker param_var->param_binding_begin = idx; 2444*61046927SAndroid Build Coastguard Worker param_var->param_binding_swizzle = SWIZZLE_XYZW; 2445*61046927SAndroid Build Coastguard Worker } 2446*61046927SAndroid Build Coastguard Worker param_var->param_binding_length++; 2447*61046927SAndroid Build Coastguard Worker } 2448*61046927SAndroid Build Coastguard Worker 2449*61046927SAndroid Build Coastguard Worker return idx; 2450*61046927SAndroid Build Coastguard Worker } 2451*61046927SAndroid Build Coastguard Worker 2452*61046927SAndroid Build Coastguard Worker 2453*61046927SAndroid Build Coastguard Worker /** 2454*61046927SAndroid Build Coastguard Worker * Put a float/vector constant/literal into the parameter list. 2455*61046927SAndroid Build Coastguard Worker * \param param_var returns info about the parameter/constant's location, 2456*61046927SAndroid Build Coastguard Worker * binding, type, etc. 2457*61046927SAndroid Build Coastguard Worker * \param vec the vector/constant to add 2458*61046927SAndroid Build Coastguard Worker * \param allowSwizzle if true, try to consolidate constants which only differ 2459*61046927SAndroid Build Coastguard Worker * by a swizzle. We don't want to do this when building 2460*61046927SAndroid Build Coastguard Worker * arrays of constants that may be indexed indirectly. 2461*61046927SAndroid Build Coastguard Worker * \return index of the constant in the parameter list. 2462*61046927SAndroid Build Coastguard Worker */ 2463*61046927SAndroid Build Coastguard Worker int 2464*61046927SAndroid Build Coastguard Worker initialize_symbol_from_const(struct gl_program *prog, 2465*61046927SAndroid Build Coastguard Worker struct asm_symbol *param_var, 2466*61046927SAndroid Build Coastguard Worker const struct asm_vector *vec, 2467*61046927SAndroid Build Coastguard Worker GLboolean allowSwizzle) 2468*61046927SAndroid Build Coastguard Worker { 2469*61046927SAndroid Build Coastguard Worker unsigned swizzle; 2470*61046927SAndroid Build Coastguard Worker const int idx = _mesa_add_unnamed_constant(prog->Parameters, 2471*61046927SAndroid Build Coastguard Worker vec->data, vec->count, 2472*61046927SAndroid Build Coastguard Worker allowSwizzle ? &swizzle : NULL); 2473*61046927SAndroid Build Coastguard Worker 2474*61046927SAndroid Build Coastguard Worker param_var->type = at_param; 2475*61046927SAndroid Build Coastguard Worker param_var->param_binding_type = PROGRAM_CONSTANT; 2476*61046927SAndroid Build Coastguard Worker 2477*61046927SAndroid Build Coastguard Worker if (param_var->param_binding_begin == ~0U) { 2478*61046927SAndroid Build Coastguard Worker param_var->param_binding_begin = idx; 2479*61046927SAndroid Build Coastguard Worker param_var->param_binding_swizzle = allowSwizzle ? swizzle : SWIZZLE_XYZW; 2480*61046927SAndroid Build Coastguard Worker } 2481*61046927SAndroid Build Coastguard Worker param_var->param_binding_length++; 2482*61046927SAndroid Build Coastguard Worker 2483*61046927SAndroid Build Coastguard Worker return idx; 2484*61046927SAndroid Build Coastguard Worker } 2485*61046927SAndroid Build Coastguard Worker 2486*61046927SAndroid Build Coastguard Worker 2487*61046927SAndroid Build Coastguard Worker char * 2488*61046927SAndroid Build Coastguard Worker make_error_string(const char *fmt, ...) 2489*61046927SAndroid Build Coastguard Worker { 2490*61046927SAndroid Build Coastguard Worker int length; 2491*61046927SAndroid Build Coastguard Worker char *str; 2492*61046927SAndroid Build Coastguard Worker va_list args; 2493*61046927SAndroid Build Coastguard Worker 2494*61046927SAndroid Build Coastguard Worker 2495*61046927SAndroid Build Coastguard Worker /* Call vsnprintf once to determine how large the final string is. Call it 2496*61046927SAndroid Build Coastguard Worker * again to do the actual formatting. from the vsnprintf manual page: 2497*61046927SAndroid Build Coastguard Worker * 2498*61046927SAndroid Build Coastguard Worker * Upon successful return, these functions return the number of 2499*61046927SAndroid Build Coastguard Worker * characters printed (not including the trailing '\0' used to end 2500*61046927SAndroid Build Coastguard Worker * output to strings). 2501*61046927SAndroid Build Coastguard Worker */ 2502*61046927SAndroid Build Coastguard Worker va_start(args, fmt); 2503*61046927SAndroid Build Coastguard Worker length = 1 + vsnprintf(NULL, 0, fmt, args); 2504*61046927SAndroid Build Coastguard Worker va_end(args); 2505*61046927SAndroid Build Coastguard Worker 2506*61046927SAndroid Build Coastguard Worker str = malloc(length); 2507*61046927SAndroid Build Coastguard Worker if (str) { 2508*61046927SAndroid Build Coastguard Worker va_start(args, fmt); 2509*61046927SAndroid Build Coastguard Worker vsnprintf(str, length, fmt, args); 2510*61046927SAndroid Build Coastguard Worker va_end(args); 2511*61046927SAndroid Build Coastguard Worker } 2512*61046927SAndroid Build Coastguard Worker 2513*61046927SAndroid Build Coastguard Worker return str; 2514*61046927SAndroid Build Coastguard Worker } 2515*61046927SAndroid Build Coastguard Worker 2516*61046927SAndroid Build Coastguard Worker 2517*61046927SAndroid Build Coastguard Worker void 2518*61046927SAndroid Build Coastguard Worker yyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s) 2519*61046927SAndroid Build Coastguard Worker { 2520*61046927SAndroid Build Coastguard Worker char *err_str; 2521*61046927SAndroid Build Coastguard Worker 2522*61046927SAndroid Build Coastguard Worker 2523*61046927SAndroid Build Coastguard Worker err_str = make_error_string("glProgramStringARB(%s)\n", s); 2524*61046927SAndroid Build Coastguard Worker if (err_str) { 2525*61046927SAndroid Build Coastguard Worker _mesa_error(state->ctx, GL_INVALID_OPERATION, "%s", err_str); 2526*61046927SAndroid Build Coastguard Worker free(err_str); 2527*61046927SAndroid Build Coastguard Worker } 2528*61046927SAndroid Build Coastguard Worker 2529*61046927SAndroid Build Coastguard Worker err_str = make_error_string("line %u, char %u: error: %s\n", 2530*61046927SAndroid Build Coastguard Worker locp->first_line, locp->first_column, s); 2531*61046927SAndroid Build Coastguard Worker _mesa_set_program_error(state->ctx, locp->position, err_str); 2532*61046927SAndroid Build Coastguard Worker 2533*61046927SAndroid Build Coastguard Worker if (err_str) { 2534*61046927SAndroid Build Coastguard Worker free(err_str); 2535*61046927SAndroid Build Coastguard Worker } 2536*61046927SAndroid Build Coastguard Worker } 2537*61046927SAndroid Build Coastguard Worker 2538*61046927SAndroid Build Coastguard Worker 2539*61046927SAndroid Build Coastguard Worker GLboolean 2540*61046927SAndroid Build Coastguard Worker _mesa_parse_arb_program(struct gl_context *ctx, GLenum target, const GLubyte *str, 2541*61046927SAndroid Build Coastguard Worker GLsizei len, struct asm_parser_state *state) 2542*61046927SAndroid Build Coastguard Worker { 2543*61046927SAndroid Build Coastguard Worker struct asm_instruction *inst; 2544*61046927SAndroid Build Coastguard Worker unsigned i; 2545*61046927SAndroid Build Coastguard Worker GLubyte *strz; 2546*61046927SAndroid Build Coastguard Worker GLboolean result = GL_FALSE; 2547*61046927SAndroid Build Coastguard Worker void *temp; 2548*61046927SAndroid Build Coastguard Worker struct asm_symbol *sym; 2549*61046927SAndroid Build Coastguard Worker 2550*61046927SAndroid Build Coastguard Worker state->ctx = ctx; 2551*61046927SAndroid Build Coastguard Worker state->prog->Target = target; 2552*61046927SAndroid Build Coastguard Worker state->prog->Parameters = _mesa_new_parameter_list(); 2553*61046927SAndroid Build Coastguard Worker 2554*61046927SAndroid Build Coastguard Worker /* Make a copy of the program string and force it to be newline and NUL-terminated. 2555*61046927SAndroid Build Coastguard Worker */ 2556*61046927SAndroid Build Coastguard Worker strz = (GLubyte *) ralloc_size(state->mem_ctx, len + 2); 2557*61046927SAndroid Build Coastguard Worker if (strz == NULL) { 2558*61046927SAndroid Build Coastguard Worker if (state->prog->Parameters) { 2559*61046927SAndroid Build Coastguard Worker _mesa_free_parameter_list(state->prog->Parameters); 2560*61046927SAndroid Build Coastguard Worker state->prog->Parameters = NULL; 2561*61046927SAndroid Build Coastguard Worker } 2562*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); 2563*61046927SAndroid Build Coastguard Worker return GL_FALSE; 2564*61046927SAndroid Build Coastguard Worker } 2565*61046927SAndroid Build Coastguard Worker memcpy (strz, str, len); 2566*61046927SAndroid Build Coastguard Worker strz[len] = '\n'; 2567*61046927SAndroid Build Coastguard Worker strz[len + 1] = '\0'; 2568*61046927SAndroid Build Coastguard Worker 2569*61046927SAndroid Build Coastguard Worker state->prog->String = strz; 2570*61046927SAndroid Build Coastguard Worker 2571*61046927SAndroid Build Coastguard Worker state->st = _mesa_symbol_table_ctor(); 2572*61046927SAndroid Build Coastguard Worker 2573*61046927SAndroid Build Coastguard Worker state->limits = (target == GL_VERTEX_PROGRAM_ARB) 2574*61046927SAndroid Build Coastguard Worker ? & ctx->Const.Program[MESA_SHADER_VERTEX] 2575*61046927SAndroid Build Coastguard Worker : & ctx->Const.Program[MESA_SHADER_FRAGMENT]; 2576*61046927SAndroid Build Coastguard Worker 2577*61046927SAndroid Build Coastguard Worker state->MaxTextureImageUnits = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; 2578*61046927SAndroid Build Coastguard Worker state->MaxTextureCoordUnits = ctx->Const.MaxTextureCoordUnits; 2579*61046927SAndroid Build Coastguard Worker state->MaxTextureUnits = ctx->Const.MaxTextureUnits; 2580*61046927SAndroid Build Coastguard Worker state->MaxClipPlanes = ctx->Const.MaxClipPlanes; 2581*61046927SAndroid Build Coastguard Worker state->MaxLights = ctx->Const.MaxLights; 2582*61046927SAndroid Build Coastguard Worker state->MaxProgramMatrices = ctx->Const.MaxProgramMatrices; 2583*61046927SAndroid Build Coastguard Worker state->MaxDrawBuffers = ctx->Const.MaxDrawBuffers; 2584*61046927SAndroid Build Coastguard Worker 2585*61046927SAndroid Build Coastguard Worker state->state_param_enum_env = (target == GL_VERTEX_PROGRAM_ARB) 2586*61046927SAndroid Build Coastguard Worker ? STATE_VERTEX_PROGRAM_ENV : STATE_FRAGMENT_PROGRAM_ENV; 2587*61046927SAndroid Build Coastguard Worker state->state_param_enum_local = (target == GL_VERTEX_PROGRAM_ARB) 2588*61046927SAndroid Build Coastguard Worker ? STATE_VERTEX_PROGRAM_LOCAL : STATE_FRAGMENT_PROGRAM_LOCAL; 2589*61046927SAndroid Build Coastguard Worker 2590*61046927SAndroid Build Coastguard Worker _mesa_set_program_error(ctx, -1, NULL); 2591*61046927SAndroid Build Coastguard Worker 2592*61046927SAndroid Build Coastguard Worker _mesa_program_lexer_ctor(& state->scanner, state, (const char *) strz, len + 1); 2593*61046927SAndroid Build Coastguard Worker yyparse(state); 2594*61046927SAndroid Build Coastguard Worker _mesa_program_lexer_dtor(state->scanner); 2595*61046927SAndroid Build Coastguard Worker 2596*61046927SAndroid Build Coastguard Worker /* Remove the newline we added so reflection returns the original string */ 2597*61046927SAndroid Build Coastguard Worker strz[len] = '\0'; 2598*61046927SAndroid Build Coastguard Worker 2599*61046927SAndroid Build Coastguard Worker if (ctx->Program.ErrorPos != -1) { 2600*61046927SAndroid Build Coastguard Worker goto error; 2601*61046927SAndroid Build Coastguard Worker } 2602*61046927SAndroid Build Coastguard Worker 2603*61046927SAndroid Build Coastguard Worker if (! _mesa_layout_parameters(state)) { 2604*61046927SAndroid Build Coastguard Worker struct YYLTYPE loc; 2605*61046927SAndroid Build Coastguard Worker 2606*61046927SAndroid Build Coastguard Worker loc.first_line = 0; 2607*61046927SAndroid Build Coastguard Worker loc.first_column = 0; 2608*61046927SAndroid Build Coastguard Worker loc.position = len; 2609*61046927SAndroid Build Coastguard Worker 2610*61046927SAndroid Build Coastguard Worker yyerror(& loc, state, "invalid PARAM usage"); 2611*61046927SAndroid Build Coastguard Worker goto error; 2612*61046927SAndroid Build Coastguard Worker } 2613*61046927SAndroid Build Coastguard Worker 2614*61046927SAndroid Build Coastguard Worker 2615*61046927SAndroid Build Coastguard Worker 2616*61046927SAndroid Build Coastguard Worker /* Add one instruction to store the "END" instruction. 2617*61046927SAndroid Build Coastguard Worker */ 2618*61046927SAndroid Build Coastguard Worker state->prog->arb.Instructions = 2619*61046927SAndroid Build Coastguard Worker rzalloc_array(state->mem_ctx, struct prog_instruction, 2620*61046927SAndroid Build Coastguard Worker state->prog->arb.NumInstructions + 1); 2621*61046927SAndroid Build Coastguard Worker 2622*61046927SAndroid Build Coastguard Worker if (state->prog->arb.Instructions == NULL) { 2623*61046927SAndroid Build Coastguard Worker goto error; 2624*61046927SAndroid Build Coastguard Worker } 2625*61046927SAndroid Build Coastguard Worker 2626*61046927SAndroid Build Coastguard Worker inst = state->inst_head; 2627*61046927SAndroid Build Coastguard Worker for (i = 0; i < state->prog->arb.NumInstructions; i++) { 2628*61046927SAndroid Build Coastguard Worker struct asm_instruction *const temp = inst->next; 2629*61046927SAndroid Build Coastguard Worker 2630*61046927SAndroid Build Coastguard Worker state->prog->arb.Instructions[i] = inst->Base; 2631*61046927SAndroid Build Coastguard Worker inst = temp; 2632*61046927SAndroid Build Coastguard Worker } 2633*61046927SAndroid Build Coastguard Worker 2634*61046927SAndroid Build Coastguard Worker /* Finally, tag on an OPCODE_END instruction */ 2635*61046927SAndroid Build Coastguard Worker { 2636*61046927SAndroid Build Coastguard Worker const GLuint numInst = state->prog->arb.NumInstructions; 2637*61046927SAndroid Build Coastguard Worker _mesa_init_instructions(state->prog->arb.Instructions + numInst, 1); 2638*61046927SAndroid Build Coastguard Worker state->prog->arb.Instructions[numInst].Opcode = OPCODE_END; 2639*61046927SAndroid Build Coastguard Worker } 2640*61046927SAndroid Build Coastguard Worker state->prog->arb.NumInstructions++; 2641*61046927SAndroid Build Coastguard Worker 2642*61046927SAndroid Build Coastguard Worker state->prog->arb.NumParameters = state->prog->Parameters->NumParameters; 2643*61046927SAndroid Build Coastguard Worker state->prog->arb.NumAttributes = 2644*61046927SAndroid Build Coastguard Worker util_bitcount64(state->prog->info.inputs_read); 2645*61046927SAndroid Build Coastguard Worker 2646*61046927SAndroid Build Coastguard Worker /* 2647*61046927SAndroid Build Coastguard Worker * Initialize native counts to logical counts. The device driver may 2648*61046927SAndroid Build Coastguard Worker * change them if program is translated into a hardware program. 2649*61046927SAndroid Build Coastguard Worker */ 2650*61046927SAndroid Build Coastguard Worker state->prog->arb.NumNativeInstructions = state->prog->arb.NumInstructions; 2651*61046927SAndroid Build Coastguard Worker state->prog->arb.NumNativeTemporaries = state->prog->arb.NumTemporaries; 2652*61046927SAndroid Build Coastguard Worker state->prog->arb.NumNativeParameters = state->prog->arb.NumParameters; 2653*61046927SAndroid Build Coastguard Worker state->prog->arb.NumNativeAttributes = state->prog->arb.NumAttributes; 2654*61046927SAndroid Build Coastguard Worker state->prog->arb.NumNativeAddressRegs = state->prog->arb.NumAddressRegs; 2655*61046927SAndroid Build Coastguard Worker 2656*61046927SAndroid Build Coastguard Worker result = GL_TRUE; 2657*61046927SAndroid Build Coastguard Worker 2658*61046927SAndroid Build Coastguard Worker error: 2659*61046927SAndroid Build Coastguard Worker for (inst = state->inst_head; inst != NULL; inst = temp) { 2660*61046927SAndroid Build Coastguard Worker temp = inst->next; 2661*61046927SAndroid Build Coastguard Worker free(inst); 2662*61046927SAndroid Build Coastguard Worker } 2663*61046927SAndroid Build Coastguard Worker 2664*61046927SAndroid Build Coastguard Worker state->inst_head = NULL; 2665*61046927SAndroid Build Coastguard Worker state->inst_tail = NULL; 2666*61046927SAndroid Build Coastguard Worker 2667*61046927SAndroid Build Coastguard Worker for (sym = state->sym; sym != NULL; sym = temp) { 2668*61046927SAndroid Build Coastguard Worker temp = sym->next; 2669*61046927SAndroid Build Coastguard Worker 2670*61046927SAndroid Build Coastguard Worker free((void *) sym->name); 2671*61046927SAndroid Build Coastguard Worker free(sym); 2672*61046927SAndroid Build Coastguard Worker } 2673*61046927SAndroid Build Coastguard Worker state->sym = NULL; 2674*61046927SAndroid Build Coastguard Worker 2675*61046927SAndroid Build Coastguard Worker _mesa_symbol_table_dtor(state->st); 2676*61046927SAndroid Build Coastguard Worker state->st = NULL; 2677*61046927SAndroid Build Coastguard Worker 2678*61046927SAndroid Build Coastguard Worker if (result != GL_TRUE) { 2679*61046927SAndroid Build Coastguard Worker if (state->prog->Parameters) { 2680*61046927SAndroid Build Coastguard Worker _mesa_free_parameter_list(state->prog->Parameters); 2681*61046927SAndroid Build Coastguard Worker state->prog->Parameters = NULL; 2682*61046927SAndroid Build Coastguard Worker } 2683*61046927SAndroid Build Coastguard Worker ralloc_free(state->prog->String); 2684*61046927SAndroid Build Coastguard Worker state->prog->String = NULL; 2685*61046927SAndroid Build Coastguard Worker } 2686*61046927SAndroid Build Coastguard Worker 2687*61046927SAndroid Build Coastguard Worker return result; 2688*61046927SAndroid Build Coastguard Worker } 2689