[DMUSIC]
[reactos.git] / reactos / dll / opengl / mesa / src / mesa / program / program_parser.h
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 TexArray:1;
209 unsigned NV_fragment:1;
210 } option;
211
212 struct {
213 unsigned UsesKill:1;
214 } fragment;
215 };
216
217 #define OPTION_NONE 0
218 #define OPTION_FOG_EXP 1
219 #define OPTION_FOG_EXP2 2
220 #define OPTION_FOG_LINEAR 3
221 #define OPTION_NICEST 1
222 #define OPTION_FASTEST 2
223
224 typedef struct YYLTYPE {
225 int first_line;
226 int first_column;
227 int last_line;
228 int last_column;
229 int position;
230 } YYLTYPE;
231
232 #define YYLTYPE_IS_DECLARED 1
233 #define YYLTYPE_IS_TRIVIAL 1
234
235
236 extern GLboolean _mesa_parse_arb_program(struct gl_context *ctx, GLenum target,
237 const GLubyte *str, GLsizei len, struct asm_parser_state *state);
238
239
240
241 /* From program_lexer.l. */
242 extern void _mesa_program_lexer_dtor(void *scanner);
243
244 extern void _mesa_program_lexer_ctor(void **scanner,
245 struct asm_parser_state *state, const char *string, size_t len);
246
247
248 /**
249 *\name From program_parse_extra.c
250 */
251 /*@{*/
252
253 /**
254 * Parses and processes an option string to an ARB vertex program
255 *
256 * \return
257 * Non-zero on success, zero on failure.
258 */
259 extern int _mesa_ARBvp_parse_option(struct asm_parser_state *state,
260 const char *option);
261
262 /**
263 * Parses and processes an option string to an ARB fragment program
264 *
265 * \return
266 * Non-zero on success, zero on failure.
267 */
268 extern int _mesa_ARBfp_parse_option(struct asm_parser_state *state,
269 const char *option);
270
271 /**
272 * Parses and processes instruction suffixes
273 *
274 * Instruction suffixes, such as \c _SAT, are processed. The relevant bits
275 * are set in \c inst. If suffixes are encountered that are either not known
276 * or not supported by the modes and options set in \c state, zero will be
277 * returned.
278 *
279 * \return
280 * Non-zero on success, zero on failure.
281 */
282 extern int _mesa_parse_instruction_suffix(const struct asm_parser_state *state,
283 const char *suffix, struct prog_instruction *inst);
284
285 /**
286 * Parses a condition code name
287 *
288 * The condition code names (e.g., \c LT, \c GT, \c NE) were added to assembly
289 * shaders with the \c GL_NV_fragment_program_option extension. This function
290 * converts a string representation into one of the \c COND_ macros.
291 *
292 * \return
293 * One of the \c COND_ macros defined in prog_instruction.h on success or zero
294 * on failure.
295 */
296 extern int _mesa_parse_cc(const char *s);
297
298 /*@}*/