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