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