1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2009 Intel Corporation 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*61046927SAndroid Build Coastguard Worker * 11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*61046927SAndroid Build Coastguard Worker * Software. 14*61046927SAndroid Build Coastguard Worker * 15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21*61046927SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE. 22*61046927SAndroid Build Coastguard Worker */ 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Worker #ifndef PROGRAM_PARSER_H 25*61046927SAndroid Build Coastguard Worker #define PROGRAM_PARSER_H 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker #include "main/config.h" 28*61046927SAndroid Build Coastguard Worker #include "program/prog_instruction.h" 29*61046927SAndroid Build Coastguard Worker #include "program/prog_parameter.h" 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Worker struct gl_context; 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Worker enum asm_type { 34*61046927SAndroid Build Coastguard Worker at_none, 35*61046927SAndroid Build Coastguard Worker at_address, 36*61046927SAndroid Build Coastguard Worker at_attrib, 37*61046927SAndroid Build Coastguard Worker at_param, 38*61046927SAndroid Build Coastguard Worker at_temp, 39*61046927SAndroid Build Coastguard Worker at_output 40*61046927SAndroid Build Coastguard Worker }; 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker struct asm_symbol { 43*61046927SAndroid Build Coastguard Worker struct asm_symbol *next; /**< List linkage for freeing. */ 44*61046927SAndroid Build Coastguard Worker const char *name; 45*61046927SAndroid Build Coastguard Worker enum asm_type type; 46*61046927SAndroid Build Coastguard Worker unsigned attrib_binding; 47*61046927SAndroid Build Coastguard Worker unsigned output_binding; /**< Output / result register number. */ 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker /** 50*61046927SAndroid Build Coastguard Worker * One of PROGRAM_STATE_VAR or PROGRAM_CONSTANT. 51*61046927SAndroid Build Coastguard Worker */ 52*61046927SAndroid Build Coastguard Worker unsigned param_binding_type; 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker /** 55*61046927SAndroid Build Coastguard Worker * Offset into the program_parameter_list where the tokens representing our 56*61046927SAndroid Build Coastguard Worker * bound state (or constants) start. 57*61046927SAndroid Build Coastguard Worker */ 58*61046927SAndroid Build Coastguard Worker unsigned param_binding_begin; 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker /** 61*61046927SAndroid Build Coastguard Worker * Constants put into the parameter list may be swizzled. This 62*61046927SAndroid Build Coastguard Worker * field contain's the symbol's swizzle. (SWIZZLE_X/Y/Z/W) 63*61046927SAndroid Build Coastguard Worker */ 64*61046927SAndroid Build Coastguard Worker unsigned param_binding_swizzle; 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker /* This is how many entries in the program_parameter_list we take up 67*61046927SAndroid Build Coastguard Worker * with our state tokens or constants. Note that this is _not_ the same as 68*61046927SAndroid Build Coastguard Worker * the number of param registers we eventually use. 69*61046927SAndroid Build Coastguard Worker */ 70*61046927SAndroid Build Coastguard Worker unsigned param_binding_length; 71*61046927SAndroid Build Coastguard Worker 72*61046927SAndroid Build Coastguard Worker /** 73*61046927SAndroid Build Coastguard Worker * Index of the temp register assigned to this variable. 74*61046927SAndroid Build Coastguard Worker */ 75*61046927SAndroid Build Coastguard Worker unsigned temp_binding; 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker /** 78*61046927SAndroid Build Coastguard Worker * Flag whether or not a PARAM is an array 79*61046927SAndroid Build Coastguard Worker */ 80*61046927SAndroid Build Coastguard Worker unsigned param_is_array:1; 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard Worker /** 84*61046927SAndroid Build Coastguard Worker * Flag whether or not a PARAM array is accessed indirectly 85*61046927SAndroid Build Coastguard Worker */ 86*61046927SAndroid Build Coastguard Worker unsigned param_accessed_indirectly:1; 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker 89*61046927SAndroid Build Coastguard Worker /** 90*61046927SAndroid Build Coastguard Worker * \brief Is first pass of parameter layout done with this variable? 91*61046927SAndroid Build Coastguard Worker * 92*61046927SAndroid Build Coastguard Worker * The parameter layout routine operates in two passes. This flag tracks 93*61046927SAndroid Build Coastguard Worker * whether or not the first pass has handled this variable. 94*61046927SAndroid Build Coastguard Worker * 95*61046927SAndroid Build Coastguard Worker * \sa _mesa_layout_parameters 96*61046927SAndroid Build Coastguard Worker */ 97*61046927SAndroid Build Coastguard Worker unsigned pass1_done:1; 98*61046927SAndroid Build Coastguard Worker }; 99*61046927SAndroid Build Coastguard Worker 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Worker struct asm_vector { 102*61046927SAndroid Build Coastguard Worker unsigned count; 103*61046927SAndroid Build Coastguard Worker gl_constant_value data[4]; 104*61046927SAndroid Build Coastguard Worker }; 105*61046927SAndroid Build Coastguard Worker 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker struct asm_swizzle_mask { 108*61046927SAndroid Build Coastguard Worker unsigned swizzle:12; 109*61046927SAndroid Build Coastguard Worker unsigned mask:4; 110*61046927SAndroid Build Coastguard Worker }; 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker struct asm_src_register { 114*61046927SAndroid Build Coastguard Worker struct prog_src_register Base; 115*61046927SAndroid Build Coastguard Worker 116*61046927SAndroid Build Coastguard Worker /** 117*61046927SAndroid Build Coastguard Worker * Symbol associated with indirect access to parameter arrays. 118*61046927SAndroid Build Coastguard Worker * 119*61046927SAndroid Build Coastguard Worker * If \c Base::RelAddr is 1, this will point to the symbol for the parameter 120*61046927SAndroid Build Coastguard Worker * that is being dereferenced. Further, \c Base::Index will be the offset 121*61046927SAndroid Build Coastguard Worker * from the address register being used. 122*61046927SAndroid Build Coastguard Worker */ 123*61046927SAndroid Build Coastguard Worker struct asm_symbol *Symbol; 124*61046927SAndroid Build Coastguard Worker }; 125*61046927SAndroid Build Coastguard Worker 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker struct asm_instruction { 128*61046927SAndroid Build Coastguard Worker struct prog_instruction Base; 129*61046927SAndroid Build Coastguard Worker struct asm_instruction *next; 130*61046927SAndroid Build Coastguard Worker struct asm_src_register SrcReg[3]; 131*61046927SAndroid Build Coastguard Worker }; 132*61046927SAndroid Build Coastguard Worker 133*61046927SAndroid Build Coastguard Worker 134*61046927SAndroid Build Coastguard Worker struct asm_parser_state { 135*61046927SAndroid Build Coastguard Worker struct gl_context *ctx; 136*61046927SAndroid Build Coastguard Worker struct gl_program *prog; 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker /** Memory context to attach instructions to. */ 139*61046927SAndroid Build Coastguard Worker void *mem_ctx; 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker /** 142*61046927SAndroid Build Coastguard Worker * Per-program target limits 143*61046927SAndroid Build Coastguard Worker */ 144*61046927SAndroid Build Coastguard Worker struct gl_program_constants *limits; 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Worker struct _mesa_symbol_table *st; 147*61046927SAndroid Build Coastguard Worker 148*61046927SAndroid Build Coastguard Worker /** 149*61046927SAndroid Build Coastguard Worker * Linked list of symbols 150*61046927SAndroid Build Coastguard Worker * 151*61046927SAndroid Build Coastguard Worker * This list is \b only used when cleaning up compiler state and freeing 152*61046927SAndroid Build Coastguard Worker * memory. 153*61046927SAndroid Build Coastguard Worker */ 154*61046927SAndroid Build Coastguard Worker struct asm_symbol *sym; 155*61046927SAndroid Build Coastguard Worker 156*61046927SAndroid Build Coastguard Worker /** 157*61046927SAndroid Build Coastguard Worker * State for the lexer. 158*61046927SAndroid Build Coastguard Worker */ 159*61046927SAndroid Build Coastguard Worker void *scanner; 160*61046927SAndroid Build Coastguard Worker 161*61046927SAndroid Build Coastguard Worker /** 162*61046927SAndroid Build Coastguard Worker * Linked list of instructions generated during parsing. 163*61046927SAndroid Build Coastguard Worker */ 164*61046927SAndroid Build Coastguard Worker /*@{*/ 165*61046927SAndroid Build Coastguard Worker struct asm_instruction *inst_head; 166*61046927SAndroid Build Coastguard Worker struct asm_instruction *inst_tail; 167*61046927SAndroid Build Coastguard Worker /*@}*/ 168*61046927SAndroid Build Coastguard Worker 169*61046927SAndroid Build Coastguard Worker 170*61046927SAndroid Build Coastguard Worker /** 171*61046927SAndroid Build Coastguard Worker * Selected limits copied from gl_constants 172*61046927SAndroid Build Coastguard Worker * 173*61046927SAndroid Build Coastguard Worker * These are limits from the GL context, but various bits in the program 174*61046927SAndroid Build Coastguard Worker * must be validated against these values. 175*61046927SAndroid Build Coastguard Worker */ 176*61046927SAndroid Build Coastguard Worker /*@{*/ 177*61046927SAndroid Build Coastguard Worker unsigned MaxTextureCoordUnits; 178*61046927SAndroid Build Coastguard Worker unsigned MaxTextureImageUnits; 179*61046927SAndroid Build Coastguard Worker unsigned MaxTextureUnits; 180*61046927SAndroid Build Coastguard Worker unsigned MaxClipPlanes; 181*61046927SAndroid Build Coastguard Worker unsigned MaxLights; 182*61046927SAndroid Build Coastguard Worker unsigned MaxProgramMatrices; 183*61046927SAndroid Build Coastguard Worker unsigned MaxDrawBuffers; 184*61046927SAndroid Build Coastguard Worker /*@}*/ 185*61046927SAndroid Build Coastguard Worker 186*61046927SAndroid Build Coastguard Worker /** 187*61046927SAndroid Build Coastguard Worker * Value to use in state vector accessors for environment and local 188*61046927SAndroid Build Coastguard Worker * parameters 189*61046927SAndroid Build Coastguard Worker */ 190*61046927SAndroid Build Coastguard Worker unsigned state_param_enum_env; 191*61046927SAndroid Build Coastguard Worker unsigned state_param_enum_local; 192*61046927SAndroid Build Coastguard Worker 193*61046927SAndroid Build Coastguard Worker 194*61046927SAndroid Build Coastguard Worker /** 195*61046927SAndroid Build Coastguard Worker * Input attributes bound to specific names 196*61046927SAndroid Build Coastguard Worker * 197*61046927SAndroid Build Coastguard Worker * This is only needed so that errors can be properly produced when 198*61046927SAndroid Build Coastguard Worker * multiple ATTRIB statements bind illegal combinations of vertex 199*61046927SAndroid Build Coastguard Worker * attributes. 200*61046927SAndroid Build Coastguard Worker */ 201*61046927SAndroid Build Coastguard Worker GLbitfield64 InputsBound; 202*61046927SAndroid Build Coastguard Worker 203*61046927SAndroid Build Coastguard Worker enum { 204*61046927SAndroid Build Coastguard Worker invalid_mode = 0, 205*61046927SAndroid Build Coastguard Worker ARB_vertex, 206*61046927SAndroid Build Coastguard Worker ARB_fragment 207*61046927SAndroid Build Coastguard Worker } mode; 208*61046927SAndroid Build Coastguard Worker 209*61046927SAndroid Build Coastguard Worker struct { 210*61046927SAndroid Build Coastguard Worker unsigned PositionInvariant:1; 211*61046927SAndroid Build Coastguard Worker unsigned Fog:2; /* gl_fog_mode */ 212*61046927SAndroid Build Coastguard Worker unsigned PrecisionHint:2; 213*61046927SAndroid Build Coastguard Worker unsigned DrawBuffers:1; 214*61046927SAndroid Build Coastguard Worker unsigned Shadow:1; 215*61046927SAndroid Build Coastguard Worker unsigned TexRect:1; 216*61046927SAndroid Build Coastguard Worker unsigned TexArray:1; 217*61046927SAndroid Build Coastguard Worker unsigned OriginUpperLeft:1; 218*61046927SAndroid Build Coastguard Worker unsigned PixelCenterInteger:1; 219*61046927SAndroid Build Coastguard Worker } option; 220*61046927SAndroid Build Coastguard Worker 221*61046927SAndroid Build Coastguard Worker struct { 222*61046927SAndroid Build Coastguard Worker unsigned UsesKill:1; 223*61046927SAndroid Build Coastguard Worker } fragment; 224*61046927SAndroid Build Coastguard Worker }; 225*61046927SAndroid Build Coastguard Worker 226*61046927SAndroid Build Coastguard Worker #define OPTION_NICEST 1 227*61046927SAndroid Build Coastguard Worker #define OPTION_FASTEST 2 228*61046927SAndroid Build Coastguard Worker 229*61046927SAndroid Build Coastguard Worker typedef struct YYLTYPE { 230*61046927SAndroid Build Coastguard Worker int first_line; 231*61046927SAndroid Build Coastguard Worker int first_column; 232*61046927SAndroid Build Coastguard Worker int last_line; 233*61046927SAndroid Build Coastguard Worker int last_column; 234*61046927SAndroid Build Coastguard Worker int position; 235*61046927SAndroid Build Coastguard Worker } YYLTYPE; 236*61046927SAndroid Build Coastguard Worker 237*61046927SAndroid Build Coastguard Worker #define YYLTYPE_IS_DECLARED 1 238*61046927SAndroid Build Coastguard Worker #define YYLTYPE_IS_TRIVIAL 1 239*61046927SAndroid Build Coastguard Worker 240*61046927SAndroid Build Coastguard Worker 241*61046927SAndroid Build Coastguard Worker extern GLboolean _mesa_parse_arb_program(struct gl_context *ctx, GLenum target, 242*61046927SAndroid Build Coastguard Worker const GLubyte *str, GLsizei len, struct asm_parser_state *state); 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Worker 245*61046927SAndroid Build Coastguard Worker 246*61046927SAndroid Build Coastguard Worker /* From program_lexer.l. */ 247*61046927SAndroid Build Coastguard Worker extern void _mesa_program_lexer_dtor(void *scanner); 248*61046927SAndroid Build Coastguard Worker 249*61046927SAndroid Build Coastguard Worker extern void _mesa_program_lexer_ctor(void **scanner, 250*61046927SAndroid Build Coastguard Worker struct asm_parser_state *state, const char *string, size_t len); 251*61046927SAndroid Build Coastguard Worker 252*61046927SAndroid Build Coastguard Worker 253*61046927SAndroid Build Coastguard Worker /** 254*61046927SAndroid Build Coastguard Worker *\name From program_parse_extra.c 255*61046927SAndroid Build Coastguard Worker */ 256*61046927SAndroid Build Coastguard Worker /*@{*/ 257*61046927SAndroid Build Coastguard Worker 258*61046927SAndroid Build Coastguard Worker /** 259*61046927SAndroid Build Coastguard Worker * Parses and processes an option string to an ARB vertex program 260*61046927SAndroid Build Coastguard Worker * 261*61046927SAndroid Build Coastguard Worker * \return 262*61046927SAndroid Build Coastguard Worker * Non-zero on success, zero on failure. 263*61046927SAndroid Build Coastguard Worker */ 264*61046927SAndroid Build Coastguard Worker extern int _mesa_ARBvp_parse_option(struct asm_parser_state *state, 265*61046927SAndroid Build Coastguard Worker const char *option); 266*61046927SAndroid Build Coastguard Worker 267*61046927SAndroid Build Coastguard Worker /** 268*61046927SAndroid Build Coastguard Worker * Parses and processes an option string to an ARB fragment program 269*61046927SAndroid Build Coastguard Worker * 270*61046927SAndroid Build Coastguard Worker * \return 271*61046927SAndroid Build Coastguard Worker * Non-zero on success, zero on failure. 272*61046927SAndroid Build Coastguard Worker */ 273*61046927SAndroid Build Coastguard Worker extern int _mesa_ARBfp_parse_option(struct asm_parser_state *state, 274*61046927SAndroid Build Coastguard Worker const char *option); 275*61046927SAndroid Build Coastguard Worker 276*61046927SAndroid Build Coastguard Worker /** 277*61046927SAndroid Build Coastguard Worker * Parses and processes instruction suffixes 278*61046927SAndroid Build Coastguard Worker * 279*61046927SAndroid Build Coastguard Worker * Instruction suffixes, such as \c _SAT, are processed. The relevant bits 280*61046927SAndroid Build Coastguard Worker * are set in \c inst. If suffixes are encountered that are either not known 281*61046927SAndroid Build Coastguard Worker * or not supported by the modes and options set in \c state, zero will be 282*61046927SAndroid Build Coastguard Worker * returned. 283*61046927SAndroid Build Coastguard Worker * 284*61046927SAndroid Build Coastguard Worker * \return 285*61046927SAndroid Build Coastguard Worker * Non-zero on success, zero on failure. 286*61046927SAndroid Build Coastguard Worker */ 287*61046927SAndroid Build Coastguard Worker extern int _mesa_parse_instruction_suffix(const struct asm_parser_state *state, 288*61046927SAndroid Build Coastguard Worker const char *suffix, struct prog_instruction *inst); 289*61046927SAndroid Build Coastguard Worker 290*61046927SAndroid Build Coastguard Worker /*@}*/ 291*61046927SAndroid Build Coastguard Worker 292*61046927SAndroid Build Coastguard Worker #endif /* PROGRAM_PARSER_H */ 293