program_parse.y revision 0e7953366f2a8ab1b0e885d94f6635c7640b3cc7
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 719ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstatic void asm_instruction_set_operands(struct asm_instruction *inst, 729ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_dst_register *dst, const struct asm_src_register *src0, 739ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src1, const struct asm_src_register *src2); 749ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 75770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op, 76770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct prog_dst_register *dst, const struct asm_src_register *src0, 77770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src1, const struct asm_src_register *src2); 78770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 799ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstatic struct asm_instruction *asm_instruction_copy_ctor( 809ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_instruction *base, const struct prog_dst_register *dst, 819ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src0, const struct asm_src_register *src1, 829ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src2); 839ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 84770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef FALSE 85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define FALSE 0 86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define TRUE (!FALSE) 87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif 88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 89770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLLOC_DEFAULT(Current, Rhs, N) \ 90770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick do { \ 91770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (YYID(N)) { \ 92770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 93770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).position = YYRHSLOC(Rhs, 1).position; \ 95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { \ 98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_line = YYRHSLOC(Rhs, 0).last_line; \ 99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_line = (Current).first_line; \ 100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_column = YYRHSLOC(Rhs, 0).last_column; \ 101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_column = (Current).first_column; \ 102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).position = YYRHSLOC(Rhs, 0).position \ 103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick + (Current).first_column; \ 104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } \ 105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } while(YYID(0)) 106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLEX_PARAM state->scanner 108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%} 109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%pure-parser 111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%locations 112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%parse-param { struct asm_parser_state *state } 113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%error-verbose 114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%lex-param { void *scanner } 115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%union { 117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *inst; 118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *sym; 119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol temp_sym; 120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_swizzle_mask swiz_mask; 121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_src_register src_reg; 122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct prog_dst_register dst_reg; 123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct prog_instruction temp_inst; 124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick char *string; 125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned result; 126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned attrib; 127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int integer; 128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick float real; 129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned state[5]; 130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int negate; 131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_vector vector; 132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_inst_opcode opcode; 133565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 134565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick struct { 135565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned swz; 136565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned rgba_valid:1; 137565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned xyzw_valid:1; 138565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned negate:1; 139565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick } ext_swizzle; 140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ARBvp_10 ARBfp_10 143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* Tokens for assembler pseudo-ops */ 145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> ADDRESS 146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ALIAS ATTRIB 147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OPTION OUTPUT 148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PARAM 149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> TEMP 150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token END 151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Tokens for instructions */ 153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <temp_inst> BIN_OP BINSC_OP SAMPLE_OP SCALAR_OP TRI_OP VECTOR_OP 154ede0cd4d8c8eb8c6c443c84905138091944d69afIan Romanick%token <temp_inst> ARL KIL SWZ TXD_OP 155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> INTEGER 157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <real> REAL 158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token AMBIENT ATTENUATION 160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token BACK 161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token CLIP COLOR 162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DEPTH DIFFUSE DIRECTION 163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token EMISSION ENV EYE 164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token FOG FOGCOORD FRAGMENT FRONT 165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token HALF 166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token INVERSE INVTRANS 167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token LIGHT LIGHTMODEL LIGHTPROD LOCAL 168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token MATERIAL MAT_PROGRAM MATRIX MATRIXINDEX MODELVIEW MVP 169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token NORMAL 170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OBJECT 171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PALETTE PARAMS PLANE POINT POINTSIZE POSITION PRIMARY PROGRAM PROJECTION 172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token RANGE RESULT ROW 173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token SCENECOLOR SECONDARY SHININESS SIZE SPECULAR SPOT STATE 174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE 175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT 1761edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick%token TEX_SHADOW1D TEX_SHADOW2D TEX_SHADOWRECT 177aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick%token TEX_ARRAY1D TEX_ARRAY2D TEX_ARRAYSHADOW1D TEX_ARRAYSHADOW2D 178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token VERTEX VTXATTRIB 179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token WEIGHT 180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1810e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick%token <string> IDENTIFIER USED_IDENTIFIER 1820e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick%type <string> string 183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <swiz_mask> MASK4 MASK3 MASK2 MASK1 SWIZZLE 184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT_DOT 185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT 186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> instruction ALU_instruction TexInstruction 188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> ARL_instruction VECTORop_instruction 189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> SCALARop_instruction BINSCop_instruction BINop_instruction 1908ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick%type <inst> TRIop_instruction TXD_instruction SWZ_instruction SAMPLE_instruction 191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> KIL_instruction 192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <dst_reg> dstReg maskedDstReg maskedAddrReg 194eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick%type <src_reg> srcReg scalarUse scalarSrcReg swizzleSrcReg 195565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <swiz_mask> scalarSuffix swizzleSuffix extendedSwizzle 196565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <ext_swizzle> extSwizComp extSwizSel 197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> optionalMask 198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> progParamArray 200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> addrRegRelOffset addrRegPosOffset addrRegNegOffset 201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <src_reg> progParamArrayMem progParamArrayAbs progParamArrayRel 202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> addrReg 203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> addrComponent addrWriteMask 204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <result> resultBinding resultColBinding 206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optFaceType optColorType 207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optResultFaceType optResultColorType 208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexImageUnitNum texImageUnitNum 210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexCoordUnitNum texCoordUnitNum 211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optLegacyTexUnitNum legacyTexUnitNum 212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> texImageUnit texTarget 213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> vtxAttribNum 214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <attrib> attribBinding vtxAttribItem fragAttribItem 216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleInit paramSingleItemDecl 218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optArraySize 219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateSingleItem stateMultipleItem 221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMaterialItem 222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLightItem stateLightModelItem stateLightProdItem 223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateTexGenItem stateFogItem stateClipPlaneItem statePointItem 224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixItem stateMatrixRow stateMatrixRows 225333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick%type <state> stateTexEnvItem stateDepthItem 226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLModProperty 228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixName optMatrixRows 229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateMatProperty 231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightProperty stateSpotProperty 232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightNumber stateLProdProperty 233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexGenType stateTexGenCoord 234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexEnvProperty 235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateFogProperty 236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateClipPlaneNum 237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> statePointProperty 238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptMatModifier stateMatModifier stateMatrixRowNum 240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptModMatNum stateModMatNum statePaletteMatNum 241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateProgramMatNum 242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> ambDiffSpecProperty 244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programSingleItem progEnvParam progLocalParam 246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programMultipleItem progEnvParams progLocalParams 247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramMultipleInit paramMultInitList paramMultipleItem 249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleItemUse 250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> progEnvParamNum progLocalParamNum 252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> progEnvParamNums progLocalParamNums 253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstDecl paramConstUse 255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstScalarDecl paramConstScalarUse paramConstVector 256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <real> signedFloatConstant 257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <negate> optionalSign 258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{ 260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, 261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick void *yyscanner); 262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%} 263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%% 265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickprogram: language optionSequence statementSequence END 267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanicklanguage: ARBvp_10 270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) { 272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid fragment program header"); 273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->mode = ARB_vertex; 276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ARBfp_10 278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) { 280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid vertex program header"); 281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->mode = ARB_fragment; 28388018e2e073909ae807f16707f2701e068900926Ian Romanick 28488018e2e073909ae807f16707f2701e068900926Ian Romanick state->option.TexRect = 28588018e2e073909ae807f16707f2701e068900926Ian Romanick (state->ctx->Extensions.NV_texture_rectangle != GL_FALSE); 286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 289770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionSequence: optionSequence option 290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | 291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2930e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickoption: OPTION string ';' 294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 295770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int valid = 0; 296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick valid = _mesa_ARBvp_parse_option(state, $2); 299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (state->mode == ARB_fragment) { 300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick valid = _mesa_ARBfp_parse_option(state, $2); 301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!valid) { 30541d5696628a5eef62cd671711b33edea9344977dIan Romanick const char *const err_str = (state->mode == ARB_vertex) 30641d5696628a5eef62cd671711b33edea9344977dIan Romanick ? "invalid ARB vertex program option" 30741d5696628a5eef62cd671711b33edea9344977dIan Romanick : "invalid ARB fragment program option"; 30841d5696628a5eef62cd671711b33edea9344977dIan Romanick 30941d5696628a5eef62cd671711b33edea9344977dIan Romanick yyerror(& @2, state, err_str); 310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 315770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatementSequence: statementSequence statement 316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | 317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatement: instruction ';' 320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 != NULL) { 322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->inst_tail == NULL) { 323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_head = $1; 324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_tail->next = $1; 326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_tail = $1; 329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1->next = NULL; 330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumInstructions++; 332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | namingStatement ';' 335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinstruction: ALU_instruction 3380db5ef074169589bc4d665094147aa284a5496d7Ian Romanick { 3390db5ef074169589bc4d665094147aa284a5496d7Ian Romanick $$ = $1; 3400db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->prog->NumAluInstructions++; 3410db5ef074169589bc4d665094147aa284a5496d7Ian Romanick } 342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TexInstruction 3430db5ef074169589bc4d665094147aa284a5496d7Ian Romanick { 3440db5ef074169589bc4d665094147aa284a5496d7Ian Romanick $$ = $1; 3450db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->prog->NumTexInstructions++; 3460db5ef074169589bc4d665094147aa284a5496d7Ian Romanick } 347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 349770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALU_instruction: ARL_instruction 350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | VECTORop_instruction 351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SCALARop_instruction 352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BINSCop_instruction 353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BINop_instruction 354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TRIop_instruction 355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SWZ_instruction 356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 358770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTexInstruction: SAMPLE_instruction 359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | KIL_instruction 3608ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick | TXD_instruction 361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 363770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickARL_instruction: ARL maskedAddrReg ',' scalarSrcReg 364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor(OPCODE_ARL, & $2, & $4, NULL, NULL); 366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 369770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickVECTORop_instruction: VECTOR_OP maskedDstReg ',' swizzleSrcReg 370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 3719ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 375770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSCALARop_instruction: SCALAR_OP maskedDstReg ',' scalarSrcReg 376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 3779ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 381770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINSCop_instruction: BINSC_OP maskedDstReg ',' scalarSrcReg ',' scalarSrcReg 382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 3839ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL); 384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 388770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINop_instruction: BIN_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg 389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 3909ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL); 391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 394770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTRIop_instruction: TRI_OP maskedDstReg ',' 395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg 396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 3979ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8); 398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 401770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget 402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 4039ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($$ != NULL) { 4051edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick const GLbitfield tex_mask = (1U << $6); 4061edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick GLbitfield shadow_tex = 0; 4071edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick GLbitfield target_mask = 0; 4081edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4091edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.TexSrcUnit = $6; 4110db5ef074169589bc4d665094147aa284a5496d7Ian Romanick 4121edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick if ($8 < 0) { 4131edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick shadow_tex = tex_mask; 4141edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4151edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick $$->Base.TexSrcTarget = -$8; 4161edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick $$->Base.TexShadow = 1; 4171edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick } else { 4181edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick $$->Base.TexSrcTarget = $8; 4191edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick } 4201edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4211edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick target_mask = (1U << $$->Base.TexSrcTarget); 4221edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4231edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick /* If this texture unit was previously accessed and that access 4241edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * had a different texture target, generate an error. 4251edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * 4261edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * If this texture unit was previously accessed and that access 4271edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * had a different shadow mode, generate an error. 4281edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick */ 4291edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick if ((state->prog->TexturesUsed[$6] != 0) 4301edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick && ((state->prog->TexturesUsed[$6] != target_mask) 4311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick || ((state->prog->ShadowSamplers & tex_mask) 4321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick != shadow_tex))) { 4331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick yyerror(& @8, state, 4341edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick "multiple targets used on one texture image unit"); 4351edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick YYERROR; 4361edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick } 4371edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4381edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4391edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick state->prog->TexturesUsed[$6] |= target_mask; 4401edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick state->prog->ShadowSamplers |= shadow_tex; 441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 445770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickKIL_instruction: KIL swizzleSrcReg 446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL); 4480db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->fragment.UsesKill = 1; 449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 4528ca6fd8a83412e3a76746f0ee61027b796516f95Ian RomanickTXD_instruction: TXD_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget 4538ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick { 4549ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8); 4558ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick if ($$ != NULL) { 4568ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick const GLbitfield tex_mask = (1U << $10); 4578ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick GLbitfield shadow_tex = 0; 4588ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick GLbitfield target_mask = 0; 4598ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4608ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4618ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexSrcUnit = $10; 4628ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4638ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick if ($12 < 0) { 4648ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick shadow_tex = tex_mask; 4658ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4668ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexSrcTarget = -$12; 4678ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexShadow = 1; 4688ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } else { 4698ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexSrcTarget = $12; 4708ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 4718ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4728ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick target_mask = (1U << $$->Base.TexSrcTarget); 4738ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4748ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick /* If this texture unit was previously accessed and that access 4758ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * had a different texture target, generate an error. 4768ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * 4778ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * If this texture unit was previously accessed and that access 4788ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * had a different shadow mode, generate an error. 4798ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick */ 4808ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick if ((state->prog->TexturesUsed[$10] != 0) 4818ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick && ((state->prog->TexturesUsed[$10] != target_mask) 4828ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick || ((state->prog->ShadowSamplers & tex_mask) 4838ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick != shadow_tex))) { 4848ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick yyerror(& @12, state, 4858ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick "multiple targets used on one texture image unit"); 4868ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick YYERROR; 4878ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 4888ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4898ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4908ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick state->prog->TexturesUsed[$10] |= target_mask; 4918ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick state->prog->ShadowSamplers |= shadow_tex; 4928ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 4938ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 4948ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick ; 4958ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 496770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnit: TEXTURE_UNIT optTexImageUnitNum 497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 502770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexTarget: TEX_1D { $$ = TEXTURE_1D_INDEX; } 503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_2D { $$ = TEXTURE_2D_INDEX; } 504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_3D { $$ = TEXTURE_3D_INDEX; } 505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; } 506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_RECT { $$ = TEXTURE_RECT_INDEX; } 5071edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick | TEX_SHADOW1D { $$ = -TEXTURE_1D_INDEX; } 5081edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick | TEX_SHADOW2D { $$ = -TEXTURE_2D_INDEX; } 5091edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick | TEX_SHADOWRECT { $$ = -TEXTURE_RECT_INDEX; } 510aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAY1D { $$ = TEXTURE_1D_ARRAY_INDEX; } 511aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAY2D { $$ = TEXTURE_2D_ARRAY_INDEX; } 512aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAYSHADOW1D { $$ = -TEXTURE_1D_ARRAY_INDEX; } 513aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAYSHADOW2D { $$ = -TEXTURE_2D_ARRAY_INDEX; } 514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 516770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle 517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FIXME: Is this correct? Should the extenedSwizzle be applied 519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FIXME: to the existing swizzle? 520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $4.Base.Swizzle = $6.swizzle; 522648dac4251de69d2949026af3dec0b0befee734bIan Romanick $4.Base.Negate = $6.mask; 523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 5249ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 526770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 528eeb1402c0514248773e66f2077b0fb52f7245d56Ian RomanickscalarSrcReg: optionalSign scalarUse 529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1) { 533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Negate = ~$$.Base.Negate; 534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 535eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 536eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick | optionalSign '|' scalarUse '|' 537eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick { 538eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$ = $3; 539eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 540eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if (!state->option.NV_fragment) { 541eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick yyerror(& @2, state, "unexpected character '|'"); 542eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick YYERROR; 543eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 544eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 545eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if ($1) { 546eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Negate = ~$$.Base.Negate; 547eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 548eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 549eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Abs = 1; 550eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 551eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick ; 552eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 553eeb1402c0514248773e66f2077b0fb52f7245d56Ian RomanickscalarUse: srcReg scalarSuffix 554eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick { 555eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$ = $1; 556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 558eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $2.swizzle); 559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 560eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick | paramConstScalarUse 561b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick { 562b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick struct asm_symbol temp_sym; 563b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick 564b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick if (!state->option.NV_fragment) { 565eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick yyerror(& @1, state, "expected scalar suffix"); 566b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick YYERROR; 567b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick } 568b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick 569b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick memset(& temp_sym, 0, sizeof(temp_sym)); 570b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick temp_sym.param_binding_begin = ~0; 571eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick initialize_symbol_from_const(state->prog, & temp_sym, & $1); 572b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick 573b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick init_src_reg(& $$); 574b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick $$.Base.File = PROGRAM_CONSTANT; 575b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick $$.Base.Index = temp_sym.param_binding_begin; 576b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick } 577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 579770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSrcReg: optionalSign srcReg swizzleSuffix 580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1) { 584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Negate = ~$$.Base.Negate; 585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 587770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $3.swizzle); 589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 590eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick | optionalSign '|' srcReg swizzleSuffix '|' 591eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick { 592eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$ = $3; 593eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 594eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if (!state->option.NV_fragment) { 595eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick yyerror(& @2, state, "unexpected character '|'"); 596eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick YYERROR; 597eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 598eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 599eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if ($1) { 600eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Negate = ~$$.Base.Negate; 601eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 602eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 603eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Abs = 1; 604eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 605eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $4.swizzle); 606eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 607eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 610770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedDstReg: dstReg optionalMask 611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.WriteMask = $2.mask; 614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($$.File == PROGRAM_OUTPUT) { 616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Technically speaking, this should check that it is in 617770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * vertex program mode. However, PositionInvariant can never be 618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * set in fragment program mode, so it is somewhat irrelevant. 619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->option.PositionInvariant 621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && ($$.Index == VERT_RESULT_HPOS)) { 622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "position-invariant programs cannot " 623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "write position"); 624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->OutputsWritten |= (1U << $$.Index); 628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 632770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedAddrReg: addrReg addrWriteMask 633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_dst_reg(& $$); 635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = PROGRAM_ADDRESS; 636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = 0; 637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.WriteMask = $2.mask; 638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 640770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 641770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextendedSwizzle: extSwizComp ',' extSwizComp ',' extSwizComp ',' extSwizComp 642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 643565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick const unsigned xyzw_valid = 644565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick ($1.xyzw_valid << 0) 645565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($3.xyzw_valid << 1) 646565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($5.xyzw_valid << 2) 647565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($7.xyzw_valid << 3); 648565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick const unsigned rgba_valid = 649565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick ($1.rgba_valid << 0) 650565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($3.rgba_valid << 1) 651565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($5.rgba_valid << 2) 652565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($7.rgba_valid << 3); 653565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 654565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick /* All of the swizzle components have to be valid in either RGBA 655565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * or XYZW. Note that 0 and 1 are valid in both, so both masks 656565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * can have some bits set. 657565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * 658565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * We somewhat deviate from the spec here. It would be really hard 659565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * to figure out which component is the error, and there probably 660565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * isn't a lot of benefit. 661565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick */ 662565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick if ((rgba_valid != 0x0f) && (xyzw_valid != 0x0f)) { 663565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick yyerror(& @1, state, "cannot combine RGBA and XYZW swizzle " 664565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick "components"); 665565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick YYERROR; 666565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick } 667565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 668565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swizzle = MAKE_SWIZZLE4($1.swz, $3.swz, $5.swz, $7.swz); 669565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.mask = ($1.negate) | ($3.negate << 1) | ($5.negate << 2) 670565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($7.negate << 3); 671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 672770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 673770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 674770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizComp: optionalSign extSwizSel 675770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 676565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$ = $2; 677565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.negate = ($1) ? 1 : 0; 678770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 680770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 681770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizSel: INTEGER 682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 683770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (($1 != 0) && ($1 != 1)) { 684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 688565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = ($1 == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE; 689565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 690565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick /* 0 and 1 are valid for both RGBA swizzle names and XYZW 691565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * swizzle names. 692565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick */ 693565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 694565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 6960e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick | string 697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strlen($1) > 1) { 699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 701770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch ($1[0]) { 704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'x': 705565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_X; 706565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'y': 709565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Y; 710565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'z': 713565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Z; 714565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 715770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'w': 717565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_W; 718565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 719565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 720565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 721565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'r': 722565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_X; 723565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 724565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 725565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'g': 726565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Y; 727565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 729565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'b': 730565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Z; 731565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 732565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 733565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'a': 734565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_W; 735565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 736565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 737565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 744770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 7460e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanicksrcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */ 747770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_param) && (s->type != at_temp) 755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && (s->type != at_attrib)) { 756770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 757770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type == at_param) && s->param_is_array) { 759770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "non-array access to array PARAM"); 760770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 764770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch (s->type) { 765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_temp: 766770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = PROGRAM_TEMPORARY; 767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = s->temp_binding; 768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_param: 770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = s->param_binding_type; 771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = s->param_binding_begin; 772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_attrib: 7748a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick $$.Base.File = PROGRAM_INPUT; 7758a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick $$.Base.Index = s->attrib_binding; 7768a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick state->prog->InputsRead |= (1U << $$.Base.Index); 7778a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick 7788a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick if (!validate_inputs(& @1, state)) { 7798a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick YYERROR; 7808a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick } 7818a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick break; 782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | attribBinding 789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = PROGRAM_INPUT; 792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1; 793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->InputsRead |= (1U << $$.Base.Index); 794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!validate_inputs(& @1, state)) { 796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progParamArray '[' progParamArrayMem ']' 800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (! $3.Base.RelAddr 802ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick && ((unsigned) $3.Base.Index >= $1->param_binding_length)) { 803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @3, state, "out of bounds array access"); 804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = $1->param_binding_type; 809770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($3.Base.RelAddr) { 811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1->param_accessed_indirectly = 1; 812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.RelAddr = 1; 814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $3.Base.Index; 815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Symbol = $1; 816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1->param_binding_begin + $3.Base.Index; 818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramSingleItemUse 821770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 82369d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick $$.Base.File = ($1.name != NULL) 82469d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick ? $1.param_binding_type 82569d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick : PROGRAM_CONSTANT; 826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1.param_binding_begin; 827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 830770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickdstReg: resultBinding 831770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_dst_reg(& $$); 833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = PROGRAM_OUTPUT; 834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = $1; 835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 8360e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick | USED_IDENTIFIER /* temporaryReg | vertexResultReg */ 837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 840770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_output) && (s->type != at_temp)) { 845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_dst_reg(& $$); 85086b33b5649710f351d241ce6890200ac1f38f724Ian Romanick switch (s->type) { 85186b33b5649710f351d241ce6890200ac1f38f724Ian Romanick case at_temp: 852770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = PROGRAM_TEMPORARY; 853770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = s->temp_binding; 85486b33b5649710f351d241ce6890200ac1f38f724Ian Romanick break; 85586b33b5649710f351d241ce6890200ac1f38f724Ian Romanick case at_output: 85686b33b5649710f351d241ce6890200ac1f38f724Ian Romanick $$.File = PROGRAM_OUTPUT; 85786b33b5649710f351d241ce6890200ac1f38f724Ian Romanick $$.Index = s->output_binding; 85886b33b5649710f351d241ce6890200ac1f38f724Ian Romanick break; 85986b33b5649710f351d241ce6890200ac1f38f724Ian Romanick default: 860770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.File = s->param_binding_type; 861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Index = s->param_binding_begin; 86286b33b5649710f351d241ce6890200ac1f38f724Ian Romanick break; 863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 8670e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickprogParamArray: USED_IDENTIFIER 868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 869770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 870770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_param) || !s->param_is_array) { 876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "array access to non-PARAM variable"); 877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 879770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = s; 880770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 884770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayMem: progParamArrayAbs | progParamArrayRel; 885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 886770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayAbs: INTEGER 887770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 888770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1; 890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 893770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayRel: addrReg addrComponent addrRegRelOffset 894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for multiple address registers. 896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for 4-component address registers. 898770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.RelAddr = 1; 901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $3; 902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 905770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegRelOffset: { $$ = 0; } 906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '+' addrRegPosOffset { $$ = $2; } 907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '-' addrRegNegOffset { $$ = -$2; } 908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 910770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegPosOffset: INTEGER 911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (($1 < 0) || ($1 > 63)) { 913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 914770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "relative address offset too large (positive)"); 915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 922770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegNegOffset: INTEGER 923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (($1 < 0) || ($1 > 64)) { 925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "relative address offset too large (negative)"); 927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 9340e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickaddrReg: USED_IDENTIFIER 935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 937770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 938770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 940770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid array member"); 941770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 942770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (s->type != at_address) { 943770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 944770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "invalid variable for indexed array access"); 945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = s; 948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 952770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrComponent: MASK1 953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 954770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1.mask != WRITEMASK_X) { 955770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid address component selector"); 956770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 957770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 958770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 963770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrWriteMask: MASK1 964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 965770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1.mask != WRITEMASK_X) { 966770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "address register write mask must be \".x\""); 968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 971770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 972770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 975770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickscalarSuffix: MASK1; 976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 977770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSuffix: MASK1 978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MASK4 979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SWIZZLE 980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 983770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalMask: MASK4 | MASK3 | MASK2 | MASK1 984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 987770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicknamingStatement: ATTRIB_statement 988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PARAM_statement 989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEMP_statement 990770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ADDRESS_statement 991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | OUTPUT_statement 992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ALIAS_statement 993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 995770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickATTRIB_statement: ATTRIB IDENTIFIER '=' attribBinding 996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, at_attrib, & @2); 999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->attrib_binding = $4; 1004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->InputsBound |= (1U << s->attrib_binding); 1005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!validate_inputs(& @4, state)) { 1007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1013770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickattribBinding: VERTEX vtxAttribItem 1014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRAGMENT fragAttribItem 1018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1021770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1023770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribItem: POSITION 1024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_POS; 1026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | WEIGHT vtxOptWeightNum 1028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_WEIGHT; 1030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | NORMAL 1032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_NORMAL; 1034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | COLOR optColorType 1036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1037054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick if (!state->ctx->Extensions.EXT_secondary_color) { 1038054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @2, state, "GL_EXT_secondary_color not supported"); 1039054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick YYERROR; 1040054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick } 1041054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick 1042770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_COLOR0 + $2; 1043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1044770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FOGCOORD 1045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1046054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick if (!state->ctx->Extensions.EXT_fog_coord) { 1047054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_EXT_fog_coord not supported"); 1048054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick YYERROR; 1049054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick } 1050054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick 1051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_FOG; 1052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1053770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXCOORD optTexCoordUnitNum 1054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_TEX0 + $2; 1056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MATRIXINDEX '[' vtxWeightNum ']' 1058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1059054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_ARB_matrix_palette not supported"); 1060770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1061770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1062770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | VTXATTRIB '[' vtxAttribNum ']' 1063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_GENERIC0 + $3; 1065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1067770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1068770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribNum: INTEGER 1069770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1070ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxAttribs) { 1071770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid vertex attribute reference"); 1072770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1073770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1074770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1075770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1076770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1077770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1078770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1079770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxOptWeightNum: | '[' vtxWeightNum ']'; 1080770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxWeightNum: INTEGER; 1081770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1082770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickfragAttribItem: POSITION 1083770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1084770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_WPOS; 1085770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1086770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | COLOR optColorType 1087770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1088770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_COL0 + $2; 1089770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1090770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FOGCOORD 1091770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1092770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_FOGC; 1093770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1094770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXCOORD optTexCoordUnitNum 1095770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1096770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_TEX0 + $2; 1097770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1100770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_statement: PARAM_singleStmt | PARAM_multipleStmt; 1101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1102770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_singleStmt: PARAM IDENTIFIER paramSingleInit 1103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, at_param, & @2); 1106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_type = $3.param_binding_type; 1111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_begin = $3.param_binding_begin; 1112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_length = $3.param_binding_length; 1113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_is_array = 0; 1114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1118770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_multipleStmt: PARAM IDENTIFIER '[' optArraySize ']' paramMultipleInit 1119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1120ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if (($4 != 0) && ((unsigned) $4 != $6.param_binding_length)) { 1121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @4, state, 1122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "parameter array size and number of bindings must match"); 1123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, $6.type, & @2); 1127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_type = $6.param_binding_type; 1132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_begin = $6.param_binding_begin; 1133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_length = $6.param_binding_length; 1134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_is_array = 1; 1135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1140770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptArraySize: 1141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INTEGER 1145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1146ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if (($1 < 1) || ((unsigned) $1 >= state->limits->MaxParameters)) { 1147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid parameter array size"); 1148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1155770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleInit: '=' paramSingleItemDecl 1156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1161770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleInit: '=' '{' paramMultInitList '}' 1162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $3; 1164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1167770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultInitList: paramMultipleItem 1168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramMultInitList ',' paramMultipleItem 1169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1.param_binding_length += $3.param_binding_length; 1171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1175770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemDecl: stateSingleItem 1176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 1180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programSingleItem 1182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 1186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstDecl 1188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_const(state->prog, & $$, & $1); 1192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1195770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemUse: stateSingleItem 1196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 1200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programSingleItem 1202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 1206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstUse 1208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_const(state->prog, & $$, & $1); 1212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1215770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleItem: stateMultipleItem 1216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 1220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programMultipleItem 1222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 1226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstDecl 1228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_const(state->prog, & $$, & $1); 1232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1235770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMultipleItem: stateSingleItem { memcpy($$, $1, sizeof($$)); } 1236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateMatrixRows { memcpy($$, $2, sizeof($$)); } 1237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1239770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSingleItem: STATE stateMaterialItem { memcpy($$, $2, sizeof($$)); } 1240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightItem { memcpy($$, $2, sizeof($$)); } 1241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightModelItem { memcpy($$, $2, sizeof($$)); } 1242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightProdItem { memcpy($$, $2, sizeof($$)); } 1243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateTexGenItem { memcpy($$, $2, sizeof($$)); } 1244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateTexEnvItem { memcpy($$, $2, sizeof($$)); } 1245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateFogItem { memcpy($$, $2, sizeof($$)); } 1246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateClipPlaneItem { memcpy($$, $2, sizeof($$)); } 1247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE statePointItem { memcpy($$, $2, sizeof($$)); } 1248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateMatrixRow { memcpy($$, $2, sizeof($$)); } 1249333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick | STATE stateDepthItem { memcpy($$, $2, sizeof($$)); } 1250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1252770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMaterialItem: MATERIAL optFaceType stateMatProperty 1253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MATERIAL; 1256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1261770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatProperty: ambDiffSpecProperty 1262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | EMISSION 1266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_EMISSION; 1268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SHININESS 1270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SHININESS; 1272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1275770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightItem: LIGHT '[' stateLightNumber ']' stateLightProperty 1276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHT; 1279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $5; 1281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1284770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProperty: ambDiffSpecProperty 1285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | POSITION 1289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POSITION; 1291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ATTENUATION 1293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1294054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick if (!state->ctx->Extensions.EXT_point_parameters) { 1295054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_ARB_point_parameters not supported"); 1296054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick YYERROR; 1297054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick } 1298054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick 1299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_ATTENUATION; 1300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SPOT stateSpotProperty 1302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | HALF 1306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_HALF_VECTOR; 1308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1311770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSpotProperty: DIRECTION 1312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SPOT_DIRECTION; 1314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1317770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightModelItem: LIGHTMODEL stateLModProperty 1318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2[0]; 1320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2[1]; 1321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1324770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLModProperty: AMBIENT 1325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTMODEL_AMBIENT; 1328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | optFaceType SCENECOLOR 1330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTMODEL_SCENECOLOR; 1333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1337770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProdItem: LIGHTPROD '[' stateLightNumber ']' optFaceType stateLProdProperty 1338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTPROD; 1341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $5; 1343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $6; 1344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1347770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLProdProperty: ambDiffSpecProperty; 1348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1349770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvItem: TEXENV optLegacyTexUnitNum stateTexEnvProperty 1350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $3; 1353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1357770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvProperty: COLOR 1358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXENV_COLOR; 1360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1363770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickambDiffSpecProperty: AMBIENT 1364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_AMBIENT; 1366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | DIFFUSE 1368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_DIFFUSE; 1370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SPECULAR 1372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SPECULAR; 1374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1377770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightNumber: INTEGER 1378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1379ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxLights) { 1380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid light selector"); 1381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1388770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenItem: TEXGEN optTexCoordUnitNum stateTexGenType stateTexGenCoord 1389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_TEXGEN; 1392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3 + $4; 1394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1397770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenType: EYE 1398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_S; 1400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | OBJECT 1402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_OBJECT_S; 1404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1406770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenCoord: TEXGEN_S 1407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S; 1409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_T 1411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S; 1413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_R 1415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S; 1417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_Q 1419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S; 1421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1424770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogItem: FOG stateFogProperty 1425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2; 1428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1431770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogProperty: COLOR 1432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_FOG_COLOR; 1434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PARAMS 1436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_FOG_PARAMS; 1438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1441770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneItem: CLIP '[' stateClipPlaneNum ']' PLANE 1442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_CLIPPLANE; 1445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1449770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneNum: INTEGER 1450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1451ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxClipPlanes) { 1452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid clip plane selector"); 1453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1460770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePointItem: POINT statePointProperty 1461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2; 1464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1467770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePointProperty: SIZE 1468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POINT_SIZE; 1470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ATTENUATION 1472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POINT_ATTENUATION; 1474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1477770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']' 1478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1[0]; 1480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1[1]; 1481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[4] = $1[2]; 1484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1487770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRows: stateMatrixItem optMatrixRows 1488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1[0]; 1490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1[1]; 1491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $2[2]; 1492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $2[3]; 1493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[4] = $1[2]; 1494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1497770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptMatrixRows: 1498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = 0; 1500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = 3; 1501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ROW '[' stateMatrixRowNum DOT_DOT stateMatrixRowNum ']' 1503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* It seems logical that the matrix row range specifier would have 1505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to specify a range or more than one row (i.e., $5 > $3). 1506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * However, the ARB_vertex_program spec says "a program will fail 1507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to load if <a> is greater than <b>." This means that $3 == $5 1508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * is valid. 1509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($3 > $5) { 1511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @3, state, "invalid matrix row range"); 1512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $5; 1517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1520770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixItem: MATRIX stateMatrixName stateOptMatModifier 1521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2[0]; 1523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2[1]; 1524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1526770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1528770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptMatModifier: 1529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | stateMatModifier 1533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1538770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatModifier: INVERSE 1539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_INVERSE; 1541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TRANSPOSE 1543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_TRANSPOSE; 1545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INVTRANS 1547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_INVTRANS; 1549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1552770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRowNum: INTEGER 1553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 > 3) { 1555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid matrix row reference"); 1556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1560770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1561770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1563770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixName: MODELVIEW stateOptModMatNum 1564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MODELVIEW_MATRIX; 1566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PROJECTION 1569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_PROJECTION_MATRIX; 1571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = 0; 1572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MVP 1574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MVP_MATRIX; 1576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = 0; 1577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXTURE optTexCoordUnitNum 1579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_TEXTURE_MATRIX; 1581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PALETTE '[' statePaletteMatNum ']' 1584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1585054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_ARB_matrix_palette not supported"); 1586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1587770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MAT_PROGRAM '[' stateProgramMatNum ']' 1589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1590770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_PROGRAM_MATRIX; 1591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1595770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptModMatNum: 1596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1598770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1599770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | stateModMatNum 1600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1604770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateModMatNum: INTEGER 1605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix 1607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * zero is valid. 1608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 != 0) { 1610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid modelview matrix index"); 1611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1617770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePaletteMatNum: INTEGER 1618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Since GL_ARB_matrix_palette isn't supported, just let any value 1620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * through here. The error will be generated later. 1621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1625770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateProgramMatNum: INTEGER 1626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1627ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxProgramMatrices) { 1628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program matrix selector"); 1629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1636333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian RomanickstateDepthItem: DEPTH RANGE 1637333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick { 1638333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick memset($$, 0, sizeof($$)); 1639333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick $$[0] = STATE_DEPTH_RANGE; 1640333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick } 1641333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick ; 1642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1644770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramSingleItem: progEnvParam | progLocalParam; 1645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1646770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramMultipleItem: progEnvParams | progLocalParams; 1647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1648770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParams: PROGRAM ENV '[' progEnvParamNums ']' 1649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_ENV; 1653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4[0]; 1654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4[1]; 1655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1658770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNums: progEnvParamNum 1659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1661770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progEnvParamNum DOT_DOT progEnvParamNum 1664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1668770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1669770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1670770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParam: PROGRAM ENV '[' progEnvParamNum ']' 1671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1672770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1673770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1674770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_ENV; 1675770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1676770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1677770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1678770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1680770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']' 1681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1683770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_LOCAL; 1685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4[0]; 1686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4[1]; 1687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1689770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNums: progLocalParamNum 1690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1691770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1692770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1693770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progLocalParamNum DOT_DOT progLocalParamNum 1695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1701770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']' 1702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_LOCAL; 1706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1711770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNum: INTEGER 1712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1713ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxEnvParams) { 1714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid environment parameter reference"); 1715770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1717770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1718770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1719770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1721770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNum: INTEGER 1722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1723ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxLocalParams) { 1724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid local parameter reference"); 1725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1733770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstDecl: paramConstScalarDecl | paramConstVector; 1734770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstUse: paramConstScalarUse | paramConstVector; 1735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1736770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarDecl: signedFloatConstant 1737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1738600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $1; 1740600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.data[1] = $1; 1741600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.data[2] = $1; 1742600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.data[3] = $1; 1743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1744770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1746770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarUse: REAL 1747770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1748ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.count = 1; 1749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $1; 1750ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.data[1] = $1; 1751ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.data[2] = $1; 1752ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.data[3] = $1; 1753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INTEGER 1755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1756ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.count = 1; 1757770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = (float) $1; 1758ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.data[1] = (float) $1; 1759ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.data[2] = (float) $1; 1760ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.data[3] = (float) $1; 1761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1764770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstVector: '{' signedFloatConstant '}' 1765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1766600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1768f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick $$.data[1] = 0.0f; 1769f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick $$.data[2] = 0.0f; 1770600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.data[3] = 1.0f; 1771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant '}' 1773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1774600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $4; 1777f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick $$.data[2] = 0.0f; 1778600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.data[3] = 1.0f; 1779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant ',' 1781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick signedFloatConstant '}' 1782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1783600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $4; 1786f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick $$.data[2] = $6; 1787600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.data[3] = 1.0f; 1788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant ',' 1790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick signedFloatConstant ',' signedFloatConstant '}' 1791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 4; 1793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[0] = $2; 1794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.data[1] = $4; 1795f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick $$.data[2] = $6; 1796f3cba9d66a5b45f4afeda3763f9ec1fb53e2ec89Ian Romanick $$.data[3] = $8; 1797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1800770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicksignedFloatConstant: optionalSign REAL 1801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1802770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = ($1) ? -$2 : $2; 1803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | optionalSign INTEGER 1805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = (float)(($1) ? -$2 : $2); 1807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1809770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1810770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalSign: '+' { $$ = FALSE; } 1811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '-' { $$ = TRUE; } 1812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$ = FALSE; } 1813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1815d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickTEMP_statement: optVarSize TEMP { $<integer>$ = $2; } varNameList 1816d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick ; 1817d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 18180e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickoptVarSize: string 1819d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick { 1820d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick /* NV_fragment_program_option defines the size qualifiers in a 1821d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * fairly broken way. "SHORT" or "LONG" can optionally be used 1822d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * before TEMP or OUTPUT. However, neither is a reserved word! 1823d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * This means that we have to parse it as an identifier, then check 1824d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * to make sure it's one of the valid values. *sigh* 1825d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * 1826d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * In addition, the grammar in the extension spec does *not* allow 1827d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * the size specifier to be optional, but all known implementations 1828d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * do. 1829d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick */ 1830d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (!state->option.NV_fragment) { 1831d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick yyerror(& @1, state, "unexpected IDENTIFIER"); 1832d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick YYERROR; 1833d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1834d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1835d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (strcmp("SHORT", $1) == 0) { 1836d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } else if (strcmp("LONG", $1) == 0) { 1837d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } else { 1838d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick char *const err_str = 1839d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick make_error_string("invalid storage size specifier \"%s\"", 1840d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick $1); 1841d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1842d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick yyerror(& @1, state, (err_str != NULL) 1843d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick ? err_str : "invalid storage size specifier"); 1844d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1845d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (err_str != NULL) { 1846d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick _mesa_free(err_str); 1847d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1848d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1849d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick YYERROR; 1850d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1851d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1852d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick | 1853d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick { 1854d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1856770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1857770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickADDRESS_statement: ADDRESS { $<integer>$ = $1; } varNameList 1858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1860770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvarNameList: varNameList ',' IDENTIFIER 1861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1862770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!declare_variable(state, $3, $<integer>0, & @3)) { 1863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | IDENTIFIER 1867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!declare_variable(state, $1, $<integer>0, & @1)) { 1869770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1870770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1874d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickOUTPUT_statement: optVarSize OUTPUT IDENTIFIER '=' resultBinding 1875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1877d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick declare_variable(state, $3, at_output, & @3); 1878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1879770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1880770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1882d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick s->output_binding = $5; 1883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1884770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1886770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1887770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultBinding: RESULT POSITION 1888770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_HPOS; 1891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT FOGCOORD 1897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1898770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_FOGC; 1900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1905770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT resultColBinding 1906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT POINTSIZE 1910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_PSIZ; 1913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1914770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT TEXCOORD optTexCoordUnitNum 1919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_TEX0 + $3; 1922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT DEPTH 1928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_fragment) { 1930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_RESULT_DEPTH; 1931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 1933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1937770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1938770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultColBinding: COLOR optResultFaceType optResultColorType 1939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1940770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2 + $3; 1941770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1942770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1943770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1944770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultFaceType: 1945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = (state->mode == ARB_vertex) 1947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ? VERT_RESULT_COL0 1948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick : FRAG_RESULT_COLOR; 1949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRONT 1951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1952770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_COL0; 1954770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1955770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1956770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1957770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1958770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BACK 1960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_BFC0; 1963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1965770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1966770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1970770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultColorType: 1971770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1972770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PRIMARY 1975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1983770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SECONDARY 1984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 1986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 1; 1987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 1989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1990770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1994770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptFaceType: { $$ = 0; } 1995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRONT { $$ = 0; } 1996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BACK { $$ = 1; } 1997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1999770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptColorType: { $$ = 0; } 2000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PRIMARY { $$ = 0; } 2001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SECONDARY { $$ = 1; } 2002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2004770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexCoordUnitNum: { $$ = 0; } 2005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' texCoordUnitNum ']' { $$ = $2; } 2006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2008770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexImageUnitNum: { $$ = 0; } 2009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' texImageUnitNum ']' { $$ = $2; } 2010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2012770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptLegacyTexUnitNum: { $$ = 0; } 2013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' legacyTexUnitNum ']' { $$ = $2; } 2014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2016770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexCoordUnitNum: INTEGER 2017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2018ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureCoordUnits) { 2019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture coordinate unit selector"); 2020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2021770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 2024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2027770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnitNum: INTEGER 2028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2029ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureImageUnits) { 2030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture image unit selector"); 2031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 2035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2037770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2038770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicklegacyTexUnitNum: INTEGER 2039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2040ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureUnits) { 2041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture unit selector"); 2042770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2044770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 2046770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2047770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2048770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 20490e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickALIAS_statement: ALIAS IDENTIFIER '=' USED_IDENTIFIER 2050770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *exist = (struct asm_symbol *) 2052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $2); 2053770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *target = (struct asm_symbol *) 2054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $4); 2055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (exist != NULL) { 2058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "redeclared identifier"); 2059770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2060770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (target == NULL) { 2061770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @4, state, 2062770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "undefined variable binding in ALIAS statement"); 2063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_add_symbol(state->st, 0, $2, target); 2066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2067770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2068770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2069770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 20700e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickstring: IDENTIFIER 20710e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick | USED_IDENTIFIER 20720e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick ; 20730e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick 2074770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%% 2075770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 20769ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickvoid 20779ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickasm_instruction_set_operands(struct asm_instruction *inst, 20789ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_dst_register *dst, 20799ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src0, 20809ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src1, 20819ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src2) 20829ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick{ 20839ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick /* In the core ARB extensions only the KIL instruction doesn't have a 20849ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick * destination register. 20859ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick */ 20869ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (dst == NULL) { 20879ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick init_dst_reg(& inst->Base.DstReg); 20889ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } else { 20899ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.DstReg = *dst; 20909ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 20919ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 20929ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.SrcReg[0] = src0->Base; 20939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->SrcReg[0] = *src0; 20949ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 20959ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (src1 != NULL) { 20969ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.SrcReg[1] = src1->Base; 20979ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->SrcReg[1] = *src1; 20989ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } else { 20999ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick init_src_reg(& inst->SrcReg[1]); 21009ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 21019ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 21029ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (src2 != NULL) { 21039ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.SrcReg[2] = src2->Base; 21049ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->SrcReg[2] = *src2; 21059ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } else { 21069ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick init_src_reg(& inst->SrcReg[2]); 21079ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 21089ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick} 21099ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 21109ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 2111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_instruction * 2112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickasm_instruction_ctor(gl_inst_opcode op, 2113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct prog_dst_register *dst, 2114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src0, 2115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src1, 2116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src2) 2117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 21189ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction); 2119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (inst) { 2121ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick _mesa_init_instructions(& inst->Base, 1); 2122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->Base.Opcode = op; 212317534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick 21249ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick asm_instruction_set_operands(inst, dst, src0, src1, src2); 21259ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 21269ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 21279ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick return inst; 21289ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick} 21299ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 21309ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 21319ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstruct asm_instruction * 21329ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickasm_instruction_copy_ctor(const struct prog_instruction *base, 21339ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_dst_register *dst, 21349ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src0, 21359ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src1, 21369ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src2) 21379ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick{ 21389ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction); 21399ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 21409ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (inst) { 21419ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick _mesa_init_instructions(& inst->Base, 1); 21429ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.Opcode = base->Opcode; 2143d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Base.CondUpdate = base->CondUpdate; 2144d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Base.CondDst = base->CondDst; 21459ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.SaturateMode = base->SaturateMode; 2146d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Base.Precision = base->Precision; 21479ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 21489ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick asm_instruction_set_operands(inst, dst, src0, src1, src2); 2149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return inst; 2152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 2156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_dst_reg(struct prog_dst_register *r) 2157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(r, 0, sizeof(*r)); 2159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->File = PROGRAM_UNDEFINED; 2160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->WriteMask = WRITEMASK_XYZW; 2161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->CondMask = COND_TR; 2162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->CondSwizzle = SWIZZLE_NOOP; 2163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 2167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_src_reg(struct asm_src_register *r) 2168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(r, 0, sizeof(*r)); 2170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Base.File = PROGRAM_UNDEFINED; 2171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Base.Swizzle = SWIZZLE_NOOP; 2172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Symbol = NULL; 2173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/** 2177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validate the set of inputs used by a program 2178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 2179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validates that legal sets of inputs are used by the program. In this case 2180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * "used" included both reading the input or binding the input to a name using 2181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the \c ATTRIB command. 2182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 2183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \return 2184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise. 2185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvalidate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state) 2188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int inputs = state->prog->InputsRead | state->InputsBound; 2190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (((inputs & 0x0ffff) & (inputs >> 16)) != 0) { 2192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "illegal use of generic attribute and name attribute"); 2193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 2194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 2197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_symbol * 2201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickdeclare_variable(struct asm_parser_state *state, char *name, enum asm_type t, 2202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct YYLTYPE *locp) 2203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *s = NULL; 2205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *exist = (struct asm_symbol *) 2206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, name); 2207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (exist != NULL) { 2210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "redeclared identifier"); 2211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s = calloc(1, sizeof(struct asm_symbol)); 2213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->name = name; 2214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->type = t; 2215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch (t) { 2217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_temp: 2218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->NumTemporaries >= state->limits->MaxTemps) { 2219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "too many temporaries declared"); 2220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(s); 2221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return NULL; 2222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->temp_binding = state->prog->NumTemporaries; 2225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumTemporaries++; 2226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 2227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_address: 2229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->NumAddressRegs >= state->limits->MaxAddressRegs) { 2230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "too many address registers declared"); 2231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(s); 2232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return NULL; 2233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for multiple address registers. 2236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumAddressRegs++; 2238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 2239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 2241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 2242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_add_symbol(state->st, 0, s->name, s); 224594b45567047fd681666f261f1ad0164049f0491aIan Romanick s->next = state->sym; 224694b45567047fd681666f261f1ad0164049f0491aIan Romanick state->sym = s; 2247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return s; 2250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint add_state_reference(struct gl_program_parameter_list *param_list, 2254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 2255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const GLuint size = 4; /* XXX fix */ 2257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick char *name; 2258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLint index; 2259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick name = _mesa_program_state_string(tokens); 2261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name, 2262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick size, GL_NONE, 2263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick NULL, (gl_state_index *) tokens, 0x0); 2264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_list->StateFlags |= _mesa_program_state_flags(tokens); 2265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* free name string here since we duplicated it in add_parameter() */ 2267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_free(name); 2268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return index; 2270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_state(struct gl_program *prog, 2275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 2276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 2277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int idx = -1; 2279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_state_index state_tokens[STATE_LENGTH]; 2280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memcpy(state_tokens, tokens, sizeof(state_tokens)); 2283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 228528b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = PROGRAM_STATE_VAR; 2286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* If we are adding a STATE_MATRIX that has multiple rows, we need to 2288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * unroll it and call add_state_reference() for each row 2289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ((state_tokens[0] == STATE_MODELVIEW_MATRIX || 2291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_PROJECTION_MATRIX || 2292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_MVP_MATRIX || 2293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_TEXTURE_MATRIX || 2294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_PROGRAM_MATRIX) 2295770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && (state_tokens[2] != state_tokens[3])) { 2296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int row; 2297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int first_row = state_tokens[2]; 2298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int last_row = state_tokens[3]; 2299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (row = first_row; row <= last_row; row++) { 2301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[2] = state_tokens[3] = row; 2302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick else { 2310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_param(struct gl_program *prog, 2322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 2323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 2324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int idx = -1; 2326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_state_index state_tokens[STATE_LENGTH]; 2327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memcpy(state_tokens, tokens, sizeof(state_tokens)); 2330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert((state_tokens[0] == STATE_VERTEX_PROGRAM) 2332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick || (state_tokens[0] == STATE_FRAGMENT_PROGRAM)); 2333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert((state_tokens[1] == STATE_ENV) 2334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick || (state_tokens[1] == STATE_LOCAL)); 2335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 233728b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = (state_tokens[1] == STATE_ENV) 233828b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick ? PROGRAM_ENV_PARAM : PROGRAM_LOCAL_PARAM; 2339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements, 2341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * we need to unroll it and call add_state_reference() for each row 2342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state_tokens[2] != state_tokens[3]) { 2344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int row; 2345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int first_row = state_tokens[2]; 2346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int last_row = state_tokens[3]; 2347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (row = first_row; row <= last_row; row++) { 2349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[2] = state_tokens[3] = row; 2350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick else { 2358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_const(struct gl_program *prog, 2370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 2371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_vector *vec) 2372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int idx = _mesa_add_parameter(prog->Parameters, PROGRAM_CONSTANT, 2374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick NULL, vec->count, GL_NONE, vec->data, 2375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick NULL, 0x0); 2376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 237828b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = PROGRAM_CONSTANT; 2379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (param_var->param_binding_begin == ~0U) 2381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 238844843c753301db0e8f8343745777479465f34cccIan Romanickchar * 238944843c753301db0e8f8343745777479465f34cccIan Romanickmake_error_string(const char *fmt, ...) 239044843c753301db0e8f8343745777479465f34cccIan Romanick{ 239144843c753301db0e8f8343745777479465f34cccIan Romanick int length; 239244843c753301db0e8f8343745777479465f34cccIan Romanick char *str; 239344843c753301db0e8f8343745777479465f34cccIan Romanick va_list args; 239444843c753301db0e8f8343745777479465f34cccIan Romanick 239544843c753301db0e8f8343745777479465f34cccIan Romanick va_start(args, fmt); 239644843c753301db0e8f8343745777479465f34cccIan Romanick 239744843c753301db0e8f8343745777479465f34cccIan Romanick /* Call vsnprintf once to determine how large the final string is. Call it 239844843c753301db0e8f8343745777479465f34cccIan Romanick * again to do the actual formatting. from the vsnprintf manual page: 239944843c753301db0e8f8343745777479465f34cccIan Romanick * 240044843c753301db0e8f8343745777479465f34cccIan Romanick * Upon successful return, these functions return the number of 240144843c753301db0e8f8343745777479465f34cccIan Romanick * characters printed (not including the trailing '\0' used to end 240244843c753301db0e8f8343745777479465f34cccIan Romanick * output to strings). 240344843c753301db0e8f8343745777479465f34cccIan Romanick */ 240444843c753301db0e8f8343745777479465f34cccIan Romanick length = 1 + vsnprintf(NULL, 0, fmt, args); 240544843c753301db0e8f8343745777479465f34cccIan Romanick 240644843c753301db0e8f8343745777479465f34cccIan Romanick str = _mesa_malloc(length); 240744843c753301db0e8f8343745777479465f34cccIan Romanick if (str) { 240844843c753301db0e8f8343745777479465f34cccIan Romanick vsnprintf(str, length, fmt, args); 240944843c753301db0e8f8343745777479465f34cccIan Romanick } 241044843c753301db0e8f8343745777479465f34cccIan Romanick 241144843c753301db0e8f8343745777479465f34cccIan Romanick va_end(args); 241244843c753301db0e8f8343745777479465f34cccIan Romanick 241344843c753301db0e8f8343745777479465f34cccIan Romanick return str; 241444843c753301db0e8f8343745777479465f34cccIan Romanick} 241544843c753301db0e8f8343745777479465f34cccIan Romanick 241644843c753301db0e8f8343745777479465f34cccIan Romanick 2417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 2418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickyyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s) 2419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 242044843c753301db0e8f8343745777479465f34cccIan Romanick char *err_str; 242144843c753301db0e8f8343745777479465f34cccIan Romanick 2422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 242344843c753301db0e8f8343745777479465f34cccIan Romanick err_str = make_error_string("glProgramStringARB(%s)\n", s); 242444843c753301db0e8f8343745777479465f34cccIan Romanick if (err_str) { 242544843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_error(state->ctx, GL_INVALID_OPERATION, err_str); 242644843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_free(err_str); 242744843c753301db0e8f8343745777479465f34cccIan Romanick } 242844843c753301db0e8f8343745777479465f34cccIan Romanick 242944843c753301db0e8f8343745777479465f34cccIan Romanick err_str = make_error_string("line %u, char %u: error: %s\n", 243044843c753301db0e8f8343745777479465f34cccIan Romanick locp->first_line, locp->first_column, s); 243144843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_set_program_error(state->ctx, locp->position, err_str); 243244843c753301db0e8f8343745777479465f34cccIan Romanick 243344843c753301db0e8f8343745777479465f34cccIan Romanick if (err_str) { 243444843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_free(err_str); 243544843c753301db0e8f8343745777479465f34cccIan Romanick } 2436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 243844843c753301db0e8f8343745777479465f34cccIan Romanick 2439770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean 2440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_parse_arb_program(GLcontext *ctx, GLenum target, const GLubyte *str, 2441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLsizei len, struct asm_parser_state *state) 2442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *inst; 2444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned i; 2445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLubyte *strz; 244694b45567047fd681666f261f1ad0164049f0491aIan Romanick GLboolean result = GL_FALSE; 244794b45567047fd681666f261f1ad0164049f0491aIan Romanick void *temp; 244894b45567047fd681666f261f1ad0164049f0491aIan Romanick struct asm_symbol *sym; 2449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 245044843c753301db0e8f8343745777479465f34cccIan Romanick state->ctx = ctx; 2451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Target = target; 2452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Parameters = _mesa_new_parameter_list(); 2453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Make a copy of the program string and force it to be NUL-terminated. 2455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick strz = (GLubyte *) _mesa_malloc(len + 1); 2457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strz == NULL) { 2458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); 2459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return GL_FALSE; 2460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_memcpy (strz, str, len); 2462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick strz[len] = '\0'; 2463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->String = strz; 2465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->st = _mesa_symbol_table_ctor(); 2467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 246848183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick state->limits = (target == GL_VERTEX_PROGRAM_ARB) 246948183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick ? & ctx->Const.VertexProgram 247048183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick : & ctx->Const.FragmentProgram; 2471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 24724cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits; 24734cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxTextureCoordUnits = ctx->Const.MaxTextureCoordUnits; 24744cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxTextureUnits = ctx->Const.MaxTextureUnits; 24754cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxClipPlanes = ctx->Const.MaxClipPlanes; 24764cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxLights = ctx->Const.MaxLights; 24774cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxProgramMatrices = ctx->Const.MaxProgramMatrices; 2478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB) 2480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM; 2481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_set_program_error(ctx, -1, NULL); 2483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_program_lexer_ctor(& state->scanner, state, (const char *) str, len); 2485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyparse(state); 2486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_program_lexer_dtor(state->scanner); 2487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 248944843c753301db0e8f8343745777479465f34cccIan Romanick if (ctx->Program.ErrorPos != -1) { 249094b45567047fd681666f261f1ad0164049f0491aIan Romanick goto error; 249144843c753301db0e8f8343745777479465f34cccIan Romanick } 249244843c753301db0e8f8343745777479465f34cccIan Romanick 2493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (! _mesa_layout_parameters(state)) { 249444843c753301db0e8f8343745777479465f34cccIan Romanick struct YYLTYPE loc; 249544843c753301db0e8f8343745777479465f34cccIan Romanick 249644843c753301db0e8f8343745777479465f34cccIan Romanick loc.first_line = 0; 249744843c753301db0e8f8343745777479465f34cccIan Romanick loc.first_column = 0; 249844843c753301db0e8f8343745777479465f34cccIan Romanick loc.position = len; 249944843c753301db0e8f8343745777479465f34cccIan Romanick 250044843c753301db0e8f8343745777479465f34cccIan Romanick yyerror(& loc, state, "invalid PARAM usage"); 250194b45567047fd681666f261f1ad0164049f0491aIan Romanick goto error; 2502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Add one instruction to store the "END" instruction. 2507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions = 2509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_alloc_instructions(state->prog->NumInstructions + 1); 2510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst = state->inst_head; 2511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (i = 0; i < state->prog->NumInstructions; i++) { 2512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *const temp = inst->next; 2513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions[i] = inst->Base; 2515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst = temp; 2516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Finally, tag on an OPCODE_END instruction */ 2519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const GLuint numInst = state->prog->NumInstructions; 2521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_init_instructions(state->prog->Instructions + numInst, 1); 2522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions[numInst].Opcode = OPCODE_END; 2523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumInstructions++; 2525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2526c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick state->prog->NumParameters = state->prog->Parameters->NumParameters; 25274c5879ff3185e03b3baf0ed2765e06a951b35e9eIan Romanick state->prog->NumAttributes = _mesa_bitcount(state->prog->InputsRead); 2528c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick 2529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* 2530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Initialize native counts to logical counts. The device driver may 2531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * change them if program is translated into a hardware program. 2532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeInstructions = state->prog->NumInstructions; 2534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeTemporaries = state->prog->NumTemporaries; 2535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeParameters = state->prog->NumParameters; 2536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeAttributes = state->prog->NumAttributes; 2537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeAddressRegs = state->prog->NumAddressRegs; 2538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 253994b45567047fd681666f261f1ad0164049f0491aIan Romanick result = GL_TRUE; 254094b45567047fd681666f261f1ad0164049f0491aIan Romanick 254194b45567047fd681666f261f1ad0164049f0491aIan Romanickerror: 254294b45567047fd681666f261f1ad0164049f0491aIan Romanick for (inst = state->inst_head; inst != NULL; inst = temp) { 254394b45567047fd681666f261f1ad0164049f0491aIan Romanick temp = inst->next; 254494b45567047fd681666f261f1ad0164049f0491aIan Romanick _mesa_free(inst); 254594b45567047fd681666f261f1ad0164049f0491aIan Romanick } 254694b45567047fd681666f261f1ad0164049f0491aIan Romanick 254794b45567047fd681666f261f1ad0164049f0491aIan Romanick state->inst_head = NULL; 254894b45567047fd681666f261f1ad0164049f0491aIan Romanick state->inst_tail = NULL; 254994b45567047fd681666f261f1ad0164049f0491aIan Romanick 255094b45567047fd681666f261f1ad0164049f0491aIan Romanick for (sym = state->sym; sym != NULL; sym = temp) { 255194b45567047fd681666f261f1ad0164049f0491aIan Romanick temp = sym->next; 255294b45567047fd681666f261f1ad0164049f0491aIan Romanick 255394b45567047fd681666f261f1ad0164049f0491aIan Romanick _mesa_free((void *) sym->name); 255494b45567047fd681666f261f1ad0164049f0491aIan Romanick _mesa_free(sym); 255594b45567047fd681666f261f1ad0164049f0491aIan Romanick } 255694b45567047fd681666f261f1ad0164049f0491aIan Romanick state->sym = NULL; 255794b45567047fd681666f261f1ad0164049f0491aIan Romanick 255894b45567047fd681666f261f1ad0164049f0491aIan Romanick _mesa_symbol_table_dtor(state->st); 255994b45567047fd681666f261f1ad0164049f0491aIan Romanick state->st = NULL; 256094b45567047fd681666f261f1ad0164049f0491aIan Romanick 256194b45567047fd681666f261f1ad0164049f0491aIan Romanick return result; 2562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2563