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" 30ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program.h" 31ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h" 32ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter_layout.h" 33ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_statevars.h" 34ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h" 35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 36ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/symbol_table.h" 37ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/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, 557c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul struct asm_symbol *param_var, const struct asm_vector *vec, 567c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul GLboolean allowSwizzle); 57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int yyparse(struct asm_parser_state *state); 59770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 60ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanickstatic char *make_error_string(const char *fmt, ...); 61ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick 62770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void yyerror(struct YYLTYPE *locp, struct asm_parser_state *state, 63770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const char *s); 64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 65770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int validate_inputs(struct YYLTYPE *locp, 66770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_parser_state *state); 67770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 68770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_dst_reg(struct prog_dst_register *r); 69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 70df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulstatic void set_dst_reg(struct prog_dst_register *r, 71df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul gl_register_file file, GLint index); 72df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul 73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_src_reg(struct asm_src_register *r); 74770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 75df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulstatic void set_src_reg(struct asm_src_register *r, 76df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul gl_register_file file, GLint index); 77df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul 78639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paulstatic void set_src_reg_swz(struct asm_src_register *r, 79639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul gl_register_file file, GLint index, GLuint swizzle); 80639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul 819ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstatic void asm_instruction_set_operands(struct asm_instruction *inst, 829ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_dst_register *dst, const struct asm_src_register *src0, 839ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src1, const struct asm_src_register *src2); 849ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op, 86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct prog_dst_register *dst, const struct asm_src_register *src0, 87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src1, const struct asm_src_register *src2); 88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 899ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstatic struct asm_instruction *asm_instruction_copy_ctor( 909ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_instruction *base, const struct prog_dst_register *dst, 919ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src0, const struct asm_src_register *src1, 929ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src2); 939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef FALSE 95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define FALSE 0 96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define TRUE (!FALSE) 97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif 98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLLOC_DEFAULT(Current, Rhs, N) \ 100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick do { \ 101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (YYID(N)) { \ 102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).position = YYRHSLOC(Rhs, 1).position; \ 105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { \ 108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_line = YYRHSLOC(Rhs, 0).last_line; \ 109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_line = (Current).first_line; \ 110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).first_column = YYRHSLOC(Rhs, 0).last_column; \ 111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).last_column = (Current).first_column; \ 112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick (Current).position = YYRHSLOC(Rhs, 0).position \ 113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick + (Current).first_column; \ 114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } \ 115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } while(YYID(0)) 116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLEX_PARAM state->scanner 118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%} 119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%pure-parser 121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%locations 122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%parse-param { struct asm_parser_state *state } 123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%error-verbose 124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%lex-param { void *scanner } 125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%union { 127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *inst; 128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *sym; 129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol temp_sym; 130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_swizzle_mask swiz_mask; 131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_src_register src_reg; 132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct prog_dst_register dst_reg; 133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct prog_instruction temp_inst; 134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick char *string; 135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned result; 136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned attrib; 137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int integer; 138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick float real; 139592a6642fc5c9f697bcc6521c99fe00b2de827c8Brian Paul gl_state_index state[STATE_LENGTH]; 140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int negate; 141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_vector vector; 142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_inst_opcode opcode; 143565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 144565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick struct { 145565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned swz; 146565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned rgba_valid:1; 147565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned xyzw_valid:1; 148565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick unsigned negate:1; 149565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick } ext_swizzle; 150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ARBvp_10 ARBfp_10 153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* Tokens for assembler pseudo-ops */ 155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> ADDRESS 156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ALIAS ATTRIB 157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OPTION OUTPUT 158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PARAM 159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> TEMP 160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token END 161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Tokens for instructions */ 163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <temp_inst> BIN_OP BINSC_OP SAMPLE_OP SCALAR_OP TRI_OP VECTOR_OP 164ede0cd4d8c8eb8c6c443c84905138091944d69afIan Romanick%token <temp_inst> ARL KIL SWZ TXD_OP 165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> INTEGER 167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <real> REAL 168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token AMBIENT ATTENUATION 170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token BACK 171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token CLIP COLOR 172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DEPTH DIFFUSE DIRECTION 173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token EMISSION ENV EYE 174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token FOG FOGCOORD FRAGMENT FRONT 175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token HALF 176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token INVERSE INVTRANS 177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token LIGHT LIGHTMODEL LIGHTPROD LOCAL 178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token MATERIAL MAT_PROGRAM MATRIX MATRIXINDEX MODELVIEW MVP 179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token NORMAL 180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OBJECT 1813fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul%token PALETTE PARAMS PLANE POINT_TOK POINTSIZE POSITION PRIMARY PROGRAM PROJECTION 182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token RANGE RESULT ROW 1833fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul%token SCENECOLOR SECONDARY SHININESS SIZE_TOK SPECULAR SPOT STATE 184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE 185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT 1861edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick%token TEX_SHADOW1D TEX_SHADOW2D TEX_SHADOWRECT 187aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick%token TEX_ARRAY1D TEX_ARRAY2D TEX_ARRAYSHADOW1D TEX_ARRAYSHADOW2D 188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token VERTEX VTXATTRIB 189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token WEIGHT 190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1910e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick%token <string> IDENTIFIER USED_IDENTIFIER 1920e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick%type <string> string 193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <swiz_mask> MASK4 MASK3 MASK2 MASK1 SWIZZLE 194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT_DOT 195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT 196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> instruction ALU_instruction TexInstruction 198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> ARL_instruction VECTORop_instruction 199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> SCALARop_instruction BINSCop_instruction BINop_instruction 2008ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick%type <inst> TRIop_instruction TXD_instruction SWZ_instruction SAMPLE_instruction 201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> KIL_instruction 202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <dst_reg> dstReg maskedDstReg maskedAddrReg 204eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick%type <src_reg> srcReg scalarUse scalarSrcReg swizzleSrcReg 205565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <swiz_mask> scalarSuffix swizzleSuffix extendedSwizzle 206565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <ext_swizzle> extSwizComp extSwizSel 207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> optionalMask 208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> progParamArray 210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> addrRegRelOffset addrRegPosOffset addrRegNegOffset 211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <src_reg> progParamArrayMem progParamArrayAbs progParamArrayRel 212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> addrReg 213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> addrComponent addrWriteMask 214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 21581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick%type <dst_reg> ccMaskRule ccTest ccMaskRule2 ccTest2 optionalCcMask 21681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <result> resultBinding resultColBinding 218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optFaceType optColorType 219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optResultFaceType optResultColorType 220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexImageUnitNum texImageUnitNum 222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexCoordUnitNum texCoordUnitNum 223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optLegacyTexUnitNum legacyTexUnitNum 224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> texImageUnit texTarget 225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> vtxAttribNum 226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <attrib> attribBinding vtxAttribItem fragAttribItem 228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleInit paramSingleItemDecl 230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optArraySize 231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateSingleItem stateMultipleItem 233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMaterialItem 234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLightItem stateLightModelItem stateLightProdItem 235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateTexGenItem stateFogItem stateClipPlaneItem statePointItem 236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixItem stateMatrixRow stateMatrixRows 237333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick%type <state> stateTexEnvItem stateDepthItem 238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLModProperty 240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixName optMatrixRows 241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateMatProperty 243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightProperty stateSpotProperty 244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightNumber stateLProdProperty 245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexGenType stateTexGenCoord 246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexEnvProperty 247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateFogProperty 248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateClipPlaneNum 249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> statePointProperty 250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptMatModifier stateMatModifier stateMatrixRowNum 252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptModMatNum stateModMatNum statePaletteMatNum 253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateProgramMatNum 254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> ambDiffSpecProperty 256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programSingleItem progEnvParam progLocalParam 258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programMultipleItem progEnvParams progLocalParams 259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramMultipleInit paramMultInitList paramMultipleItem 261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleItemUse 262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> progEnvParamNum progLocalParamNum 264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> progEnvParamNums progLocalParamNums 265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstDecl paramConstUse 267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstScalarDecl paramConstScalarUse paramConstVector 268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <real> signedFloatConstant 269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <negate> optionalSign 270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{ 272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, 273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick void *yyscanner); 274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%} 275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%% 277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickprogram: language optionSequence statementSequence END 279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanicklanguage: ARBvp_10 282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) { 284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid fragment program header"); 285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->mode = ARB_vertex; 288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ARBfp_10 290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) { 292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid vertex program header"); 293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->mode = ARB_fragment; 29588018e2e073909ae807f16707f2701e068900926Ian Romanick 29688018e2e073909ae807f16707f2701e068900926Ian Romanick state->option.TexRect = 29788018e2e073909ae807f16707f2701e068900926Ian Romanick (state->ctx->Extensions.NV_texture_rectangle != GL_FALSE); 298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 301770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionSequence: optionSequence option 302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | 303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 3050e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickoption: OPTION string ';' 306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int valid = 0; 308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick valid = _mesa_ARBvp_parse_option(state, $2); 311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (state->mode == ARB_fragment) { 312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick valid = _mesa_ARBfp_parse_option(state, $2); 313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 316301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($2); 317301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!valid) { 31941d5696628a5eef62cd671711b33edea9344977dIan Romanick const char *const err_str = (state->mode == ARB_vertex) 32041d5696628a5eef62cd671711b33edea9344977dIan Romanick ? "invalid ARB vertex program option" 32141d5696628a5eef62cd671711b33edea9344977dIan Romanick : "invalid ARB fragment program option"; 32241d5696628a5eef62cd671711b33edea9344977dIan Romanick 32341d5696628a5eef62cd671711b33edea9344977dIan Romanick yyerror(& @2, state, err_str); 324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 329770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatementSequence: statementSequence statement 330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | 331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatement: instruction ';' 334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 != NULL) { 336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->inst_tail == NULL) { 337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_head = $1; 338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_tail->next = $1; 340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->inst_tail = $1; 343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1->next = NULL; 344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumInstructions++; 346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | namingStatement ';' 349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinstruction: ALU_instruction 3520db5ef074169589bc4d665094147aa284a5496d7Ian Romanick { 3530db5ef074169589bc4d665094147aa284a5496d7Ian Romanick $$ = $1; 3540db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->prog->NumAluInstructions++; 3550db5ef074169589bc4d665094147aa284a5496d7Ian Romanick } 356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TexInstruction 3570db5ef074169589bc4d665094147aa284a5496d7Ian Romanick { 3580db5ef074169589bc4d665094147aa284a5496d7Ian Romanick $$ = $1; 3590db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->prog->NumTexInstructions++; 3600db5ef074169589bc4d665094147aa284a5496d7Ian Romanick } 361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 363770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALU_instruction: ARL_instruction 364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | VECTORop_instruction 365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SCALARop_instruction 366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BINSCop_instruction 367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BINop_instruction 368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TRIop_instruction 369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SWZ_instruction 370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 372770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTexInstruction: SAMPLE_instruction 373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | KIL_instruction 3748ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick | TXD_instruction 375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 377770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickARL_instruction: ARL maskedAddrReg ',' scalarSrcReg 378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor(OPCODE_ARL, & $2, & $4, NULL, NULL); 380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 383770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickVECTORop_instruction: VECTOR_OP maskedDstReg ',' swizzleSrcReg 384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 385a0f7b869592013b24a5bacf0ceb2bdb1e9146378Paul Berry if ($1.Opcode == OPCODE_DDY) 386a0f7b869592013b24a5bacf0ceb2bdb1e9146378Paul Berry state->fragment.UsesDFdy = 1; 3879ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 391770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSCALARop_instruction: SCALAR_OP maskedDstReg ',' scalarSrcReg 392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 3939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 397770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINSCop_instruction: BINSC_OP maskedDstReg ',' scalarSrcReg ',' scalarSrcReg 398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 3999ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL); 400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 404770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINop_instruction: BIN_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg 405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 4069ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL); 407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 410770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTRIop_instruction: TRI_OP maskedDstReg ',' 411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg 412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 4139ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8); 414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 417770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget 418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 4199ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($$ != NULL) { 4211edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick const GLbitfield tex_mask = (1U << $6); 4221edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick GLbitfield shadow_tex = 0; 4231edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick GLbitfield target_mask = 0; 4241edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4251edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$->Base.TexSrcUnit = $6; 4270db5ef074169589bc4d665094147aa284a5496d7Ian Romanick 4281edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick if ($8 < 0) { 4291edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick shadow_tex = tex_mask; 4301edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick $$->Base.TexSrcTarget = -$8; 4321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick $$->Base.TexShadow = 1; 4331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick } else { 4341edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick $$->Base.TexSrcTarget = $8; 4351edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick } 4361edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4371edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick target_mask = (1U << $$->Base.TexSrcTarget); 4381edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4391edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick /* If this texture unit was previously accessed and that access 4401edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * had a different texture target, generate an error. 4411edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * 4421edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * If this texture unit was previously accessed and that access 4431edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick * had a different shadow mode, generate an error. 4441edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick */ 4451edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick if ((state->prog->TexturesUsed[$6] != 0) 4461edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick && ((state->prog->TexturesUsed[$6] != target_mask) 4471edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick || ((state->prog->ShadowSamplers & tex_mask) 4481edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick != shadow_tex))) { 4491edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick yyerror(& @8, state, 4501edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick "multiple targets used on one texture image unit"); 4511edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick YYERROR; 4521edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick } 4531edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4541edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick 4551edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick state->prog->TexturesUsed[$6] |= target_mask; 4561edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick state->prog->ShadowSamplers |= shadow_tex; 457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 461770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickKIL_instruction: KIL swizzleSrcReg 462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL); 4640db5ef074169589bc4d665094147aa284a5496d7Ian Romanick state->fragment.UsesKill = 1; 465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 46681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick | KIL ccTest 46781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 46881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$ = asm_instruction_ctor(OPCODE_KIL_NV, NULL, NULL, NULL, NULL); 46981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$->Base.DstReg.CondMask = $2.CondMask; 47081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$->Base.DstReg.CondSwizzle = $2.CondSwizzle; 47181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$->Base.DstReg.CondSrc = $2.CondSrc; 47281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick state->fragment.UsesKill = 1; 47381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 4768ca6fd8a83412e3a76746f0ee61027b796516f95Ian RomanickTXD_instruction: TXD_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget 4778ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick { 4789ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8); 4798ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick if ($$ != NULL) { 4808ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick const GLbitfield tex_mask = (1U << $10); 4818ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick GLbitfield shadow_tex = 0; 4828ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick GLbitfield target_mask = 0; 4838ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4848ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4858ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexSrcUnit = $10; 4868ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4878ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick if ($12 < 0) { 4888ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick shadow_tex = tex_mask; 4898ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4908ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexSrcTarget = -$12; 4918ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexShadow = 1; 4928ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } else { 4938ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick $$->Base.TexSrcTarget = $12; 4948ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 4958ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4968ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick target_mask = (1U << $$->Base.TexSrcTarget); 4978ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 4988ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick /* If this texture unit was previously accessed and that access 4998ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * had a different texture target, generate an error. 5008ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * 5018ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * If this texture unit was previously accessed and that access 5028ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * had a different shadow mode, generate an error. 5038ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick */ 5048ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick if ((state->prog->TexturesUsed[$10] != 0) 5058ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick && ((state->prog->TexturesUsed[$10] != target_mask) 5068ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick || ((state->prog->ShadowSamplers & tex_mask) 5078ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick != shadow_tex))) { 5088ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick yyerror(& @12, state, 5098ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick "multiple targets used on one texture image unit"); 5108ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick YYERROR; 5118ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 5128ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 5138ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick 5148ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick state->prog->TexturesUsed[$10] |= target_mask; 5158ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick state->prog->ShadowSamplers |= shadow_tex; 5168ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 5178ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick } 518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 520770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnit: TEXTURE_UNIT optTexImageUnitNum 521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 526770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexTarget: TEX_1D { $$ = TEXTURE_1D_INDEX; } 527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_2D { $$ = TEXTURE_2D_INDEX; } 528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_3D { $$ = TEXTURE_3D_INDEX; } 529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; } 530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEX_RECT { $$ = TEXTURE_RECT_INDEX; } 5311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick | TEX_SHADOW1D { $$ = -TEXTURE_1D_INDEX; } 5321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick | TEX_SHADOW2D { $$ = -TEXTURE_2D_INDEX; } 5331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick | TEX_SHADOWRECT { $$ = -TEXTURE_RECT_INDEX; } 534aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAY1D { $$ = TEXTURE_1D_ARRAY_INDEX; } 535aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAY2D { $$ = TEXTURE_2D_ARRAY_INDEX; } 536aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAYSHADOW1D { $$ = -TEXTURE_1D_ARRAY_INDEX; } 537aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick | TEX_ARRAYSHADOW2D { $$ = -TEXTURE_2D_ARRAY_INDEX; } 538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 540770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle 541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FIXME: Is this correct? Should the extenedSwizzle be applied 543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FIXME: to the existing swizzle? 544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $4.Base.Swizzle = $6.swizzle; 546648dac4251de69d2949026af3dec0b0befee734bIan Romanick $4.Base.Negate = $6.mask; 547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 5489ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL); 549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 552eeb1402c0514248773e66f2077b0fb52f7245d56Ian RomanickscalarSrcReg: optionalSign scalarUse 553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1) { 557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Negate = ~$$.Base.Negate; 558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 559eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 560eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick | optionalSign '|' scalarUse '|' 561eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick { 562eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$ = $3; 563eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 564eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if (!state->option.NV_fragment) { 565eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick yyerror(& @2, state, "unexpected character '|'"); 566eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick YYERROR; 567eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 568eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 569eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if ($1) { 570eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Negate = ~$$.Base.Negate; 571eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 572eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 573eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Abs = 1; 574eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 575eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick ; 576eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 577eeb1402c0514248773e66f2077b0fb52f7245d56Ian RomanickscalarUse: srcReg scalarSuffix 578eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick { 579eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$ = $1; 580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 582eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $2.swizzle); 583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 584eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick | paramConstScalarUse 585b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick { 586b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick struct asm_symbol temp_sym; 587b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick 588b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick if (!state->option.NV_fragment) { 589eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick yyerror(& @1, state, "expected scalar suffix"); 590b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick YYERROR; 591b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick } 592b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick 593b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick memset(& temp_sym, 0, sizeof(temp_sym)); 594b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick temp_sym.param_binding_begin = ~0; 5957c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul initialize_symbol_from_const(state->prog, & temp_sym, & $1, GL_TRUE); 596b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick 597639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul set_src_reg_swz(& $$, PROGRAM_CONSTANT, 598639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul temp_sym.param_binding_begin, 599639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul temp_sym.param_binding_swizzle); 600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 603770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSrcReg: optionalSign srcReg swizzleSuffix 604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1) { 608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Negate = ~$$.Base.Negate; 609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $3.swizzle); 613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 614eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick | optionalSign '|' srcReg swizzleSuffix '|' 615eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick { 616eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$ = $3; 617eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 618eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if (!state->option.NV_fragment) { 619eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick yyerror(& @2, state, "unexpected character '|'"); 620eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick YYERROR; 621eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 622eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 623eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick if ($1) { 624eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Negate = ~$$.Base.Negate; 625eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 626eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 627eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Abs = 1; 628eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, 629eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick $4.swizzle); 630eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick } 631eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick 632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 63481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickmaskedDstReg: dstReg optionalMask optionalCcMask 635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.WriteMask = $2.mask; 63881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondMask = $3.CondMask; 63981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSwizzle = $3.CondSwizzle; 64081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSrc = $3.CondSrc; 641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($$.File == PROGRAM_OUTPUT) { 643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Technically speaking, this should check that it is in 644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * vertex program mode. However, PositionInvariant can never be 645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * set in fragment program mode, so it is somewhat irrelevant. 646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->option.PositionInvariant 648770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && ($$.Index == VERT_RESULT_HPOS)) { 649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "position-invariant programs cannot " 650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "write position"); 651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 6545606dfb572bf4b89b4882265924705bacc8c182bIan Romanick state->prog->OutputsWritten |= BITFIELD64_BIT($$.Index); 655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 659770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedAddrReg: addrReg addrWriteMask 660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 661df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_dst_reg(& $$, PROGRAM_ADDRESS, 0); 662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.WriteMask = $2.mask; 663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 666770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextendedSwizzle: extSwizComp ',' extSwizComp ',' extSwizComp ',' extSwizComp 667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 668565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick const unsigned xyzw_valid = 669565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick ($1.xyzw_valid << 0) 670565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($3.xyzw_valid << 1) 671565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($5.xyzw_valid << 2) 672565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($7.xyzw_valid << 3); 673565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick const unsigned rgba_valid = 674565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick ($1.rgba_valid << 0) 675565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($3.rgba_valid << 1) 676565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($5.rgba_valid << 2) 677565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($7.rgba_valid << 3); 678565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 679565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick /* All of the swizzle components have to be valid in either RGBA 680565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * or XYZW. Note that 0 and 1 are valid in both, so both masks 681565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * can have some bits set. 682565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * 683565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * We somewhat deviate from the spec here. It would be really hard 684565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * to figure out which component is the error, and there probably 685565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * isn't a lot of benefit. 686565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick */ 687565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick if ((rgba_valid != 0x0f) && (xyzw_valid != 0x0f)) { 688565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick yyerror(& @1, state, "cannot combine RGBA and XYZW swizzle " 689565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick "components"); 690565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick YYERROR; 691565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick } 692565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 693565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swizzle = MAKE_SWIZZLE4($1.swz, $3.swz, $5.swz, $7.swz); 694565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.mask = ($1.negate) | ($3.negate << 1) | ($5.negate << 2) 695565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick | ($7.negate << 3); 696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 699770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizComp: optionalSign extSwizSel 700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 701565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$ = $2; 702565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.negate = ($1) ? 1 : 0; 703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 706770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizSel: INTEGER 707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (($1 != 0) && ($1 != 1)) { 709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 713565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = ($1 == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE; 714565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 715565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick /* 0 and 1 are valid for both RGBA swizzle names and XYZW 716565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * swizzle names. 717565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick */ 718565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 719565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 7210e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick | string 722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 723301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick char s; 724301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strlen($1) > 1) { 726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 730301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick s = $1[0]; 731301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($1); 732301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 733301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick switch (s) { 734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'x': 735565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_X; 736565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'y': 739565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Y; 740565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'z': 743565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Z; 744565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case 'w': 747565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_W; 748565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.xyzw_valid = 1; 749565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 750565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 751565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'r': 752565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_X; 753565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 754565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 755565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'g': 756565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Y; 757565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 759565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'b': 760565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_Z; 761565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 762565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 763565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick case 'a': 764565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.swz = SWIZZLE_W; 765565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick $$.rgba_valid = 1; 766565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick break; 767565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid extended swizzle selector"); 770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 7760e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanicksrcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */ 777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 781301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($1); 782301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_param) && (s->type != at_temp) 787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && (s->type != at_attrib)) { 788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type == at_param) && s->param_is_array) { 791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "non-array access to array PARAM"); 792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch (s->type) { 797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_temp: 798df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_src_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding); 799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_param: 801639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul set_src_reg_swz(& $$, s->param_binding_type, 802639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul s->param_binding_begin, 803639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul s->param_binding_swizzle); 804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_attrib: 806df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_src_reg(& $$, PROGRAM_INPUT, s->attrib_binding); 807dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich state->prog->InputsRead |= BITFIELD64_BIT($$.Base.Index); 8088a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick 8098a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick if (!validate_inputs(& @1, state)) { 8108a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick YYERROR; 8118a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick } 8128a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick break; 813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | attribBinding 820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 821df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_src_reg(& $$, PROGRAM_INPUT, $1); 822dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich state->prog->InputsRead |= BITFIELD64_BIT($$.Base.Index); 823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!validate_inputs(& @1, state)) { 825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progParamArray '[' progParamArrayMem ']' 829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (! $3.Base.RelAddr 831ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick && ((unsigned) $3.Base.Index >= $1->param_binding_length)) { 832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @3, state, "out of bounds array access"); 833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.File = $1->param_binding_type; 838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($3.Base.RelAddr) { 84056643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul state->prog->IndirectRegisterFiles |= (1 << $$.Base.File); 841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1->param_accessed_indirectly = 1; 842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.RelAddr = 1; 844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $3.Base.Index; 845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Symbol = $1; 846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1->param_binding_begin + $3.Base.Index; 848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramSingleItemUse 851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 852df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul gl_register_file file = ($1.name != NULL) 85369d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick ? $1.param_binding_type 85469d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick : PROGRAM_CONSTANT; 855639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul set_src_reg_swz(& $$, file, $1.param_binding_begin, 856639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul $1.param_binding_swizzle); 857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 860770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickdstReg: resultBinding 861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 862df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_dst_reg(& $$, PROGRAM_OUTPUT, $1); 863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 8640e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick | USED_IDENTIFIER /* temporaryReg | vertexResultReg */ 865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 869301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($1); 870301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_output) && (s->type != at_temp)) { 875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 87986b33b5649710f351d241ce6890200ac1f38f724Ian Romanick switch (s->type) { 88086b33b5649710f351d241ce6890200ac1f38f724Ian Romanick case at_temp: 881df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_dst_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding); 88286b33b5649710f351d241ce6890200ac1f38f724Ian Romanick break; 88386b33b5649710f351d241ce6890200ac1f38f724Ian Romanick case at_output: 884df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_dst_reg(& $$, PROGRAM_OUTPUT, s->output_binding); 88586b33b5649710f351d241ce6890200ac1f38f724Ian Romanick break; 88686b33b5649710f351d241ce6890200ac1f38f724Ian Romanick default: 887df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul set_dst_reg(& $$, s->param_binding_type, s->param_binding_begin); 88886b33b5649710f351d241ce6890200ac1f38f724Ian Romanick break; 889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 8930e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickprogParamArray: USED_IDENTIFIER 894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 898301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($1); 899301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid operand variable"); 902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if ((s->type != at_param) || !s->param_is_array) { 904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "array access to non-PARAM variable"); 905770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = s; 908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 912770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayMem: progParamArrayAbs | progParamArrayRel; 913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 914770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayAbs: INTEGER 915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $1; 918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 921770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayRel: addrReg addrComponent addrRegRelOffset 922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for multiple address registers. 924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for 4-component address registers. 926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick init_src_reg(& $$); 928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.RelAddr = 1; 929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.Base.Index = $3; 930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 933770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegRelOffset: { $$ = 0; } 934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '+' addrRegPosOffset { $$ = $2; } 935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '-' addrRegNegOffset { $$ = -$2; } 936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 937770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 938770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegPosOffset: INTEGER 939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 9408ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul if (($1 < 0) || ($1 > (state->limits->MaxAddressOffset - 1))) { 9412aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul char s[100]; 94278a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(s, sizeof(s), 9432aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul "relative address offset too large (%d)", $1); 9442aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul yyerror(& @1, state, s); 945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 952770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegNegOffset: INTEGER 953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 9548ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul if (($1 < 0) || ($1 > state->limits->MaxAddressOffset)) { 9552aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul char s[100]; 95678a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(s, sizeof(s), 9572aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul "relative address offset too large (%d)", $1); 9582aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul yyerror(& @1, state, s); 959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 965770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 9660e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickaddrReg: USED_IDENTIFIER 967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = (struct asm_symbol *) 969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $1); 970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 971301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($1); 972301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid array member"); 975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (s->type != at_address) { 977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "invalid variable for indexed array access"); 979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = s; 982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 983770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 986770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrComponent: MASK1 987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1.mask != WRITEMASK_X) { 989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid address component selector"); 990770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 997770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrWriteMask: MASK1 998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1.mask != WRITEMASK_X) { 1000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, 1001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "address register write mask must be \".x\""); 1002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1009770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickscalarSuffix: MASK1; 1010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1011770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSuffix: MASK1 1012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MASK4 1013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SWIZZLE 1014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 1015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1017770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalMask: MASK4 | MASK3 | MASK2 | MASK1 1018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } 1019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 102181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickoptionalCcMask: '(' ccTest ')' 102281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 102381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$ = $2; 102481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 102581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick | '(' ccTest2 ')' 102681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 102781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$ = $2; 102881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 102981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick | 103081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 103181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondMask = COND_TR; 103281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSwizzle = SWIZZLE_NOOP; 103381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSrc = 0; 103481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 103581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick ; 103681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 103781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccTest: ccMaskRule swizzleSuffix 103881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 103981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$ = $1; 104081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSwizzle = $2.swizzle; 104181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 104281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick ; 104381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 104481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccTest2: ccMaskRule2 swizzleSuffix 104581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 104681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$ = $1; 104781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSwizzle = $2.swizzle; 104881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 104981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick ; 105081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 105181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccMaskRule: IDENTIFIER 105281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 105381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick const int cond = _mesa_parse_cc($1); 105481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if ((cond == 0) || ($1[2] != '\0')) { 105581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick char *const err_str = 105681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick make_error_string("invalid condition code \"%s\"", $1); 105781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 105881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick yyerror(& @1, state, (err_str != NULL) 105981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick ? err_str : "invalid condition code"); 106081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 106181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (err_str != NULL) { 106232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(err_str); 106381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 106481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 106581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick YYERROR; 106681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 106781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 106881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondMask = cond; 106981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSwizzle = SWIZZLE_NOOP; 107081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSrc = 0; 107181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 107281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick ; 107381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 107481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccMaskRule2: USED_IDENTIFIER 107581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick { 107681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick const int cond = _mesa_parse_cc($1); 107781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if ((cond == 0) || ($1[2] != '\0')) { 107881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick char *const err_str = 107981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick make_error_string("invalid condition code \"%s\"", $1); 108081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 108181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick yyerror(& @1, state, (err_str != NULL) 108281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick ? err_str : "invalid condition code"); 108381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 108481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (err_str != NULL) { 108532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(err_str); 108681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 108781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 108881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick YYERROR; 108981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 109081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 109181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondMask = cond; 109281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSwizzle = SWIZZLE_NOOP; 109381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick $$.CondSrc = 0; 109481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 109581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick ; 109681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 1097770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicknamingStatement: ATTRIB_statement 1098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PARAM_statement 1099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEMP_statement 1100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ADDRESS_statement 1101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | OUTPUT_statement 1102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ALIAS_statement 1103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1105770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickATTRIB_statement: ATTRIB IDENTIFIER '=' attribBinding 1106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, at_attrib, & @2); 1109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1111301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($2); 1112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->attrib_binding = $4; 1115b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich state->InputsBound |= BITFIELD64_BIT(s->attrib_binding); 1116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!validate_inputs(& @4, state)) { 1118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1124770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickattribBinding: VERTEX vtxAttribItem 1125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRAGMENT fragAttribItem 1129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1134770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribItem: POSITION 1135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_POS; 1137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | WEIGHT vtxOptWeightNum 1139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_WEIGHT; 1141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | NORMAL 1143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_NORMAL; 1145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | COLOR optColorType 1147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1148054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick if (!state->ctx->Extensions.EXT_secondary_color) { 1149054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @2, state, "GL_EXT_secondary_color not supported"); 1150054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick YYERROR; 1151054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick } 1152054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick 1153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_COLOR0 + $2; 1154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FOGCOORD 1156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1157054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick if (!state->ctx->Extensions.EXT_fog_coord) { 1158054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_EXT_fog_coord not supported"); 1159054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick YYERROR; 1160054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick } 1161054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick 1162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_FOG; 1163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXCOORD optTexCoordUnitNum 1165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_TEX0 + $2; 1167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MATRIXINDEX '[' vtxWeightNum ']' 1169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1170054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_ARB_matrix_palette not supported"); 1171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | VTXATTRIB '[' vtxAttribNum ']' 1174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_ATTRIB_GENERIC0 + $3; 1176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1179770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribNum: INTEGER 1180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1181ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxAttribs) { 1182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid vertex attribute reference"); 1183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1190770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxOptWeightNum: | '[' vtxWeightNum ']'; 1191770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxWeightNum: INTEGER; 1192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1193770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickfragAttribItem: POSITION 1194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_WPOS; 1196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | COLOR optColorType 1198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_COL0 + $2; 1200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FOGCOORD 1202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_FOGC; 1204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXCOORD optTexCoordUnitNum 1206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_ATTRIB_TEX0 + $2; 1208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1211770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_statement: PARAM_singleStmt | PARAM_multipleStmt; 1212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1213770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_singleStmt: PARAM IDENTIFIER paramSingleInit 1214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, at_param, & @2); 1217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1219301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($2); 1220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_type = $3.param_binding_type; 1223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_begin = $3.param_binding_begin; 1224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_length = $3.param_binding_length; 122584db95bfcd340a26a448fa89a19215711681cb50Eric Anholt s->param_binding_swizzle = $3.param_binding_swizzle; 1226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_is_array = 0; 1227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1231770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_multipleStmt: PARAM IDENTIFIER '[' optArraySize ']' paramMultipleInit 1232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1233ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if (($4 != 0) && ((unsigned) $4 != $6.param_binding_length)) { 1234301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($2); 1235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @4, state, 1236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "parameter array size and number of bindings must match"); 1237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick declare_variable(state, $2, $6.type, & @2); 1241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 1243301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($2); 1244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_type = $6.param_binding_type; 1247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_begin = $6.param_binding_begin; 1248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_binding_length = $6.param_binding_length; 1249639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul s->param_binding_swizzle = SWIZZLE_XYZW; 1250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->param_is_array = 1; 1251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1256770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptArraySize: 1257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INTEGER 1261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1262dd245016657c599ecf24c4abe999319f9c870c47Ian Romanick if (($1 < 1) || ((unsigned) $1 > state->limits->MaxParameters)) { 1263f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul char msg[100]; 1264f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul _mesa_snprintf(msg, sizeof(msg), 1265f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul "invalid parameter array size (size=%d max=%u)", 1266f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul $1, state->limits->MaxParameters); 1267f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul yyerror(& @1, state, msg); 1268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 1270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1275770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleInit: '=' paramSingleItemDecl 1276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1281770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleInit: '=' '{' paramMultInitList '}' 1282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $3; 1284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1287770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultInitList: paramMultipleItem 1288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramMultInitList ',' paramMultipleItem 1289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $1.param_binding_length += $3.param_binding_length; 1291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1295770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemDecl: stateSingleItem 1296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 1300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programSingleItem 1302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 1306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstDecl 1308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 13117c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul initialize_symbol_from_const(state->prog, & $$, & $1, GL_TRUE); 1312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1315770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemUse: stateSingleItem 1316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 1320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programSingleItem 1322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 1326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstUse 1328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 13317c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul initialize_symbol_from_const(state->prog, & $$, & $1, GL_TRUE); 1332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1335770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleItem: stateMultipleItem 1336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_state(state->prog, & $$, $1); 1340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | programMultipleItem 1342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 1345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick initialize_symbol_from_param(state->prog, & $$, $1); 1346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | paramConstDecl 1348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(& $$, 0, sizeof($$)); 1350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.param_binding_begin = ~0; 13517c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul initialize_symbol_from_const(state->prog, & $$, & $1, GL_FALSE); 1352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1355770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMultipleItem: stateSingleItem { memcpy($$, $1, sizeof($$)); } 1356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateMatrixRows { memcpy($$, $2, sizeof($$)); } 1357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1359770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSingleItem: STATE stateMaterialItem { memcpy($$, $2, sizeof($$)); } 1360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightItem { memcpy($$, $2, sizeof($$)); } 1361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightModelItem { memcpy($$, $2, sizeof($$)); } 1362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateLightProdItem { memcpy($$, $2, sizeof($$)); } 1363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateTexGenItem { memcpy($$, $2, sizeof($$)); } 1364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateTexEnvItem { memcpy($$, $2, sizeof($$)); } 1365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateFogItem { memcpy($$, $2, sizeof($$)); } 1366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateClipPlaneItem { memcpy($$, $2, sizeof($$)); } 1367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE statePointItem { memcpy($$, $2, sizeof($$)); } 1368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | STATE stateMatrixRow { memcpy($$, $2, sizeof($$)); } 1369333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick | STATE stateDepthItem { memcpy($$, $2, sizeof($$)); } 1370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1372770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMaterialItem: MATERIAL optFaceType stateMatProperty 1373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MATERIAL; 1376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1381770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatProperty: ambDiffSpecProperty 1382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | EMISSION 1386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_EMISSION; 1388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SHININESS 1390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SHININESS; 1392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1395770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightItem: LIGHT '[' stateLightNumber ']' stateLightProperty 1396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHT; 1399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $5; 1401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1404770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProperty: ambDiffSpecProperty 1405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | POSITION 1409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POSITION; 1411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ATTENUATION 1413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1414054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick if (!state->ctx->Extensions.EXT_point_parameters) { 1415054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_ARB_point_parameters not supported"); 1416054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick YYERROR; 1417054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick } 1418054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick 1419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_ATTENUATION; 1420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SPOT stateSpotProperty 1422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 1424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | HALF 1426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_HALF_VECTOR; 1428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1431770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSpotProperty: DIRECTION 1432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SPOT_DIRECTION; 1434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1437770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightModelItem: LIGHTMODEL stateLModProperty 1438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2[0]; 1440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2[1]; 1441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1444770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLModProperty: AMBIENT 1445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTMODEL_AMBIENT; 1448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | optFaceType SCENECOLOR 1450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTMODEL_SCENECOLOR; 1453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1457770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProdItem: LIGHTPROD '[' stateLightNumber ']' optFaceType stateLProdProperty 1458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_LIGHTPROD; 1461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $5; 1463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $6; 1464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1467770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLProdProperty: ambDiffSpecProperty; 1468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1469770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvItem: TEXENV optLegacyTexUnitNum stateTexEnvProperty 1470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $3; 1473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1477770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvProperty: COLOR 1478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXENV_COLOR; 1480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1483770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickambDiffSpecProperty: AMBIENT 1484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_AMBIENT; 1486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | DIFFUSE 1488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_DIFFUSE; 1490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SPECULAR 1492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_SPECULAR; 1494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1497770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightNumber: INTEGER 1498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1499ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxLights) { 1500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid light selector"); 1501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1508770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenItem: TEXGEN optTexCoordUnitNum stateTexGenType stateTexGenCoord 1509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_TEXGEN; 1512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3 + $4; 1514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1517770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenType: EYE 1518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_S; 1520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | OBJECT 1522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_OBJECT_S; 1524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1526770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenCoord: TEXGEN_S 1527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S; 1529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_T 1531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S; 1533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_R 1535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S; 1537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXGEN_Q 1539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S; 1541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1544770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogItem: FOG stateFogProperty 1545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2; 1548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1551770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogProperty: COLOR 1552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_FOG_COLOR; 1554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PARAMS 1556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_FOG_PARAMS; 1558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1560770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1561770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneItem: CLIP '[' stateClipPlaneNum ']' PLANE 1562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_CLIPPLANE; 1565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1569770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneNum: INTEGER 1570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1571ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxClipPlanes) { 1572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid clip plane selector"); 1573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 15803fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian PaulstatePointItem: POINT_TOK statePointProperty 1581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2; 1584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 15873fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian PaulstatePointProperty: SIZE_TOK 1588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POINT_SIZE; 1590770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ATTENUATION 1592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_POINT_ATTENUATION; 1594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1597770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']' 1598770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1599770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1[0]; 1600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1[1]; 1601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[4] = $1[2]; 1604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1607770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRows: stateMatrixItem optMatrixRows 1608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1[0]; 1610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1[1]; 1611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $2[2]; 1612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $2[3]; 1613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[4] = $1[2]; 1614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1617770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptMatrixRows: 1618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = 0; 1620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = 3; 1621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | ROW '[' stateMatrixRowNum DOT_DOT stateMatrixRowNum ']' 1623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* It seems logical that the matrix row range specifier would have 1625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to specify a range or more than one row (i.e., $5 > $3). 1626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * However, the ARB_vertex_program spec says "a program will fail 1627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to load if <a> is greater than <b>." This means that $3 == $5 1628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * is valid. 1629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($3 > $5) { 1631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @3, state, "invalid matrix row range"); 1632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $5; 1637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1640770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixItem: MATRIX stateMatrixName stateOptMatModifier 1641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $2[0]; 1643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2[1]; 1644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $3; 1645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1648770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptMatModifier: 1649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | stateMatModifier 1653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1658770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatModifier: INVERSE 1659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_INVERSE; 1661770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TRANSPOSE 1663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_TRANSPOSE; 1665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INVTRANS 1667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1668770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = STATE_MATRIX_INVTRANS; 1669770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1670770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1672770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRowNum: INTEGER 1673770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1674770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 > 3) { 1675770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid matrix row reference"); 1676770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1677770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1678770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1680770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1683770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixName: MODELVIEW stateOptModMatNum 1684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MODELVIEW_MATRIX; 1686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PROJECTION 1689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_PROJECTION_MATRIX; 1691770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = 0; 1692770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1693770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MVP 1694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_MVP_MATRIX; 1696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = 0; 1697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | TEXTURE optTexCoordUnitNum 1699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_TEXTURE_MATRIX; 1701770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $2; 1702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PALETTE '[' statePaletteMatNum ']' 1704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1705054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick yyerror(& @1, state, "GL_ARB_matrix_palette not supported"); 1706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | MAT_PROGRAM '[' stateProgramMatNum ']' 1709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = STATE_PROGRAM_MATRIX; 1711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1713770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1715770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptModMatNum: 1716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1717770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 1718770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1719847bc5c852214a344b6b39c619d182cb1058ecbcIan Romanick | '[' stateModMatNum ']' 1720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1721847bc5c852214a344b6b39c619d182cb1058ecbcIan Romanick $$ = $2; 1722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1723770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1724770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateModMatNum: INTEGER 1725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix 1727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * zero is valid. 1728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ($1 != 0) { 1730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid modelview matrix index"); 1731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1736770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1737770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePaletteMatNum: INTEGER 1738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Since GL_ARB_matrix_palette isn't supported, just let any value 1740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * through here. The error will be generated later. 1741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 1742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1744770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1745770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateProgramMatNum: INTEGER 1746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1747ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxProgramMatrices) { 1748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program matrix selector"); 1749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1756333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian RomanickstateDepthItem: DEPTH RANGE 1757333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick { 1758333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick memset($$, 0, sizeof($$)); 1759333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick $$[0] = STATE_DEPTH_RANGE; 1760333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick } 1761333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick ; 1762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1764770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramSingleItem: progEnvParam | progLocalParam; 1765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1766770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramMultipleItem: progEnvParams | progLocalParams; 1767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1768770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParams: PROGRAM ENV '[' progEnvParamNums ']' 1769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_ENV; 1773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4[0]; 1774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4[1]; 1775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1778770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNums: progEnvParamNum 1779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progEnvParamNum DOT_DOT progEnvParamNum 1784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1790770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParam: PROGRAM ENV '[' progEnvParamNum ']' 1791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_ENV; 1795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1800770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']' 1801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1802770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_LOCAL; 1805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4[0]; 1806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4[1]; 1807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1809770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNums: progLocalParamNum 1810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $1; 1813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | progLocalParamNum DOT_DOT progLocalParamNum 1815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = $1; 1817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = $3; 1818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1821770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']' 1822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset($$, 0, sizeof($$)); 1824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[0] = state->state_param_enum; 1825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[1] = STATE_LOCAL; 1826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[2] = $4; 1827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$[3] = $4; 1828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1831770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNum: INTEGER 1832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1833ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxEnvParams) { 1834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid environment parameter reference"); 1835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1840770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1841770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNum: INTEGER 1842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1843ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->limits->MaxLocalParams) { 1844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid local parameter reference"); 1845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 1848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1852770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1853770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstDecl: paramConstScalarDecl | paramConstVector; 1854770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstUse: paramConstScalarUse | paramConstVector; 1855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1856770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarDecl: signedFloatConstant 1857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1858600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1859324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[0].f = $1; 1860324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[1].f = $1; 1861324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[2].f = $1; 1862324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[3].f = $1; 1863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1866770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarUse: REAL 1867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1868ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.count = 1; 1869324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[0].f = $1; 1870324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[1].f = $1; 1871324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[2].f = $1; 1872324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[3].f = $1; 1873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | INTEGER 1875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1876ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick $$.count = 1; 1877324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[0].f = (float) $1; 1878324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[1].f = (float) $1; 1879324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[2].f = (float) $1; 1880324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[3].f = (float) $1; 1881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1884770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstVector: '{' signedFloatConstant '}' 1885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1886600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1887324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[0].f = $2; 1888324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[1].f = 0.0f; 1889324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[2].f = 0.0f; 1890324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[3].f = 1.0f; 1891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant '}' 1893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1894600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1895324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[0].f = $2; 1896324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[1].f = $4; 1897324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[2].f = 0.0f; 1898324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[3].f = 1.0f; 1899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant ',' 1901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick signedFloatConstant '}' 1902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1903600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick $$.count = 4; 1904324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[0].f = $2; 1905324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[1].f = $4; 1906324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[2].f = $6; 1907324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[3].f = 1.0f; 1908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '{' signedFloatConstant ',' signedFloatConstant ',' 1910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick signedFloatConstant ',' signedFloatConstant '}' 1911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$.count = 4; 1913324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[0].f = $2; 1914324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[1].f = $4; 1915324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[2].f = $6; 1916324857599b2a4735c86e54da9a1776c034dadf72Brian Paul $$.data[3].f = $8; 1917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1920770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicksignedFloatConstant: optionalSign REAL 1921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = ($1) ? -$2 : $2; 1923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | optionalSign INTEGER 1925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = (float)(($1) ? -$2 : $2); 1927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1930770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalSign: '+' { $$ = FALSE; } 1931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '-' { $$ = TRUE; } 1932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | { $$ = FALSE; } 1933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1935d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickTEMP_statement: optVarSize TEMP { $<integer>$ = $2; } varNameList 1936d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick ; 1937d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 19380e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickoptVarSize: string 1939d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick { 1940d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick /* NV_fragment_program_option defines the size qualifiers in a 1941d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * fairly broken way. "SHORT" or "LONG" can optionally be used 1942d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * before TEMP or OUTPUT. However, neither is a reserved word! 1943d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * This means that we have to parse it as an identifier, then check 1944d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * to make sure it's one of the valid values. *sigh* 1945d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * 1946d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * In addition, the grammar in the extension spec does *not* allow 1947d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * the size specifier to be optional, but all known implementations 1948d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * do. 1949d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick */ 1950d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (!state->option.NV_fragment) { 1951d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick yyerror(& @1, state, "unexpected IDENTIFIER"); 1952d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick YYERROR; 1953d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1954d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1955d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (strcmp("SHORT", $1) == 0) { 1956d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } else if (strcmp("LONG", $1) == 0) { 1957d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } else { 1958d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick char *const err_str = 1959d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick make_error_string("invalid storage size specifier \"%s\"", 1960d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick $1); 1961d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1962d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick yyerror(& @1, state, (err_str != NULL) 1963d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick ? err_str : "invalid storage size specifier"); 1964d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1965d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (err_str != NULL) { 196632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(err_str); 1967d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1968d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 1969d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick YYERROR; 1970d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1971d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1972d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick | 1973d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick { 1974d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 1975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1977770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickADDRESS_statement: ADDRESS { $<integer>$ = $1; } varNameList 1978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1980770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvarNameList: varNameList ',' IDENTIFIER 1981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!declare_variable(state, $3, $<integer>0, & @3)) { 1983301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($3); 1984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | IDENTIFIER 1988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!declare_variable(state, $1, $<integer>0, & @1)) { 1990301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($1); 1991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 1992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 1994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 1995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 1996d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickOUTPUT_statement: optVarSize OUTPUT IDENTIFIER '=' resultBinding 1997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 1998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *const s = 1999d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick declare_variable(state, $3, at_output, & @3); 2000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (s == NULL) { 20024e4c2ee1fd574d1d651c559f46afb6ca5487156dIan Romanick free($3); 2003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2005d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick s->output_binding = $5; 2006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2010770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultBinding: RESULT POSITION 2011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_HPOS; 2014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 2016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT FOGCOORD 2020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2021770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_FOGC; 2023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 2025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT resultColBinding 2029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2; 2031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT POINTSIZE 2033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_PSIZ; 2036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2037770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 2038770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2040770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT TEXCOORD optTexCoordUnitNum 2042770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2044770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_TEX0 + $3; 2045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2046770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 2047770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2048770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2049770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2050770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | RESULT DEPTH 2051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_fragment) { 2053770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = FRAG_RESULT_DEPTH; 2054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @2, state, "invalid program result name"); 2056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2059770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2060770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2061770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultColBinding: COLOR optResultFaceType optResultColorType 2062770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $2 + $3; 2064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2067770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultFaceType: 2068770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2069d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt if (state->mode == ARB_vertex) { 2070d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt $$ = VERT_RESULT_COL0; 2071d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt } else { 2072d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt if (state->option.DrawBuffers) 2073d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt $$ = FRAG_RESULT_DATA0; 2074d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt else 2075d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt $$ = FRAG_RESULT_COLOR; 2076d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt } 2077770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 207828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt | '[' INTEGER ']' 207928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt { 208028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt if (state->mode == ARB_vertex) { 208128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt yyerror(& @1, state, "invalid program result name"); 208228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt YYERROR; 208328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt } else { 208428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt if (!state->option.DrawBuffers) { 208528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt /* From the ARB_draw_buffers spec (same text exists 208628cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt * for ATI_draw_buffers): 208728cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt * 208828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt * If this option is not specified, a fragment 208928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt * program that attempts to bind 209028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt * "result.color[n]" will fail to load, and only 209128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt * "result.color" will be allowed. 209228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt */ 209328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt yyerror(& @1, state, 209428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt "result.color[] used without " 209528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt "`OPTION ARB_draw_buffers' or " 209628cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt "`OPTION ATI_draw_buffers'"); 209728cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt YYERROR; 209828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt } else if ($2 >= state->MaxDrawBuffers) { 209928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt yyerror(& @1, state, 210028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt "result.color[] exceeds MAX_DRAW_BUFFERS_ARB"); 210128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt YYERROR; 210228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt } 210328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt $$ = FRAG_RESULT_DATA0 + $2; 210428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt } 210528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt } 2106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRONT 2107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_COL0; 2110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 2112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BACK 2116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = VERT_RESULT_BFC0; 2119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 2121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2126770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultColorType: 2127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 2129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PRIMARY 2131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 0; 2134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 2136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SECONDARY 2140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->mode == ARB_vertex) { 2142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = 1; 2143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 2144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid program result name"); 2145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2150770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptFaceType: { $$ = 0; } 2151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | FRONT { $$ = 0; } 2152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | BACK { $$ = 1; } 2153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2155770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptColorType: { $$ = 0; } 2156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | PRIMARY { $$ = 0; } 2157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | SECONDARY { $$ = 1; } 2158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2160770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexCoordUnitNum: { $$ = 0; } 2161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' texCoordUnitNum ']' { $$ = $2; } 2162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2164770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexImageUnitNum: { $$ = 0; } 2165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' texImageUnitNum ']' { $$ = $2; } 2166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2168770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptLegacyTexUnitNum: { $$ = 0; } 2169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick | '[' legacyTexUnitNum ']' { $$ = $2; } 2170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2172770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexCoordUnitNum: INTEGER 2173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2174ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureCoordUnits) { 2175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture coordinate unit selector"); 2176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 2180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2183770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnitNum: INTEGER 2184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2185ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureImageUnits) { 2186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture image unit selector"); 2187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 2191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2194770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicklegacyTexUnitNum: INTEGER 2195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2196ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick if ((unsigned) $1 >= state->MaxTextureUnits) { 2197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @1, state, "invalid texture unit selector"); 2198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick $$ = $1; 2202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 22050e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickALIAS_statement: ALIAS IDENTIFIER '=' USED_IDENTIFIER 2206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *exist = (struct asm_symbol *) 2208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $2); 2209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *target = (struct asm_symbol *) 2210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, $4); 2211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2212301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($4); 2213301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick 2214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (exist != NULL) { 2215fe86f8d73268785b31bc8d5a278a233bff42034dBrian Paul char m[1000]; 221678a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(m, sizeof(m), "redeclared identifier: %s", $2); 2217301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($2); 2218fe86f8d73268785b31bc8d5a278a233bff42034dBrian Paul yyerror(& @2, state, m); 2219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (target == NULL) { 2221301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick free($2); 2222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(& @4, state, 2223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick "undefined variable binding in ALIAS statement"); 2224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick YYERROR; 2225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 22261c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick _mesa_symbol_table_add_symbol(state->st, 0, $2, target); 2227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; 2230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 22310e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickstring: IDENTIFIER 22320e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick | USED_IDENTIFIER 22330e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick ; 22340e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick 2235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%% 2236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 22379ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickvoid 22389ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickasm_instruction_set_operands(struct asm_instruction *inst, 22399ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_dst_register *dst, 22409ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src0, 22419ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src1, 22429ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src2) 22439ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick{ 22449ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick /* In the core ARB extensions only the KIL instruction doesn't have a 22459ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick * destination register. 22469ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick */ 22479ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (dst == NULL) { 22489ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick init_dst_reg(& inst->Base.DstReg); 22499ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } else { 22509ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.DstReg = *dst; 22519ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 22529ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 225381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick /* The only instruction that doesn't have any source registers is the 225481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick * condition-code based KIL instruction added by NV_fragment_program_option. 225581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick */ 225681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (src0 != NULL) { 225781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick inst->Base.SrcReg[0] = src0->Base; 225881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick inst->SrcReg[0] = *src0; 225981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } else { 226081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick init_src_reg(& inst->SrcReg[0]); 226181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 22629ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 22639ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (src1 != NULL) { 22649ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.SrcReg[1] = src1->Base; 22659ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->SrcReg[1] = *src1; 22669ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } else { 22679ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick init_src_reg(& inst->SrcReg[1]); 22689ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 22699ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 22709ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (src2 != NULL) { 22719ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.SrcReg[2] = src2->Base; 22729ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->SrcReg[2] = *src2; 22739ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } else { 22749ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick init_src_reg(& inst->SrcReg[2]); 22759ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 22769ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick} 22779ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 22789ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 2279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_instruction * 2280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickasm_instruction_ctor(gl_inst_opcode op, 2281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct prog_dst_register *dst, 2282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src0, 2283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src1, 2284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct asm_src_register *src2) 2285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 22869ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction); 2287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (inst) { 2289ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick _mesa_init_instructions(& inst->Base, 1); 2290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst->Base.Opcode = op; 229117534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick 22929ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick asm_instruction_set_operands(inst, dst, src0, src1, src2); 22939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick } 2294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 22959ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick return inst; 22969ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick} 22979ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 22989ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 22999ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstruct asm_instruction * 23009ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickasm_instruction_copy_ctor(const struct prog_instruction *base, 23019ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct prog_dst_register *dst, 23029ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src0, 23039ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src1, 23049ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick const struct asm_src_register *src2) 23059ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick{ 23069ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction); 23079ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick 23089ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick if (inst) { 23099ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick _mesa_init_instructions(& inst->Base, 1); 23109ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.Opcode = base->Opcode; 2311d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Base.CondUpdate = base->CondUpdate; 2312d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Base.CondDst = base->CondDst; 23139ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick inst->Base.SaturateMode = base->SaturateMode; 2314d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Base.Precision = base->Precision; 2315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 23169ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick asm_instruction_set_operands(inst, dst, src0, src1, src2); 2317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return inst; 2320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 2324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_dst_reg(struct prog_dst_register *r) 2325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(r, 0, sizeof(*r)); 2327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->File = PROGRAM_UNDEFINED; 2328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->WriteMask = WRITEMASK_XYZW; 2329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->CondMask = COND_TR; 2330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->CondSwizzle = SWIZZLE_NOOP; 2331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2334df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul/** Like init_dst_reg() but set the File and Index fields. */ 2335df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulvoid 2336df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulset_dst_reg(struct prog_dst_register *r, gl_register_file file, GLint index) 2337df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul{ 2338df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul const GLint maxIndex = 1 << INST_INDEX_BITS; 2339df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul const GLint minIndex = 0; 2340df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul ASSERT(index >= minIndex); 234188bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee (void) minIndex; 2342df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul ASSERT(index <= maxIndex); 234388bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee (void) maxIndex; 2344df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul ASSERT(file == PROGRAM_TEMPORARY || 2345df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul file == PROGRAM_ADDRESS || 2346df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul file == PROGRAM_OUTPUT); 2347df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul memset(r, 0, sizeof(*r)); 2348df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->File = file; 2349df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->Index = index; 2350df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->WriteMask = WRITEMASK_XYZW; 2351df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->CondMask = COND_TR; 2352df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->CondSwizzle = SWIZZLE_NOOP; 2353df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul} 2354df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul 2355df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul 2356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 2357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_src_reg(struct asm_src_register *r) 2358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(r, 0, sizeof(*r)); 2360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Base.File = PROGRAM_UNDEFINED; 2361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Base.Swizzle = SWIZZLE_NOOP; 2362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick r->Symbol = NULL; 2363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2366639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul/** Like init_src_reg() but set the File and Index fields. 2367639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \return GL_TRUE if a valid src register, GL_FALSE otherwise 2368639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul */ 2369df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulvoid 2370df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulset_src_reg(struct asm_src_register *r, gl_register_file file, GLint index) 2371df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul{ 2372639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul set_src_reg_swz(r, file, index, SWIZZLE_XYZW); 2373639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul} 2374639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul 2375639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul 2376639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paulvoid 2377639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paulset_src_reg_swz(struct asm_src_register *r, gl_register_file file, GLint index, 2378639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul GLuint swizzle) 2379639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul{ 2380df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul const GLint maxIndex = (1 << INST_INDEX_BITS) - 1; 2381df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul const GLint minIndex = -(1 << INST_INDEX_BITS); 2382639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul ASSERT(file < PROGRAM_FILE_MAX); 2383df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul ASSERT(index >= minIndex); 238488bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee (void) minIndex; 2385df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul ASSERT(index <= maxIndex); 238688bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee (void) maxIndex; 2387df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul memset(r, 0, sizeof(*r)); 2388df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->Base.File = file; 2389df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->Base.Index = index; 2390639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul r->Base.Swizzle = swizzle; 2391df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul r->Symbol = NULL; 2392df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul} 2393df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul 2394df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul 2395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/** 2396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validate the set of inputs used by a program 2397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 2398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validates that legal sets of inputs are used by the program. In this case 2399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * "used" included both reading the input or binding the input to a name using 2400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the \c ATTRIB command. 2401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 2402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \return 2403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise. 2404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvalidate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state) 2407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2408b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich const GLbitfield64 inputs = state->prog->InputsRead | state->InputsBound; 2409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2410b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich if (((inputs & VERT_BIT_FF_ALL) & (inputs >> VERT_ATTRIB_GENERIC0)) != 0) { 2411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "illegal use of generic attribute and name attribute"); 2412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 2413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 2416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_symbol * 2420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickdeclare_variable(struct asm_parser_state *state, char *name, enum asm_type t, 2421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct YYLTYPE *locp) 2422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *s = NULL; 2424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *exist = (struct asm_symbol *) 2425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_find_symbol(state->st, 0, name); 2426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (exist != NULL) { 2429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "redeclared identifier"); 2430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else { 24311c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick s = calloc(1, sizeof(struct asm_symbol)); 24321c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick s->name = name; 2433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->type = t; 2434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch (t) { 2436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_temp: 2437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->NumTemporaries >= state->limits->MaxTemps) { 2438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "too many temporaries declared"); 2439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(s); 2440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return NULL; 2441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick s->temp_binding = state->prog->NumTemporaries; 2444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumTemporaries++; 2445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 2446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case at_address: 2448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->prog->NumAddressRegs >= state->limits->MaxAddressRegs) { 2449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyerror(locp, state, "too many address registers declared"); 2450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(s); 2451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return NULL; 2452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* FINISHME: Add support for multiple address registers. 2455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumAddressRegs++; 2457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 2458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: 2460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 2461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_symbol_table_add_symbol(state->st, 0, s->name, s); 246494b45567047fd681666f261f1ad0164049f0491aIan Romanick s->next = state->sym; 246594b45567047fd681666f261f1ad0164049f0491aIan Romanick state->sym = s; 2466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return s; 2469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint add_state_reference(struct gl_program_parameter_list *param_list, 2473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 2474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const GLuint size = 4; /* XXX fix */ 2476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick char *name; 2477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLint index; 2478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick name = _mesa_program_state_string(tokens); 2480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name, 2481592a6642fc5c9f697bcc6521c99fe00b2de827c8Brian Paul size, GL_NONE, NULL, tokens, 0x0); 2482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_list->StateFlags |= _mesa_program_state_flags(tokens); 2483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* free name string here since we duplicated it in add_parameter() */ 248532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(name); 2486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return index; 2488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_state(struct gl_program *prog, 2493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 2494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 2495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int idx = -1; 2497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_state_index state_tokens[STATE_LENGTH]; 2498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memcpy(state_tokens, tokens, sizeof(state_tokens)); 2501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 250328b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = PROGRAM_STATE_VAR; 2504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* If we are adding a STATE_MATRIX that has multiple rows, we need to 2506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * unroll it and call add_state_reference() for each row 2507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ((state_tokens[0] == STATE_MODELVIEW_MATRIX || 2509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_PROJECTION_MATRIX || 2510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_MVP_MATRIX || 2511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_TEXTURE_MATRIX || 2512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[0] == STATE_PROGRAM_MATRIX) 2513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick && (state_tokens[2] != state_tokens[3])) { 2514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int row; 2515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int first_row = state_tokens[2]; 2516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int last_row = state_tokens[3]; 2517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (row = first_row; row <= last_row; row++) { 2519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[2] = state_tokens[3] = row; 2520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2522639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul if (param_var->param_binding_begin == ~0U) { 2523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2524639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul param_var->param_binding_swizzle = SWIZZLE_XYZW; 2525639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul } 2526639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul 2527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick else { 2531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2532639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul if (param_var->param_binding_begin == ~0U) { 2533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2534639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul param_var->param_binding_swizzle = SWIZZLE_XYZW; 2535639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul } 2536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_param(struct gl_program *prog, 2545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 2546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const gl_state_index tokens[STATE_LENGTH]) 2547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int idx = -1; 2549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick gl_state_index state_tokens[STATE_LENGTH]; 2550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memcpy(state_tokens, tokens, sizeof(state_tokens)); 2553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert((state_tokens[0] == STATE_VERTEX_PROGRAM) 2555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick || (state_tokens[0] == STATE_FRAGMENT_PROGRAM)); 2556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert((state_tokens[1] == STATE_ENV) 2557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick || (state_tokens[1] == STATE_LOCAL)); 2558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2559f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul /* 2560f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul * The param type is STATE_VAR. The program parameter entry will 2561f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul * effectively be a pointer into the LOCAL or ENV parameter array. 2562f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul */ 2563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 2564f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul param_var->param_binding_type = PROGRAM_STATE_VAR; 2565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements, 2567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * we need to unroll it and call add_state_reference() for each row 2568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state_tokens[2] != state_tokens[3]) { 2570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int row; 2571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int first_row = state_tokens[2]; 2572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const int last_row = state_tokens[3]; 2573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (row = first_row; row <= last_row; row++) { 2575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state_tokens[2] = state_tokens[3] = row; 2576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2578639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul if (param_var->param_binding_begin == ~0U) { 2579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2580639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul param_var->param_binding_swizzle = SWIZZLE_XYZW; 2581639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul } 2582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick else { 2586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick idx = add_state_reference(prog->Parameters, state_tokens); 2587639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul if (param_var->param_binding_begin == ~0U) { 2588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 2589639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul param_var->param_binding_swizzle = SWIZZLE_XYZW; 2590639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul } 2591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2598639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul/** 2599639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * Put a float/vector constant/literal into the parameter list. 2600639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \param param_var returns info about the parameter/constant's location, 2601639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * binding, type, etc. 2602639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \param vec the vector/constant to add 26037c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul * \param allowSwizzle if true, try to consolidate constants which only differ 26047c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul * by a swizzle. We don't want to do this when building 26057c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul * arrays of constants that may be indexed indirectly. 2606639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \return index of the constant in the parameter list. 2607639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul */ 2608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 2609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_const(struct gl_program *prog, 2610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_symbol *param_var, 26117c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul const struct asm_vector *vec, 26127c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul GLboolean allowSwizzle) 2613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2614639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul unsigned swizzle; 2615639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul const int idx = _mesa_add_unnamed_constant(prog->Parameters, 26167c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul vec->data, vec->count, 26177c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul allowSwizzle ? &swizzle : NULL); 2618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->type = at_param; 262028b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick param_var->param_binding_type = PROGRAM_CONSTANT; 2621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2622639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul if (param_var->param_binding_begin == ~0U) { 2623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_begin = idx; 26247c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul param_var->param_binding_swizzle = allowSwizzle ? swizzle : SWIZZLE_XYZW; 2625639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul } 2626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick param_var->param_binding_length++; 2627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return idx; 2629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 263244843c753301db0e8f8343745777479465f34cccIan Romanickchar * 263344843c753301db0e8f8343745777479465f34cccIan Romanickmake_error_string(const char *fmt, ...) 263444843c753301db0e8f8343745777479465f34cccIan Romanick{ 263544843c753301db0e8f8343745777479465f34cccIan Romanick int length; 263644843c753301db0e8f8343745777479465f34cccIan Romanick char *str; 263744843c753301db0e8f8343745777479465f34cccIan Romanick va_list args; 263844843c753301db0e8f8343745777479465f34cccIan Romanick 263944843c753301db0e8f8343745777479465f34cccIan Romanick 264044843c753301db0e8f8343745777479465f34cccIan Romanick /* Call vsnprintf once to determine how large the final string is. Call it 26416aae062bdf285ce9ce861b4d3b777080664518baJosé Fonseca * again to do the actual formatting. from the vsnprintf manual page: 264244843c753301db0e8f8343745777479465f34cccIan Romanick * 264344843c753301db0e8f8343745777479465f34cccIan Romanick * Upon successful return, these functions return the number of 264444843c753301db0e8f8343745777479465f34cccIan Romanick * characters printed (not including the trailing '\0' used to end 264544843c753301db0e8f8343745777479465f34cccIan Romanick * output to strings). 264644843c753301db0e8f8343745777479465f34cccIan Romanick */ 2647cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca va_start(args, fmt); 264844843c753301db0e8f8343745777479465f34cccIan Romanick length = 1 + vsnprintf(NULL, 0, fmt, args); 2649cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca va_end(args); 265044843c753301db0e8f8343745777479465f34cccIan Romanick 265132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg str = malloc(length); 265244843c753301db0e8f8343745777479465f34cccIan Romanick if (str) { 2653cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca va_start(args, fmt); 2654150cce6aef85d22b5d32fba5d27605a98be6794aBrian Paul vsnprintf(str, length, fmt, args); 2655cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca va_end(args); 265644843c753301db0e8f8343745777479465f34cccIan Romanick } 265744843c753301db0e8f8343745777479465f34cccIan Romanick 265844843c753301db0e8f8343745777479465f34cccIan Romanick return str; 265944843c753301db0e8f8343745777479465f34cccIan Romanick} 266044843c753301db0e8f8343745777479465f34cccIan Romanick 266144843c753301db0e8f8343745777479465f34cccIan Romanick 2662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 2663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickyyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s) 2664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 266544843c753301db0e8f8343745777479465f34cccIan Romanick char *err_str; 266644843c753301db0e8f8343745777479465f34cccIan Romanick 2667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 266844843c753301db0e8f8343745777479465f34cccIan Romanick err_str = make_error_string("glProgramStringARB(%s)\n", s); 266944843c753301db0e8f8343745777479465f34cccIan Romanick if (err_str) { 26703888c38fc9e7debc53a901295af0027801c4ae74Vinson Lee _mesa_error(state->ctx, GL_INVALID_OPERATION, "%s", err_str); 267132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(err_str); 267244843c753301db0e8f8343745777479465f34cccIan Romanick } 267344843c753301db0e8f8343745777479465f34cccIan Romanick 267444843c753301db0e8f8343745777479465f34cccIan Romanick err_str = make_error_string("line %u, char %u: error: %s\n", 267544843c753301db0e8f8343745777479465f34cccIan Romanick locp->first_line, locp->first_column, s); 267644843c753301db0e8f8343745777479465f34cccIan Romanick _mesa_set_program_error(state->ctx, locp->position, err_str); 267744843c753301db0e8f8343745777479465f34cccIan Romanick 267844843c753301db0e8f8343745777479465f34cccIan Romanick if (err_str) { 267932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(err_str); 268044843c753301db0e8f8343745777479465f34cccIan Romanick } 2681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 268344843c753301db0e8f8343745777479465f34cccIan Romanick 2684770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean 2685f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_parse_arb_program(struct gl_context *ctx, GLenum target, const GLubyte *str, 2686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLsizei len, struct asm_parser_state *state) 2687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 2688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *inst; 2689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick unsigned i; 2690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick GLubyte *strz; 269194b45567047fd681666f261f1ad0164049f0491aIan Romanick GLboolean result = GL_FALSE; 269294b45567047fd681666f261f1ad0164049f0491aIan Romanick void *temp; 269394b45567047fd681666f261f1ad0164049f0491aIan Romanick struct asm_symbol *sym; 2694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 269544843c753301db0e8f8343745777479465f34cccIan Romanick state->ctx = ctx; 2696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Target = target; 2697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Parameters = _mesa_new_parameter_list(); 2698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Make a copy of the program string and force it to be NUL-terminated. 2700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 270132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg strz = (GLubyte *) malloc(len + 1); 2702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strz == NULL) { 2703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); 2704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return GL_FALSE; 2705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2706c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy (strz, str, len); 2707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick strz[len] = '\0'; 2708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->String = strz; 2710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->st = _mesa_symbol_table_ctor(); 2712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 271348183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick state->limits = (target == GL_VERTEX_PROGRAM_ARB) 271448183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick ? & ctx->Const.VertexProgram 271548183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick : & ctx->Const.FragmentProgram; 2716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 27174cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits; 27184cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxTextureCoordUnits = ctx->Const.MaxTextureCoordUnits; 27194cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxTextureUnits = ctx->Const.MaxTextureUnits; 27204cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxClipPlanes = ctx->Const.MaxClipPlanes; 27214cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxLights = ctx->Const.MaxLights; 27224cf27608bc069225bf91d47585e344a2c122e940Brian Paul state->MaxProgramMatrices = ctx->Const.MaxProgramMatrices; 272328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt state->MaxDrawBuffers = ctx->Const.MaxDrawBuffers; 2724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB) 2726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM; 2727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_set_program_error(ctx, -1, NULL); 2729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_program_lexer_ctor(& state->scanner, state, (const char *) str, len); 2731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick yyparse(state); 2732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_program_lexer_dtor(state->scanner); 2733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 273544843c753301db0e8f8343745777479465f34cccIan Romanick if (ctx->Program.ErrorPos != -1) { 273694b45567047fd681666f261f1ad0164049f0491aIan Romanick goto error; 273744843c753301db0e8f8343745777479465f34cccIan Romanick } 273844843c753301db0e8f8343745777479465f34cccIan Romanick 2739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (! _mesa_layout_parameters(state)) { 274044843c753301db0e8f8343745777479465f34cccIan Romanick struct YYLTYPE loc; 274144843c753301db0e8f8343745777479465f34cccIan Romanick 274244843c753301db0e8f8343745777479465f34cccIan Romanick loc.first_line = 0; 274344843c753301db0e8f8343745777479465f34cccIan Romanick loc.first_column = 0; 274444843c753301db0e8f8343745777479465f34cccIan Romanick loc.position = len; 274544843c753301db0e8f8343745777479465f34cccIan Romanick 274644843c753301db0e8f8343745777479465f34cccIan Romanick yyerror(& loc, state, "invalid PARAM usage"); 274794b45567047fd681666f261f1ad0164049f0491aIan Romanick goto error; 2748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Add one instruction to store the "END" instruction. 2753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions = 2755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_alloc_instructions(state->prog->NumInstructions + 1); 2756770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst = state->inst_head; 2757770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (i = 0; i < state->prog->NumInstructions; i++) { 2758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_instruction *const temp = inst->next; 2759770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2760770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions[i] = inst->Base; 2761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick inst = temp; 2762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2764770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Finally, tag on an OPCODE_END instruction */ 2765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick { 2766770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const GLuint numInst = state->prog->NumInstructions; 2767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick _mesa_init_instructions(state->prog->Instructions + numInst, 1); 2768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->Instructions[numInst].Opcode = OPCODE_END; 2769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 2770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumInstructions++; 2771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 2772c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick state->prog->NumParameters = state->prog->Parameters->NumParameters; 2773dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich state->prog->NumAttributes = _mesa_bitcount_64(state->prog->InputsRead); 2774c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick 2775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* 2776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Initialize native counts to logical counts. The device driver may 2777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * change them if program is translated into a hardware program. 2778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 2779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeInstructions = state->prog->NumInstructions; 2780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeTemporaries = state->prog->NumTemporaries; 2781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeParameters = state->prog->NumParameters; 2782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeAttributes = state->prog->NumAttributes; 2783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->prog->NumNativeAddressRegs = state->prog->NumAddressRegs; 2784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 278594b45567047fd681666f261f1ad0164049f0491aIan Romanick result = GL_TRUE; 278694b45567047fd681666f261f1ad0164049f0491aIan Romanick 278794b45567047fd681666f261f1ad0164049f0491aIan Romanickerror: 278894b45567047fd681666f261f1ad0164049f0491aIan Romanick for (inst = state->inst_head; inst != NULL; inst = temp) { 278994b45567047fd681666f261f1ad0164049f0491aIan Romanick temp = inst->next; 279032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(inst); 279194b45567047fd681666f261f1ad0164049f0491aIan Romanick } 279294b45567047fd681666f261f1ad0164049f0491aIan Romanick 279394b45567047fd681666f261f1ad0164049f0491aIan Romanick state->inst_head = NULL; 279494b45567047fd681666f261f1ad0164049f0491aIan Romanick state->inst_tail = NULL; 279594b45567047fd681666f261f1ad0164049f0491aIan Romanick 279694b45567047fd681666f261f1ad0164049f0491aIan Romanick for (sym = state->sym; sym != NULL; sym = temp) { 279794b45567047fd681666f261f1ad0164049f0491aIan Romanick temp = sym->next; 279894b45567047fd681666f261f1ad0164049f0491aIan Romanick 279932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) sym->name); 280032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(sym); 280194b45567047fd681666f261f1ad0164049f0491aIan Romanick } 280294b45567047fd681666f261f1ad0164049f0491aIan Romanick state->sym = NULL; 280394b45567047fd681666f261f1ad0164049f0491aIan Romanick 280494b45567047fd681666f261f1ad0164049f0491aIan Romanick _mesa_symbol_table_dtor(state->st); 280594b45567047fd681666f261f1ad0164049f0491aIan Romanick state->st = NULL; 280694b45567047fd681666f261f1ad0164049f0491aIan Romanick 280794b45567047fd681666f261f1ad0164049f0491aIan Romanick return result; 2808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 2809