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, PROGRAM_LOCAL_PARAM, or PROGRAM_ENV_PARAM. 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 /** 136 * Per-program target limits 137 */ 138 struct gl_program_constants *limits; 139 140 struct _mesa_symbol_table *st; 141 142 /** 143 * Linked list of symbols 144 * 145 * This list is \b only used when cleaning up compiler state and freeing 146 * memory. 147 */ 148 struct asm_symbol *sym; 149 150 /** 151 * State for the lexer. 152 */ 153 void *scanner; 154 155 /** 156 * Linked list of instructions generated during parsing. 157 */ 158 /*@{*/ 159 struct asm_instruction *inst_head; 160 struct asm_instruction *inst_tail; 161 /*@}*/ 162 163 164 /** 165 * Selected limits copied from gl_constants 166 * 167 * These are limits from the GL context, but various bits in the program 168 * must be validated against these values. 169 */ 170 /*@{*/ 171 unsigned MaxTextureCoordUnits; 172 unsigned MaxTextureImageUnits; 173 unsigned MaxTextureUnits; 174 unsigned MaxClipPlanes; 175 unsigned MaxLights; 176 unsigned MaxProgramMatrices; 177 unsigned MaxDrawBuffers; 178 /*@}*/ 179 180 /** 181 * Value to use in state vector accessors for environment and local 182 * parameters 183 */ 184 unsigned state_param_enum; 185 186 187 /** 188 * Input attributes bound to specific names 189 * 190 * This is only needed so that errors can be properly produced when 191 * multiple ATTRIB statements bind illegal combinations of vertex 192 * attributes. 193 */ 194 GLbitfield64 InputsBound; 195 196 enum { 197 invalid_mode = 0, 198 ARB_vertex, 199 ARB_fragment 200 } mode; 201 202 struct { 203 unsigned PositionInvariant:1; 204 unsigned Fog:2; 205 unsigned PrecisionHint:2; 206 unsigned DrawBuffers:1; 207 unsigned Shadow:1; 208 unsigned TexRect:1; 209 unsigned TexArray:1; 210 unsigned NV_fragment:1; 211 unsigned OriginUpperLeft:1; 212 unsigned PixelCenterInteger:1; 213 } option; 214 215 struct { 216 unsigned UsesKill:1; 217 unsigned UsesDFdy:1; 218 } fragment; 219 }; 220 221 #define OPTION_NONE 0 222 #define OPTION_FOG_EXP 1 223 #define OPTION_FOG_EXP2 2 224 #define OPTION_FOG_LINEAR 3 225 #define OPTION_NICEST 1 226 #define OPTION_FASTEST 2 227 228 typedef struct YYLTYPE { 229 int first_line; 230 int first_column; 231 int last_line; 232 int last_column; 233 int position; 234 } YYLTYPE; 235 236 #define YYLTYPE_IS_DECLARED 1 237 #define YYLTYPE_IS_TRIVIAL 1 238 239 240 extern GLboolean _mesa_parse_arb_program(struct gl_context *ctx, GLenum target, 241 const GLubyte *str, GLsizei len, struct asm_parser_state *state); 242 243 244 245 /* From program_lexer.l. */ 246 extern void _mesa_program_lexer_dtor(void *scanner); 247 248 extern void _mesa_program_lexer_ctor(void **scanner, 249 struct asm_parser_state *state, const char *string, size_t len); 250 251 252 /** 253 *\name From program_parse_extra.c 254 */ 255 /*@{*/ 256 257 /** 258 * Parses and processes an option string to an ARB vertex program 259 * 260 * \return 261 * Non-zero on success, zero on failure. 262 */ 263 extern int _mesa_ARBvp_parse_option(struct asm_parser_state *state, 264 const char *option); 265 266 /** 267 * Parses and processes an option string to an ARB fragment program 268 * 269 * \return 270 * Non-zero on success, zero on failure. 271 */ 272 extern int _mesa_ARBfp_parse_option(struct asm_parser_state *state, 273 const char *option); 274 275 /** 276 * Parses and processes instruction suffixes 277 * 278 * Instruction suffixes, such as \c _SAT, are processed. The relevant bits 279 * are set in \c inst. If suffixes are encountered that are either not known 280 * or not supported by the modes and options set in \c state, zero will be 281 * returned. 282 * 283 * \return 284 * Non-zero on success, zero on failure. 285 */ 286 extern int _mesa_parse_instruction_suffix(const struct asm_parser_state *state, 287 const char *suffix, struct prog_instruction *inst); 288 289 /** 290 * Parses a condition code name 291 * 292 * The condition code names (e.g., \c LT, \c GT, \c NE) were added to assembly 293 * shaders with the \c GL_NV_fragment_program_option extension. This function 294 * converts a string representation into one of the \c COND_ macros. 295 * 296 * \return 297 * One of the \c COND_ macros defined in prog_instruction.h on success or zero 298 * on failure. 299 */ 300 extern int _mesa_parse_cc(const char *s); 301 302 /*@}*/ 303