2 * Copyright © 2009 Intel Corporation
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:
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
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.
25 #include "main/config.h"
26 #include "program/prog_parameter.h"
40 struct asm_symbol
*next
; /**< List linkage for freeing. */
43 unsigned attrib_binding
;
44 unsigned output_binding
; /**< Output / result register number. */
47 * One of PROGRAM_STATE_VAR, PROGRAM_LOCAL_PARAM, or PROGRAM_ENV_PARAM.
49 unsigned param_binding_type
;
52 * Offset into the program_parameter_list where the tokens representing our
53 * bound state (or constants) start.
55 unsigned param_binding_begin
;
58 * Constants put into the parameter list may be swizzled. This
59 * field contain's the symbol's swizzle. (SWIZZLE_X/Y/Z/W)
61 unsigned param_binding_swizzle
;
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.
67 unsigned param_binding_length
;
70 * Index of the temp register assigned to this variable.
72 unsigned temp_binding
;
75 * Flag whether or not a PARAM is an array
77 unsigned param_is_array
:1;
81 * Flag whether or not a PARAM array is accessed indirectly
83 unsigned param_accessed_indirectly
:1;
87 * \brief Is first pass of parameter layout done with this variable?
89 * The parameter layout routine operates in two passes. This flag tracks
90 * whether or not the first pass has handled this variable.
92 * \sa _mesa_layout_parameters
94 unsigned pass1_done
:1;
100 gl_constant_value data
[4];
104 struct asm_swizzle_mask
{
110 struct asm_src_register
{
111 struct prog_src_register Base
;
114 * Symbol associated with indirect access to parameter arrays.
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.
120 struct asm_symbol
*Symbol
;
124 struct asm_instruction
{
125 struct prog_instruction Base
;
126 struct asm_instruction
*next
;
127 struct asm_src_register SrcReg
[3];
131 struct asm_parser_state
{
132 struct gl_context
*ctx
;
133 struct gl_program
*prog
;
136 * Per-program target limits
138 struct gl_program_constants
*limits
;
140 struct _mesa_symbol_table
*st
;
143 * Linked list of symbols
145 * This list is \b only used when cleaning up compiler state and freeing
148 struct asm_symbol
*sym
;
151 * State for the lexer.
156 * Linked list of instructions generated during parsing.
159 struct asm_instruction
*inst_head
;
160 struct asm_instruction
*inst_tail
;
165 * Selected limits copied from gl_constants
167 * These are limits from the GL context, but various bits in the program
168 * must be validated against these values.
171 unsigned MaxTextureCoordUnits
;
172 unsigned MaxTextureImageUnits
;
173 unsigned MaxTextureUnits
;
174 unsigned MaxClipPlanes
;
176 unsigned MaxProgramMatrices
;
177 unsigned MaxDrawBuffers
;
181 * Value to use in state vector accessors for environment and local
184 unsigned state_param_enum
;
188 * Input attributes bound to specific names
190 * This is only needed so that errors can be properly produced when
191 * multiple ATTRIB statements bind illegal combinations of vertex
194 GLbitfield64 InputsBound
;
203 unsigned PositionInvariant
:1;
205 unsigned PrecisionHint
:2;
206 unsigned DrawBuffers
:1;
210 unsigned NV_fragment
:1;
211 unsigned OriginUpperLeft
:1;
212 unsigned PixelCenterInteger
:1;
220 #define OPTION_NONE 0
221 #define OPTION_FOG_EXP 1
222 #define OPTION_FOG_EXP2 2
223 #define OPTION_FOG_LINEAR 3
224 #define OPTION_NICEST 1
225 #define OPTION_FASTEST 2
227 typedef struct YYLTYPE
{
235 #define YYLTYPE_IS_DECLARED 1
236 #define YYLTYPE_IS_TRIVIAL 1
239 extern GLboolean
_mesa_parse_arb_program(struct gl_context
*ctx
, GLenum target
,
240 const GLubyte
*str
, GLsizei len
, struct asm_parser_state
*state
);
244 /* From program_lexer.l. */
245 extern void _mesa_program_lexer_dtor(void *scanner
);
247 extern void _mesa_program_lexer_ctor(void **scanner
,
248 struct asm_parser_state
*state
, const char *string
, size_t len
);
252 *\name From program_parse_extra.c
257 * Parses and processes an option string to an ARB vertex program
260 * Non-zero on success, zero on failure.
262 extern int _mesa_ARBvp_parse_option(struct asm_parser_state
*state
,
266 * Parses and processes an option string to an ARB fragment program
269 * Non-zero on success, zero on failure.
271 extern int _mesa_ARBfp_parse_option(struct asm_parser_state
*state
,
275 * Parses and processes instruction suffixes
277 * Instruction suffixes, such as \c _SAT, are processed. The relevant bits
278 * are set in \c inst. If suffixes are encountered that are either not known
279 * or not supported by the modes and options set in \c state, zero will be
283 * Non-zero on success, zero on failure.
285 extern int _mesa_parse_instruction_suffix(const struct asm_parser_state
*state
,
286 const char *suffix
, struct prog_instruction
*inst
);
289 * Parses a condition code name
291 * The condition code names (e.g., \c LT, \c GT, \c NE) were added to assembly
292 * shaders with the \c GL_NV_fragment_program_option extension. This function
293 * converts a string representation into one of the \c COND_ macros.
296 * One of the \c COND_ macros defined in prog_instruction.h on success or zero
299 extern int _mesa_parse_cc(const char *s
);