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