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
30struct gl_context;
31
32enum asm_type {
33   at_none,
34   at_address,
35   at_attrib,
36   at_param,
37   at_temp,
38   at_output
39};
40
41struct 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
100struct asm_vector {
101   unsigned count;
102   gl_constant_value data[4];
103};
104
105
106struct asm_swizzle_mask {
107   unsigned swizzle:12;
108   unsigned mask:4;
109};
110
111
112struct 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
126struct asm_instruction {
127   struct prog_instruction Base;
128   struct asm_instruction *next;
129   struct asm_src_register SrcReg[3];
130};
131
132
133struct 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_env;
190   unsigned state_param_enum_local;
191
192
193   /**
194    * Input attributes bound to specific names
195    *
196    * This is only needed so that errors can be properly produced when
197    * multiple ATTRIB statements bind illegal combinations of vertex
198    * attributes.
199    */
200   GLbitfield64 InputsBound;
201
202   enum {
203      invalid_mode = 0,
204      ARB_vertex,
205      ARB_fragment
206   } mode;
207
208   struct {
209      unsigned PositionInvariant:1;
210      unsigned Fog:2;
211      unsigned PrecisionHint:2;
212      unsigned DrawBuffers:1;
213      unsigned Shadow:1;
214      unsigned TexRect:1;
215      unsigned TexArray:1;
216      unsigned OriginUpperLeft:1;
217      unsigned PixelCenterInteger:1;
218   } option;
219
220   struct {
221      unsigned UsesKill:1;
222   } fragment;
223};
224
225#define OPTION_NONE        0
226#define OPTION_FOG_EXP     1
227#define OPTION_FOG_EXP2    2
228#define OPTION_FOG_LINEAR  3
229#define OPTION_NICEST      1
230#define OPTION_FASTEST     2
231
232typedef struct YYLTYPE {
233   int first_line;
234   int first_column;
235   int last_line;
236   int last_column;
237   int position;
238} YYLTYPE;
239
240#define YYLTYPE_IS_DECLARED 1
241#define YYLTYPE_IS_TRIVIAL 1
242
243
244extern GLboolean _mesa_parse_arb_program(struct gl_context *ctx, GLenum target,
245    const GLubyte *str, GLsizei len, struct asm_parser_state *state);
246
247
248
249/* From program_lexer.l. */
250extern void _mesa_program_lexer_dtor(void *scanner);
251
252extern void _mesa_program_lexer_ctor(void **scanner,
253    struct asm_parser_state *state, const char *string, size_t len);
254
255
256/**
257 *\name From program_parse_extra.c
258 */
259/*@{*/
260
261/**
262 * Parses and processes an option string to an ARB vertex program
263 *
264 * \return
265 * Non-zero on success, zero on failure.
266 */
267extern int _mesa_ARBvp_parse_option(struct asm_parser_state *state,
268    const char *option);
269
270/**
271 * Parses and processes an option string to an ARB fragment program
272 *
273 * \return
274 * Non-zero on success, zero on failure.
275 */
276extern int _mesa_ARBfp_parse_option(struct asm_parser_state *state,
277    const char *option);
278
279/**
280 * Parses and processes instruction suffixes
281 *
282 * Instruction suffixes, such as \c _SAT, are processed.  The relevant bits
283 * are set in \c inst.  If suffixes are encountered that are either not known
284 * or not supported by the modes and options set in \c state, zero will be
285 * returned.
286 *
287 * \return
288 * Non-zero on success, zero on failure.
289 */
290extern int _mesa_parse_instruction_suffix(const struct asm_parser_state *state,
291    const char *suffix, struct prog_instruction *inst);
292
293/*@}*/
294
295#endif /* PROGRAM_PARSER_H */
296