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
28struct gl_context;
29
30enum asm_type {
31   at_none,
32   at_address,
33   at_attrib,
34   at_param,
35   at_temp,
36   at_output
37};
38
39struct 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
98struct asm_vector {
99   unsigned count;
100   gl_constant_value data[4];
101};
102
103
104struct asm_swizzle_mask {
105   unsigned swizzle:12;
106   unsigned mask:4;
107};
108
109
110struct 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
124struct asm_instruction {
125   struct prog_instruction Base;
126   struct asm_instruction *next;
127   struct asm_src_register SrcReg[3];
128};
129
130
131struct 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
228typedef 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
240extern 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. */
246extern void _mesa_program_lexer_dtor(void *scanner);
247
248extern 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 */
263extern 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 */
272extern 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 */
286extern 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 */
300extern int _mesa_parse_cc(const char *s);
301
302/*@}*/
303