program_parse.y revision ef80c2012dff343eb5ff571cea8377ff6a87c0c5
1770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{ 2770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* 3770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copyright © 2009 Intel Corporation 4770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 5770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 6770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * copy of this software and associated documentation files (the "Software"), 7770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to deal in the Software without restriction, including without limitation 8770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 10770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software is furnished to do so, subject to the following conditions: 11770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 12770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The above copyright notice and this permission notice (including the next 13770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * paragraph) shall be included in all copies or substantial portions of the 14770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software. 15770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 16770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * DEALINGS IN THE SOFTWARE. 23770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 24770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <stdio.h> 25770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <stdlib.h> 26770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <string.h> 27770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 28770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "main/mtypes.h" 29ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick#include "main/imports.h" 30ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick#include "program.h" 31770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_parameter.h" 32770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_parameter_layout.h" 33770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_statevars.h" 34770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_instruction.h" 35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 36770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "symbol_table.h" 37770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "program_parser.h" 38770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 39770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern void *yy_scan_string(char *); 40770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern void yy_delete_buffer(void *); 41770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 42770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_symbol *declare_variable(struct asm_parser_state *state, 43770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick char *name, enum asm_type t, struct YYLTYPE *locp); 44770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 45ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanickstatic int add_state_reference(struct gl_program_parameter_list *param_list, 46ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick const gl_state_index tokens[STATE_LENGTH]); 47ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick 48770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_state(struct gl_program *prog, 49770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]); 50770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 51770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_param(struct gl_program *prog, 52770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]); 53770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 54770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_const(struct gl_program *prog, 55770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, const struct asm_vector *vec); 56770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int yyparse(struct asm_parser_state *state); 58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 59ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanickstatic char *make_error_string(const char *fmt, ...); 60ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick 61770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void yyerror(struct YYLTYPE *locp, struct asm_parser_state *state, 62770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const char *s); 63770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int validate_inputs(struct YYLTYPE *locp, 65770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_parser_state *state); 66770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 67770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_dst_reg(struct prog_dst_register *r); 68770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_src_reg(struct asm_src_register *r); 70770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 71770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op, 72770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct prog_dst_register *dst, const struct asm_src_register *src0, 73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src1, const struct asm_src_register *src2); 74770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 75770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef FALSE 76770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define FALSE 0 77770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define TRUE (!FALSE) 78770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif 79770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 80770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLLOC_DEFAULT(Current, Rhs, N) \ 81770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick do { \ 82770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (YYID(N)) { \ 83770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 84770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).position = YYRHSLOC(Rhs, 1).position; \ 86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { \ 89770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_line = YYRHSLOC(Rhs, 0).last_line; \ 90770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_line = (Current).first_line; \ 91770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_column = YYRHSLOC(Rhs, 0).last_column; \ 92770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_column = (Current).first_column; \ 93770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).position = YYRHSLOC(Rhs, 0).position \ 94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick + (Current).first_column; \ 95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } \ 96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } while(YYID(0)) 97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLEX_PARAM state->scanner 99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%} 100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%pure-parser 102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%locations 103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%parse-param { struct asm_parser_state *state } 104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%error-verbose 105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%lex-param { void *scanner } 106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%union { 108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *inst; 109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *sym; 110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol temp_sym; 111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_swizzle_mask swiz_mask; 112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_src_register src_reg; 113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct prog_dst_register dst_reg; 114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct prog_instruction temp_inst; 115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick char *string; 116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned result; 117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned attrib; 118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int integer; 119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick float real; 120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned state[5]; 121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int negate; 122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_vector vector; 123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_inst_opcode opcode; 124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ARBvp_10 ARBfp_10 127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* Tokens for assembler pseudo-ops */ 129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> ADDRESS 130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ALIAS ATTRIB 131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OPTION OUTPUT 132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PARAM 133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> TEMP 134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token END 135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Tokens for instructions */ 137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <temp_inst> BIN_OP BINSC_OP SAMPLE_OP SCALAR_OP TRI_OP VECTOR_OP 138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <temp_inst> ARL KIL SWZ 139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> INTEGER 141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <real> REAL 142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token AMBIENT ATTENUATION 144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token BACK 145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token CLIP COLOR 146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DEPTH DIFFUSE DIRECTION 147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token EMISSION ENV EYE 148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token FOG FOGCOORD FRAGMENT FRONT 149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token HALF 150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token INVERSE INVTRANS 151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token LIGHT LIGHTMODEL LIGHTPROD LOCAL 152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token MATERIAL MAT_PROGRAM MATRIX MATRIXINDEX MODELVIEW MVP 153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token NORMAL 154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OBJECT 155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PALETTE PARAMS PLANE POINT POINTSIZE POSITION PRIMARY PROGRAM PROJECTION 156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token RANGE RESULT ROW 157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token SCENECOLOR SECONDARY SHININESS SIZE SPECULAR SPOT STATE 158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE 159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT 160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token VERTEX VTXATTRIB 161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token WEIGHT 162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <string> IDENTIFIER 164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <swiz_mask> MASK4 MASK3 MASK2 MASK1 SWIZZLE 165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT_DOT 166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT 167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> instruction ALU_instruction TexInstruction 169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> ARL_instruction VECTORop_instruction 170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> SCALARop_instruction BINSCop_instruction BINop_instruction 171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> TRIop_instruction SWZ_instruction SAMPLE_instruction 172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> KIL_instruction 173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <dst_reg> dstReg maskedDstReg maskedAddrReg 175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <src_reg> srcReg scalarSrcReg swizzleSrcReg 176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> scalarSuffix swizzleSuffix extendedSwizzle extSwizComp 177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> optionalMask 178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> extSwizSel 179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> progParamArray 181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> addrRegRelOffset addrRegPosOffset addrRegNegOffset 182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <src_reg> progParamArrayMem progParamArrayAbs progParamArrayRel 183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> addrReg 184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> addrComponent addrWriteMask 185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <result> resultBinding resultColBinding 187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optFaceType optColorType 188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optResultFaceType optResultColorType 189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexImageUnitNum texImageUnitNum 191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexCoordUnitNum texCoordUnitNum 192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optLegacyTexUnitNum legacyTexUnitNum 193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> texImageUnit texTarget 194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> vtxAttribNum 195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <attrib> attribBinding vtxAttribItem fragAttribItem 197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleInit paramSingleItemDecl 199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optArraySize 200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateSingleItem stateMultipleItem 202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMaterialItem 203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLightItem stateLightModelItem stateLightProdItem 204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateTexGenItem stateFogItem stateClipPlaneItem statePointItem 205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixItem stateMatrixRow stateMatrixRows 206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateTexEnvItem 207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLModProperty 209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixName optMatrixRows 210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateMatProperty 212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightProperty stateSpotProperty 213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightNumber stateLProdProperty 214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexGenType stateTexGenCoord 215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexEnvProperty 216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateFogProperty 217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateClipPlaneNum 218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> statePointProperty 219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptMatModifier stateMatModifier stateMatrixRowNum 221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptModMatNum stateModMatNum statePaletteMatNum 222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateProgramMatNum 223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> ambDiffSpecProperty 225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programSingleItem progEnvParam progLocalParam 227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programMultipleItem progEnvParams progLocalParams 228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramMultipleInit paramMultInitList paramMultipleItem 230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleItemUse 231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> progEnvParamNum progLocalParamNum 233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> progEnvParamNums progLocalParamNums 234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstDecl paramConstUse 236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstScalarDecl paramConstScalarUse paramConstVector 237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <real> signedFloatConstant 238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <negate> optionalSign 239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{ 241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, 242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick void *yyscanner); 243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%} 244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%% 246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickprogram: language optionSequence statementSequence END 248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanicklanguage: ARBvp_10 251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) { 253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid fragment program header"); 254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->mode = ARB_vertex; 257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ARBfp_10 259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) { 261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid vertex program header"); 262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->mode = ARB_fragment; 264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 267770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionSequence: optionSequence option 268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | 269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickoption: OPTION IDENTIFIER ';' 272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int valid = 0; 274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick valid = _mesa_ARBvp_parse_option(state, $2); 277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (state->mode == ARB_fragment) { 278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick valid = _mesa_ARBfp_parse_option(state, $2); 279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!valid) { 283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid option string"); 284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 289770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatementSequence: statementSequence statement 290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | 291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatement: instruction ';' 294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 295770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 != NULL) { 296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->inst_tail == NULL) { 297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_head = $1; 298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_tail->next = $1; 300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_tail = $1; 303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1->next = NULL; 304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumInstructions++; 306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | namingStatement ';' 309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinstruction: ALU_instruction 3120db5ef074169589bc4d665094147aa284a5496d7Ian Romanick { 3130db5ef074169589bc4d665094147aa284a5496d7Ian Romanick $$ = $1; 3140db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->prog->NumAluInstructions++; 3150db5ef074169589bc4d665094147aa284a5496d7Ian Romanick } 316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TexInstruction 3170db5ef074169589bc4d665094147aa284a5496d7Ian Romanick { 3180db5ef074169589bc4d665094147aa284a5496d7Ian Romanick $$ = $1; 3190db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->prog->NumTexInstructions++; 3200db5ef074169589bc4d665094147aa284a5496d7Ian Romanick } 321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 323770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALU_instruction: ARL_instruction 324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | VECTORop_instruction 325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SCALARop_instruction 326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BINSCop_instruction 327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BINop_instruction 328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TRIop_instruction 329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SWZ_instruction 330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 332770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTexInstruction: SAMPLE_instruction 333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | KIL_instruction 334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 336770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickARL_instruction: ARL maskedAddrReg ',' scalarSrcReg 337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor(OPCODE_ARL, & $2, & $4, NULL, NULL); 339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 342770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickVECTORop_instruction: VECTOR_OP maskedDstReg ',' swizzleSrcReg 343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL); 345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.SaturateMode = $1.SaturateMode; 346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 349770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSCALARop_instruction: SCALAR_OP maskedDstReg ',' scalarSrcReg 350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL); 352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.SaturateMode = $1.SaturateMode; 353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 356770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINSCop_instruction: BINSC_OP maskedDstReg ',' scalarSrcReg ',' scalarSrcReg 357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, NULL); 359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.SaturateMode = $1.SaturateMode; 360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 364770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINop_instruction: BIN_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg 365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, NULL); 367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.SaturateMode = $1.SaturateMode; 368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 371770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTRIop_instruction: TRI_OP maskedDstReg ',' 372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg 373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, & $8); 375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.SaturateMode = $1.SaturateMode; 376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 379770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget 380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL); 382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($$ != NULL) { 383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.SaturateMode = $1.SaturateMode; 384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.TexSrcUnit = $6; 385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.TexSrcTarget = $8; 3860db5ef074169589bc4d665094147aa284a5496d7Ian Romanick 3870db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->prog->TexturesUsed[$6] |= (1U << $8); 388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 392770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickKIL_instruction: KIL swizzleSrcReg 393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL); 3950db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->fragment.UsesKill = 1; 396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 399770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnit: TEXTURE_UNIT optTexImageUnitNum 400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 405770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexTarget: TEX_1D { $$ = TEXTURE_1D_INDEX; } 406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_2D { $$ = TEXTURE_2D_INDEX; } 407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_3D { $$ = TEXTURE_3D_INDEX; } 408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; } 409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_RECT { $$ = TEXTURE_RECT_INDEX; } 410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 412770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle 413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FIXME: Is this correct? Should the extenedSwizzle be applied 415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FIXME: to the existing swizzle? 416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $4.Base.Swizzle = $6.swizzle; 418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor(OPCODE_SWZ, & $2, & $4, NULL, NULL); 420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.SaturateMode = $1.SaturateMode; 421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 424770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickscalarSrcReg: optionalSign srcReg scalarSuffix 425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1) { 429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Negate = ~$$.Base.Negate; 430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 431770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $3.swizzle); 434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 437770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSrcReg: optionalSign srcReg swizzleSuffix 438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1) { 442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Negate = ~$$.Base.Negate; 443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $3.swizzle); 447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 450770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedDstReg: dstReg optionalMask 451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.WriteMask = $2.mask; 454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($$.File == PROGRAM_OUTPUT) { 456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Technically speaking, this should check that it is in 457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * vertex program mode. However, PositionInvariant can never be 458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * set in fragment program mode, so it is somewhat irrelevant. 459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->option.PositionInvariant 461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && ($$.Index == VERT_RESULT_HPOS)) { 462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "position-invariant programs cannot " 463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "write position"); 464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->OutputsWritten |= (1U << $$.Index); 468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 472770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedAddrReg: addrReg addrWriteMask 473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_dst_reg(& $$); 475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = PROGRAM_ADDRESS; 476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = 0; 477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.WriteMask = $2.mask; 478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 481770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextendedSwizzle: extSwizComp ',' extSwizComp ',' extSwizComp ',' extSwizComp 482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.swizzle = MAKE_SWIZZLE4($1.swizzle, $3.swizzle, 484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $5.swizzle, $7.swizzle); 485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.mask = ($1.mask) | ($3.mask << 1) | ($5.mask << 2) 486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ($7.mask << 3); 487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 490770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizComp: optionalSign extSwizSel 491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.swizzle = $2; 493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.mask = ($1) ? 1 : 0; 494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 497770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizSel: INTEGER 498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (($1 != 0) && ($1 != 1)) { 500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = ($1 == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE; 505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | IDENTIFIER 507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strlen($1) > 1) { 509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch ($1[0]) { 514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'x': 515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = SWIZZLE_X; 516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'y': 518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = SWIZZLE_Y; 519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'z': 521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = SWIZZLE_Z; 522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'w': 524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = SWIZZLE_W; 525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 526770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 534770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicksrcReg: IDENTIFIER /* temporaryReg | progParamSingle */ 535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_param) && (s->type != at_temp) 543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && (s->type != at_attrib)) { 544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type == at_param) && s->param_is_array) { 547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "non-array access to array PARAM"); 548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch (s->type) { 553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_temp: 554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = PROGRAM_TEMPORARY; 555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = s->temp_binding; 556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_param: 558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = s->param_binding_type; 559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = s->param_binding_begin; 560770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 561770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_attrib: 562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = PROGRAM_INPUT; 563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = s->attrib_binding; 564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->InputsRead |= (1U << $$.Base.Index); 565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!validate_inputs(& @1, state)) { 567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | attribBinding 577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = PROGRAM_INPUT; 580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1; 581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->InputsRead |= (1U << $$.Base.Index); 582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!validate_inputs(& @1, state)) { 584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 587770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progParamArray '[' progParamArrayMem ']' 588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (! $3.Base.RelAddr 590ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick && ((unsigned) $3.Base.Index >= $1->param_binding_length)) { 591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @3, state, "out of bounds array access"); 592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = $1->param_binding_type; 597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 598770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($3.Base.RelAddr) { 599770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1->param_accessed_indirectly = 1; 600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.RelAddr = 1; 602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $3.Base.Index; 603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Symbol = $1; 604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1->param_binding_begin + $3.Base.Index; 606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramSingleItemUse 609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 61169d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick $$.Base.File = ($1.name != NULL) 61269d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick ? $1.param_binding_type 61369d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick : PROGRAM_CONSTANT; 614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1.param_binding_begin; 615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 617770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 618770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickdstReg: resultBinding 619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_dst_reg(& $$); 621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = PROGRAM_OUTPUT; 622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = $1; 623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | IDENTIFIER /* temporaryReg | vertexResultReg */ 625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_output) && (s->type != at_temp)) { 633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_dst_reg(& $$); 638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s->type == at_temp) { 639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = PROGRAM_TEMPORARY; 640770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = s->temp_binding; 641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = s->param_binding_type; 643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = s->param_binding_begin; 644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 648770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArray: IDENTIFIER 649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_param) || !s->param_is_array) { 657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "array access to non-PARAM variable"); 658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = s; 661770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 665770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayMem: progParamArrayAbs | progParamArrayRel; 666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 667770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayAbs: INTEGER 668770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 669770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 670770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1; 671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 672770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 673770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 674770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayRel: addrReg addrComponent addrRegRelOffset 675770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 676770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for multiple address registers. 677770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 678770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for 4-component address registers. 679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 680770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.RelAddr = 1; 682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $3; 683770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 686770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegRelOffset: { $$ = 0; } 687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '+' addrRegPosOffset { $$ = $2; } 688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '-' addrRegNegOffset { $$ = -$2; } 689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 691770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegPosOffset: INTEGER 692770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 693770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (($1 < 0) || ($1 > 63)) { 694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "relative address offset too large (positive)"); 696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 701770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 703770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegNegOffset: INTEGER 704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (($1 < 0) || ($1 > 64)) { 706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "relative address offset too large (negative)"); 708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 713770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 715770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrReg: IDENTIFIER 716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 717770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 718770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 719770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 721770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid array member"); 722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 723770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (s->type != at_address) { 724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "invalid variable for indexed array access"); 726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = s; 729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 733770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrComponent: MASK1 734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1.mask != WRITEMASK_X) { 736770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid address component selector"); 737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 744770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrWriteMask: MASK1 745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1.mask != WRITEMASK_X) { 747770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "address register write mask must be \".x\""); 749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 756770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickscalarSuffix: MASK1; 757770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 758770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSuffix: MASK1 759770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MASK4 760770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SWIZZLE 761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 764770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalMask: MASK4 | MASK3 | MASK2 | MASK1 765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 766770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 768770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicknamingStatement: ATTRIB_statement 769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PARAM_statement 770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEMP_statement 771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ADDRESS_statement 772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | OUTPUT_statement 773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ALIAS_statement 774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 776770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickATTRIB_statement: ATTRIB IDENTIFIER '=' attribBinding 777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, at_attrib, & @2); 780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->attrib_binding = $4; 785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->InputsBound |= (1U << s->attrib_binding); 786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!validate_inputs(& @4, state)) { 788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 794770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickattribBinding: VERTEX vtxAttribItem 795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRAGMENT fragAttribItem 799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 802770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 804770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribItem: POSITION 805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_POS; 807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | WEIGHT vtxOptWeightNum 809770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_WEIGHT; 811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | NORMAL 813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_NORMAL; 815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | COLOR optColorType 817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_COLOR0 + $2; 819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FOGCOORD 821770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_FOG; 823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXCOORD optTexCoordUnitNum 825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_TEX0 + $2; 827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MATRIXINDEX '[' vtxWeightNum ']' 829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 831770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | VTXATTRIB '[' vtxAttribNum ']' 833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_GENERIC0 + $3; 835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 838770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribNum: INTEGER 839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 840ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxAttribs) { 841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid vertex attribute reference"); 842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 849770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxOptWeightNum: | '[' vtxWeightNum ']'; 850770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxWeightNum: INTEGER; 851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 852770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickfragAttribItem: POSITION 853770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 854770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_WPOS; 855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 856770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | COLOR optColorType 857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_COL0 + $2; 859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 860770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FOGCOORD 861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 862770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_FOGC; 863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXCOORD optTexCoordUnitNum 865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_TEX0 + $2; 867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 869770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 870770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_statement: PARAM_singleStmt | PARAM_multipleStmt; 871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 872770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_singleStmt: PARAM IDENTIFIER paramSingleInit 873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, at_param, & @2); 876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 879770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 880770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_type = $3.param_binding_type; 881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_begin = $3.param_binding_begin; 882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_length = $3.param_binding_length; 883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_is_array = 0; 884770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 886770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 887770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 888770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_multipleStmt: PARAM IDENTIFIER '[' optArraySize ']' paramMultipleInit 889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 890ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if (($4 != 0) && ((unsigned) $4 != $6.param_binding_length)) { 891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @4, state, 892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "parameter array size and number of bindings must match"); 893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, $6.type, & @2); 897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 898770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_type = $6.param_binding_type; 902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_begin = $6.param_binding_begin; 903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_length = $6.param_binding_length; 904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_is_array = 1; 905770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 910770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptArraySize: 911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 914770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INTEGER 915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 916ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if (($1 < 1) || ((unsigned) $1 >= state->limits->MaxParameters)) { 917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid parameter array size"); 918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 925770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleInit: '=' paramSingleItemDecl 926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 931770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleInit: '=' '{' paramMultInitList '}' 932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $3; 934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 937770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultInitList: paramMultipleItem 938770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramMultInitList ',' paramMultipleItem 939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 940770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1.param_binding_length += $3.param_binding_length; 941770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 942770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 943770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 944770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 945770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemDecl: stateSingleItem 946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programSingleItem 952770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 954770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 955770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 956770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 957770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstDecl 958770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_const(state->prog, & $$, & $1); 962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 965770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemUse: stateSingleItem 966770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 971770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programSingleItem 972770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstUse 978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_const(state->prog, & $$, & $1); 982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 983770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 985770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleItem: stateMultipleItem 986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 990770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programMultipleItem 992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstDecl 998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_const(state->prog, & $$, & $1); 1002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1005770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMultipleItem: stateSingleItem { memcpy($$, $1, sizeof($$)); } 1006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateMatrixRows { memcpy($$, $2, sizeof($$)); } 1007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1009770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSingleItem: STATE stateMaterialItem { memcpy($$, $2, sizeof($$)); } 1010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightItem { memcpy($$, $2, sizeof($$)); } 1011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightModelItem { memcpy($$, $2, sizeof($$)); } 1012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightProdItem { memcpy($$, $2, sizeof($$)); } 1013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateTexGenItem { memcpy($$, $2, sizeof($$)); } 1014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateTexEnvItem { memcpy($$, $2, sizeof($$)); } 1015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateFogItem { memcpy($$, $2, sizeof($$)); } 1016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateClipPlaneItem { memcpy($$, $2, sizeof($$)); } 1017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE statePointItem { memcpy($$, $2, sizeof($$)); } 1018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateMatrixRow { memcpy($$, $2, sizeof($$)); } 1019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1021770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMaterialItem: MATERIAL optFaceType stateMatProperty 1022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MATERIAL; 1025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1030770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatProperty: ambDiffSpecProperty 1031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | EMISSION 1035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_EMISSION; 1037770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1038770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SHININESS 1039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1040770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SHININESS; 1041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1042770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1044770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightItem: LIGHT '[' stateLightNumber ']' stateLightProperty 1045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1046770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1047770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHT; 1048770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1049770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $5; 1050770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1053770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProperty: ambDiffSpecProperty 1054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | POSITION 1058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1059770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POSITION; 1060770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1061770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ATTENUATION 1062770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_ATTENUATION; 1064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SPOT stateSpotProperty 1066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1067770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1068770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1069770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | HALF 1070770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1071770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_HALF_VECTOR; 1072770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1073770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1074770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1075770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSpotProperty: DIRECTION 1076770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1077770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SPOT_DIRECTION; 1078770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1079770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1080770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1081770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightModelItem: LIGHTMODEL stateLModProperty 1082770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1083770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2[0]; 1084770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2[1]; 1085770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1086770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1087770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1088770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLModProperty: AMBIENT 1089770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1090770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1091770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTMODEL_AMBIENT; 1092770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1093770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | optFaceType SCENECOLOR 1094770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1095770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1096770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTMODEL_SCENECOLOR; 1097770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1101770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProdItem: LIGHTPROD '[' stateLightNumber ']' optFaceType stateLProdProperty 1102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTPROD; 1105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $5; 1107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $6; 1108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1111770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLProdProperty: ambDiffSpecProperty; 1112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1113770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvItem: TEXENV optLegacyTexUnitNum stateTexEnvProperty 1114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $3; 1117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1121770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvProperty: COLOR 1122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXENV_COLOR; 1124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1127770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickambDiffSpecProperty: AMBIENT 1128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_AMBIENT; 1130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | DIFFUSE 1132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_DIFFUSE; 1134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SPECULAR 1136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SPECULAR; 1138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1141770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightNumber: INTEGER 1142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1143ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxLights) { 1144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid light selector"); 1145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1152770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenItem: TEXGEN optTexCoordUnitNum stateTexGenType stateTexGenCoord 1153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_TEXGEN; 1156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3 + $4; 1158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1161770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenType: EYE 1162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_S; 1164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | OBJECT 1166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_OBJECT_S; 1168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1170770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenCoord: TEXGEN_S 1171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S; 1173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_T 1175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S; 1177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_R 1179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S; 1181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_Q 1183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S; 1185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1188770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogItem: FOG stateFogProperty 1189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2; 1192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1195770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogProperty: COLOR 1196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_FOG_COLOR; 1198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PARAMS 1200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_FOG_PARAMS; 1202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1205770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneItem: CLIP '[' stateClipPlaneNum ']' PLANE 1206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_CLIPPLANE; 1209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1213770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneNum: INTEGER 1214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1215ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxClipPlanes) { 1216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid clip plane selector"); 1217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1224770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePointItem: POINT statePointProperty 1225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2; 1228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1231770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePointProperty: SIZE 1232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POINT_SIZE; 1234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ATTENUATION 1236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POINT_ATTENUATION; 1238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1241770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']' 1242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1[0]; 1244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1[1]; 1245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[4] = $1[2]; 1248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1251770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRows: stateMatrixItem optMatrixRows 1252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1[0]; 1254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1[1]; 1255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $2[2]; 1256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $2[3]; 1257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[4] = $1[2]; 1258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1261770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptMatrixRows: 1262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = 0; 1264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = 3; 1265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ROW '[' stateMatrixRowNum DOT_DOT stateMatrixRowNum ']' 1267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* It seems logical that the matrix row range specifier would have 1269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to specify a range or more than one row (i.e., $5 > $3). 1270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * However, the ARB_vertex_program spec says "a program will fail 1271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to load if <a> is greater than <b>." This means that $3 == $5 1272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * is valid. 1273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($3 > $5) { 1275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @3, state, "invalid matrix row range"); 1276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $5; 1281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1284770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixItem: MATRIX stateMatrixName stateOptMatModifier 1285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2[0]; 1287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2[1]; 1288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1292770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptMatModifier: 1293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1295770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | stateMatModifier 1297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1302770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatModifier: INVERSE 1303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_INVERSE; 1305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TRANSPOSE 1307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_TRANSPOSE; 1309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INVTRANS 1311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_INVTRANS; 1313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1316770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRowNum: INTEGER 1317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 > 3) { 1319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid matrix row reference"); 1320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1327770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixName: MODELVIEW stateOptModMatNum 1328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MODELVIEW_MATRIX; 1330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PROJECTION 1333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_PROJECTION_MATRIX; 1335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = 0; 1336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MVP 1338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MVP_MATRIX; 1340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = 0; 1341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXTURE optTexCoordUnitNum 1343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_TEXTURE_MATRIX; 1345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PALETTE '[' statePaletteMatNum ']' 1348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MAT_PROGRAM '[' stateProgramMatNum ']' 1352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_PROGRAM_MATRIX; 1354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1358770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptModMatNum: 1359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | stateModMatNum 1363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1367770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateModMatNum: INTEGER 1368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix 1370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * zero is valid. 1371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 != 0) { 1373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid modelview matrix index"); 1374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1380770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePaletteMatNum: INTEGER 1381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Since GL_ARB_matrix_palette isn't supported, just let any value 1383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * through here. The error will be generated later. 1384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1388770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateProgramMatNum: INTEGER 1389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1390ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxProgramMatrices) { 1391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program matrix selector"); 1392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1401770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramSingleItem: progEnvParam | progLocalParam; 1402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1403770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramMultipleItem: progEnvParams | progLocalParams; 1404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1405770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParams: PROGRAM ENV '[' progEnvParamNums ']' 1406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_ENV; 1410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4[0]; 1411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4[1]; 1412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1415770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNums: progEnvParamNum 1416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progEnvParamNum DOT_DOT progEnvParamNum 1421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1427770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParam: PROGRAM ENV '[' progEnvParamNum ']' 1428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1431770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_ENV; 1432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1437770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']' 1438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_LOCAL; 1442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4[0]; 1443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4[1]; 1444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1446770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNums: progLocalParamNum 1447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progLocalParamNum DOT_DOT progLocalParamNum 1452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1458770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']' 1459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_LOCAL; 1463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1468770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNum: INTEGER 1469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1470ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxEnvParams) { 1471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid environment parameter reference"); 1472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1478770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNum: INTEGER 1479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1480ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxLocalParams) { 1481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid local parameter reference"); 1482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1490770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstDecl: paramConstScalarDecl | paramConstVector; 1491770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstUse: paramConstScalarUse | paramConstVector; 1492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1493770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarDecl: signedFloatConstant 1494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 1; 1496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $1; 1497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1500770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarUse: REAL 1501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 1; 1503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $1; 1504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INTEGER 1506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 1; 1508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = (float) $1; 1509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1512770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstVector: '{' signedFloatConstant '}' 1513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 1; 1515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant '}' 1518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 2; 1520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $4; 1522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant ',' 1524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick signedFloatConstant '}' 1525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1526770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 3; 1527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $4; 1529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $6; 1530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant ',' 1532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick signedFloatConstant ',' signedFloatConstant '}' 1533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 4; 1535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $4; 1537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $6; 1538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $8; 1539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1542770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicksignedFloatConstant: optionalSign REAL 1543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = ($1) ? -$2 : $2; 1545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | optionalSign INTEGER 1547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = (float)(($1) ? -$2 : $2); 1549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1552770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalSign: '+' { $$ = FALSE; } 1553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '-' { $$ = TRUE; } 1554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$ = FALSE; } 1555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1557770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTEMP_statement: TEMP { $<integer>$ = $1; } varNameList 1558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1560770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickADDRESS_statement: ADDRESS { $<integer>$ = $1; } varNameList 1561770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1563770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvarNameList: varNameList ',' IDENTIFIER 1564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!declare_variable(state, $3, $<integer>0, & @3)) { 1566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | IDENTIFIER 1570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!declare_variable(state, $1, $<integer>0, & @1)) { 1572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1577770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickOUTPUT_statement: OUTPUT IDENTIFIER '=' resultBinding 1578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, at_output, & @2); 1581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->output_binding = $4; 1586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1587770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1590770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultBinding: RESULT POSITION 1591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_HPOS; 1594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1598770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1599770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT FOGCOORD 1600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_FOGC; 1603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT resultColBinding 1609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT POINTSIZE 1613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_PSIZ; 1616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1617770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT TEXCOORD optTexCoordUnitNum 1622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_TEX0 + $3; 1625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT DEPTH 1631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_fragment) { 1633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_RESULT_DEPTH; 1634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1640770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1641770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultColBinding: COLOR optResultFaceType optResultColorType 1642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2 + $3; 1644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1647770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultFaceType: 1648770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = (state->mode == ARB_vertex) 1650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ? VERT_RESULT_COL0 1651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick : FRAG_RESULT_COLOR; 1652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRONT 1654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_COL0; 1657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1661770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BACK 1663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_BFC0; 1666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1668770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1669770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1670770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1672770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1673770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultColorType: 1674770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1675770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1676770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1677770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PRIMARY 1678770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1680770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1683770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SECONDARY 1687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 1; 1690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1691770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1692770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1693770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1697770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptFaceType: { $$ = 0; } 1698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRONT { $$ = 0; } 1699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BACK { $$ = 1; } 1700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1701770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1702770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptColorType: { $$ = 0; } 1703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PRIMARY { $$ = 0; } 1704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SECONDARY { $$ = 1; } 1705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1707770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexCoordUnitNum: { $$ = 0; } 1708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' texCoordUnitNum ']' { $$ = $2; } 1709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1711770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexImageUnitNum: { $$ = 0; } 1712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' texImageUnitNum ']' { $$ = $2; } 1713770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1715770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptLegacyTexUnitNum: { $$ = 0; } 1716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' legacyTexUnitNum ']' { $$ = $2; } 1717770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1718770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1719770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexCoordUnitNum: INTEGER 1720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1721ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureCoordUnits) { 1722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture coordinate unit selector"); 1723770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1730770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnitNum: INTEGER 1731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1732ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureImageUnits) { 1733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture image unit selector"); 1734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1736770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1741770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicklegacyTexUnitNum: INTEGER 1742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1743ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureUnits) { 1744770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture unit selector"); 1745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1747770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1752770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALIAS_statement: ALIAS IDENTIFIER '=' IDENTIFIER 1753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *exist = (struct asm_symbol *) 1755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $2); 1756770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *target = (struct asm_symbol *) 1757770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $4); 1758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1759770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1760770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (exist != NULL) { 1761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "redeclared identifier"); 1762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (target == NULL) { 1764770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @4, state, 1765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "undefined variable binding in ALIAS statement"); 1766770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_add_symbol(state->st, 0, $2, target); 1769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%% 1774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_instruction * 1776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickasm_instruction_ctor(gl_inst_opcode op, 1777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct prog_dst_register *dst, 1778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src0, 1779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src1, 1780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src2) 1781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *inst = calloc(1, sizeof(struct asm_instruction)); 1783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (inst) { 1785ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick _mesa_init_instructions(& inst->Base, 1); 1786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->Base.Opcode = op; 1787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->Base.DstReg = *dst; 1788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->Base.SrcReg[0] = src0->Base; 1790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->SrcReg[0] = *src0; 1791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (src1 != NULL) { 1793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->Base.SrcReg[1] = src1->Base; 1794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->SrcReg[1] = *src1; 1795aec429170681567414de70814f69244758323e75Ian Romanick } else { 1796aec429170681567414de70814f69244758323e75Ian Romanick init_src_reg(& inst->SrcReg[1]); 1797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (src2 != NULL) { 1800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->Base.SrcReg[2] = src2->Base; 1801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->SrcReg[2] = *src2; 1802aec429170681567414de70814f69244758323e75Ian Romanick } else { 1803aec429170681567414de70814f69244758323e75Ian Romanick init_src_reg(& inst->SrcReg[2]); 1804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return inst; 1808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 1809770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 1812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_dst_reg(struct prog_dst_register *r) 1813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(r, 0, sizeof(*r)); 1815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->File = PROGRAM_UNDEFINED; 1816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->WriteMask = WRITEMASK_XYZW; 1817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->CondMask = COND_TR; 1818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->CondSwizzle = SWIZZLE_NOOP; 1819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 1820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1821770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 1823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_src_reg(struct asm_src_register *r) 1824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(r, 0, sizeof(*r)); 1826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Base.File = PROGRAM_UNDEFINED; 1827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Base.Swizzle = SWIZZLE_NOOP; 1828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Symbol = NULL; 1829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 1830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1831770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/** 1833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validate the set of inputs used by a program 1834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 1835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validates that legal sets of inputs are used by the program. In this case 1836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * "used" included both reading the input or binding the input to a name using 1837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the \c ATTRIB command. 1838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 1839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \return 1840770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise. 1841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 1843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvalidate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state) 1844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int inputs = state->prog->InputsRead | state->InputsBound; 1846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (((inputs & 0x0ffff) & (inputs >> 16)) != 0) { 1848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "illegal use of generic attribute and name attribute"); 1849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 1850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1852770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 1853770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 1854770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1856770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_symbol * 1857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickdeclare_variable(struct asm_parser_state *state, char *name, enum asm_type t, 1858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct YYLTYPE *locp) 1859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1860770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *s = NULL; 1861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *exist = (struct asm_symbol *) 1862770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, name); 1863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (exist != NULL) { 1866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "redeclared identifier"); 1867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s = calloc(1, sizeof(struct asm_symbol)); 1869770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->name = name; 1870770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->type = t; 1871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch (t) { 1873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_temp: 1874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->NumTemporaries >= state->limits->MaxTemps) { 1875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "too many temporaries declared"); 1876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(s); 1877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return NULL; 1878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1879770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1880770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->temp_binding = state->prog->NumTemporaries; 1881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumTemporaries++; 1882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 1883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1884770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_address: 1885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->NumAddressRegs >= state->limits->MaxAddressRegs) { 1886770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "too many address registers declared"); 1887770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(s); 1888770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return NULL; 1889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for multiple address registers. 1892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumAddressRegs++; 1894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 1895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 1897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 1898770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_add_symbol(state->st, 0, s->name, s); 1901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return s; 1904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 1905770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint add_state_reference(struct gl_program_parameter_list *param_list, 1908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 1909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const GLuint size = 4; /* XXX fix */ 1911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick char *name; 1912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLint index; 1913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1914770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick name = _mesa_program_state_string(tokens); 1915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name, 1916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick size, GL_NONE, 1917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick NULL, (gl_state_index *) tokens, 0x0); 1918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_list->StateFlags |= _mesa_program_state_flags(tokens); 1919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* free name string here since we duplicated it in add_parameter() */ 1921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_free(name); 1922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return index; 1924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 1925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 1928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_state(struct gl_program *prog, 1929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 1930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 1931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int idx = -1; 1933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_state_index state_tokens[STATE_LENGTH]; 1934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memcpy(state_tokens, tokens, sizeof(state_tokens)); 1937770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1938770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 193928b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = PROGRAM_STATE_VAR; 1940770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1941770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* If we are adding a STATE_MATRIX that has multiple rows, we need to 1942770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * unroll it and call add_state_reference() for each row 1943770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1944770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ((state_tokens[0] == STATE_MODELVIEW_MATRIX || 1945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_PROJECTION_MATRIX || 1946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_MVP_MATRIX || 1947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_TEXTURE_MATRIX || 1948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_PROGRAM_MATRIX) 1949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && (state_tokens[2] != state_tokens[3])) { 1950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int row; 1951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int first_row = state_tokens[2]; 1952770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int last_row = state_tokens[3]; 1953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1954770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (row = first_row; row <= last_row; row++) { 1955770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[2] = state_tokens[3] = row; 1956770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1957770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 1958770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 1959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 1960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 1961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick else { 1964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 1965770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 1966770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 1967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 1968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 1971770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 1972770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 1975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_param(struct gl_program *prog, 1976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 1977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 1978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 1979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int idx = -1; 1980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_state_index state_tokens[STATE_LENGTH]; 1981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1983770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memcpy(state_tokens, tokens, sizeof(state_tokens)); 1984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert((state_tokens[0] == STATE_VERTEX_PROGRAM) 1986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick || (state_tokens[0] == STATE_FRAGMENT_PROGRAM)); 1987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert((state_tokens[1] == STATE_ENV) 1988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick || (state_tokens[1] == STATE_LOCAL)); 1989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1990770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 199128b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = (state_tokens[1] == STATE_ENV) 199228b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick ? PROGRAM_ENV_PARAM : PROGRAM_LOCAL_PARAM; 1993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements, 1995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * we need to unroll it and call add_state_reference() for each row 1996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state_tokens[2] != state_tokens[3]) { 1998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int row; 1999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int first_row = state_tokens[2]; 2000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int last_row = state_tokens[3]; 2001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (row = first_row; row <= last_row; row++) { 2003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[2] = state_tokens[3] = row; 2004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick else { 2012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2021770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_const(struct gl_program *prog, 2024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 2025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_vector *vec) 2026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int idx = _mesa_add_parameter(prog->Parameters, PROGRAM_CONSTANT, 2028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick NULL, vec->count, GL_NONE, vec->data, 2029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick NULL, 0x0); 2030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 203228b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = PROGRAM_CONSTANT; 2033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2037770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2038770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2040770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 204244843c753301db0e8f8343745777479465f34cccIan Romanickchar * 204344843c753301db0e8f8343745777479465f34cccIan Romanickmake_error_string(const char *fmt, ...) 204444843c753301db0e8f8343745777479465f34cccIan Romanick{ 204544843c753301db0e8f8343745777479465f34cccIan Romanick int length; 204644843c753301db0e8f8343745777479465f34cccIan Romanick char *str; 204744843c753301db0e8f8343745777479465f34cccIan Romanick va_list args; 204844843c753301db0e8f8343745777479465f34cccIan Romanick 204944843c753301db0e8f8343745777479465f34cccIan Romanick va_start(args, fmt); 205044843c753301db0e8f8343745777479465f34cccIan Romanick 205144843c753301db0e8f8343745777479465f34cccIan Romanick /* Call vsnprintf once to determine how large the final string is. Call it 205244843c753301db0e8f8343745777479465f34cccIan Romanick * again to do the actual formatting. from the vsnprintf manual page: 205344843c753301db0e8f8343745777479465f34cccIan Romanick * 205444843c753301db0e8f8343745777479465f34cccIan Romanick * Upon successful return, these functions return the number of 205544843c753301db0e8f8343745777479465f34cccIan Romanick * characters printed (not including the trailing '\0' used to end 205644843c753301db0e8f8343745777479465f34cccIan Romanick * output to strings). 205744843c753301db0e8f8343745777479465f34cccIan Romanick */ 205844843c753301db0e8f8343745777479465f34cccIan Romanick length = 1 + vsnprintf(NULL, 0, fmt, args); 205944843c753301db0e8f8343745777479465f34cccIan Romanick 206044843c753301db0e8f8343745777479465f34cccIan Romanick str = _mesa_malloc(length); 206144843c753301db0e8f8343745777479465f34cccIan Romanick if (str) { 206244843c753301db0e8f8343745777479465f34cccIan Romanick vsnprintf(str, length, fmt, args); 206344843c753301db0e8f8343745777479465f34cccIan Romanick } 206444843c753301db0e8f8343745777479465f34cccIan Romanick 206544843c753301db0e8f8343745777479465f34cccIan Romanick va_end(args); 206644843c753301db0e8f8343745777479465f34cccIan Romanick 206744843c753301db0e8f8343745777479465f34cccIan Romanick return str; 206844843c753301db0e8f8343745777479465f34cccIan Romanick} 206944843c753301db0e8f8343745777479465f34cccIan Romanick 207044843c753301db0e8f8343745777479465f34cccIan Romanick 2071770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 2072770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickyyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s) 2073770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 207444843c753301db0e8f8343745777479465f34cccIan Romanick char *err_str; 207544843c753301db0e8f8343745777479465f34cccIan Romanick 2076770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 207744843c753301db0e8f8343745777479465f34cccIan Romanick err_str = make_error_string("glProgramStringARB(%s)\n", s); 207844843c753301db0e8f8343745777479465f34cccIan Romanick if (err_str) { 207944843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_error(state->ctx, GL_INVALID_OPERATION, err_str); 208044843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_free(err_str); 208144843c753301db0e8f8343745777479465f34cccIan Romanick } 208244843c753301db0e8f8343745777479465f34cccIan Romanick 208344843c753301db0e8f8343745777479465f34cccIan Romanick err_str = make_error_string("line %u, char %u: error: %s\n", 208444843c753301db0e8f8343745777479465f34cccIan Romanick locp->first_line, locp->first_column, s); 208544843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_set_program_error(state->ctx, locp->position, err_str); 208644843c753301db0e8f8343745777479465f34cccIan Romanick 208744843c753301db0e8f8343745777479465f34cccIan Romanick if (err_str) { 208844843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_free(err_str); 208944843c753301db0e8f8343745777479465f34cccIan Romanick } 2090770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2091770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 209244843c753301db0e8f8343745777479465f34cccIan Romanick 2093770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean 2094770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_parse_arb_program(GLcontext *ctx, GLenum target, const GLubyte *str, 2095770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLsizei len, struct asm_parser_state *state) 2096770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2097770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct gl_program_constants limits; 2098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *inst; 2099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned i; 2100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLubyte *strz; 2101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 210244843c753301db0e8f8343745777479465f34cccIan Romanick state->ctx = ctx; 2103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Target = target; 2104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Parameters = _mesa_new_parameter_list(); 2105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Make a copy of the program string and force it to be NUL-terminated. 2107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick strz = (GLubyte *) _mesa_malloc(len + 1); 2109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strz == NULL) { 2110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); 2111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return GL_FALSE; 2112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_memcpy (strz, str, len); 2114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick strz[len] = '\0'; 2115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->String = strz; 2117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->st = _mesa_symbol_table_ctor(); 2119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* All of these limits should come from ctx. 2121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxInstructions = 128; 2123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxAluInstructions = 128; 2124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxTexInstructions = 128; 2125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxTexIndirections = 128; 2126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxAttribs = 16; 2127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxTemps = 128; 2128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxAddressRegs = 1; 2129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxParameters = 128; 2130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxLocalParams = 256; 2131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxEnvParams = 128; 2132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeInstructions = 128; 2133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeAluInstructions = 128; 2134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeTexInstructions = 128; 2135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeTexIndirections = 128; 2136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeAttribs = 16; 2137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeTemps = 128; 2138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeAddressRegs = 1; 2139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxNativeParameters = 128; 2140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick limits.MaxUniformComponents = 0; 2141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->limits = & limits; 2143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->MaxTextureImageUnits = 16; 2145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->MaxTextureCoordUnits = 8; 2146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->MaxTextureUnits = 8; 2147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->MaxClipPlanes = 6; 2148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->MaxLights = 8; 2149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->MaxProgramMatrices = 8; 2150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB) 2152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM; 2153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_set_program_error(ctx, -1, NULL); 2155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_program_lexer_ctor(& state->scanner, state, (const char *) str, len); 2157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyparse(state); 2158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_program_lexer_dtor(state->scanner); 2159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 216144843c753301db0e8f8343745777479465f34cccIan Romanick if (ctx->Program.ErrorPos != -1) { 216244843c753301db0e8f8343745777479465f34cccIan Romanick return GL_FALSE; 216344843c753301db0e8f8343745777479465f34cccIan Romanick } 216444843c753301db0e8f8343745777479465f34cccIan Romanick 2165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (! _mesa_layout_parameters(state)) { 216644843c753301db0e8f8343745777479465f34cccIan Romanick struct YYLTYPE loc; 216744843c753301db0e8f8343745777479465f34cccIan Romanick 216844843c753301db0e8f8343745777479465f34cccIan Romanick loc.first_line = 0; 216944843c753301db0e8f8343745777479465f34cccIan Romanick loc.first_column = 0; 217044843c753301db0e8f8343745777479465f34cccIan Romanick loc.position = len; 217144843c753301db0e8f8343745777479465f34cccIan Romanick 217244843c753301db0e8f8343745777479465f34cccIan Romanick yyerror(& loc, state, "invalid PARAM usage"); 2173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return GL_FALSE; 2174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Add one instruction to store the "END" instruction. 2179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions = 2181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_alloc_instructions(state->prog->NumInstructions + 1); 2182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst = state->inst_head; 2183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (i = 0; i < state->prog->NumInstructions; i++) { 2184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *const temp = inst->next; 2185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions[i] = inst->Base; 2187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_free(inst); 2188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst = temp; 2190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Finally, tag on an OPCODE_END instruction */ 2193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const GLuint numInst = state->prog->NumInstructions; 2195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_init_instructions(state->prog->Instructions + numInst, 1); 2196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions[numInst].Opcode = OPCODE_END; 2197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumInstructions++; 2199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2200c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick state->prog->NumParameters = state->prog->Parameters->NumParameters; 2201c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick 2202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* 2203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Initialize native counts to logical counts. The device driver may 2204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * change them if program is translated into a hardware program. 2205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeInstructions = state->prog->NumInstructions; 2207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeTemporaries = state->prog->NumTemporaries; 2208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeParameters = state->prog->NumParameters; 2209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeAttributes = state->prog->NumAttributes; 2210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeAddressRegs = state->prog->NumAddressRegs; 2211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return GL_TRUE; 2213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2214