Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1901 | serge | 1 | /* |
2 | * Copyright © 2010 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 | /** |
||
25 | * \file ast_to_hir.c |
||
26 | * Convert abstract syntax to to high-level intermediate reprensentation (HIR). |
||
27 | * |
||
28 | * During the conversion to HIR, the majority of the symantic checking is |
||
29 | * preformed on the program. This includes: |
||
30 | * |
||
31 | * * Symbol table management |
||
32 | * * Type checking |
||
33 | * * Function binding |
||
34 | * |
||
35 | * The majority of this work could be done during parsing, and the parser could |
||
36 | * probably generate HIR directly. However, this results in frequent changes |
||
37 | * to the parser code. Since we do not assume that every system this complier |
||
38 | * is built on will have Flex and Bison installed, we have to store the code |
||
39 | * generated by these tools in our version control system. In other parts of |
||
40 | * the system we've seen problems where a parser was changed but the generated |
||
41 | * code was not committed, merge conflicts where created because two developers |
||
42 | * had slightly different versions of Bison installed, etc. |
||
43 | * |
||
44 | * I have also noticed that running Bison generated parsers in GDB is very |
||
45 | * irritating. When you get a segfault on '$$ = $1->foo', you can't very |
||
46 | * well 'print $1' in GDB. |
||
47 | * |
||
48 | * As a result, my preference is to put as little C code as possible in the |
||
49 | * parser (and lexer) sources. |
||
50 | */ |
||
51 | |||
52 | #include "main/core.h" /* for struct gl_extensions */ |
||
53 | #include "glsl_symbol_table.h" |
||
54 | #include "glsl_parser_extras.h" |
||
55 | #include "ast.h" |
||
56 | #include "glsl_types.h" |
||
57 | #include "ir.h" |
||
58 | |||
59 | void |
||
60 | _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) |
||
61 | { |
||
62 | _mesa_glsl_initialize_variables(instructions, state); |
||
63 | _mesa_glsl_initialize_functions(instructions, state); |
||
64 | |||
65 | state->symbols->language_version = state->language_version; |
||
66 | |||
67 | state->current_function = NULL; |
||
68 | |||
69 | /* Section 4.2 of the GLSL 1.20 specification states: |
||
70 | * "The built-in functions are scoped in a scope outside the global scope |
||
71 | * users declare global variables in. That is, a shader's global scope, |
||
72 | * available for user-defined functions and global variables, is nested |
||
73 | * inside the scope containing the built-in functions." |
||
74 | * |
||
75 | * Since built-in functions like ftransform() access built-in variables, |
||
76 | * it follows that those must be in the outer scope as well. |
||
77 | * |
||
78 | * We push scope here to create this nesting effect...but don't pop. |
||
79 | * This way, a shader's globals are still in the symbol table for use |
||
80 | * by the linker. |
||
81 | */ |
||
82 | state->symbols->push_scope(); |
||
83 | |||
84 | foreach_list_typed (ast_node, ast, link, & state->translation_unit) |
||
85 | ast->hir(instructions, state); |
||
86 | } |
||
87 | |||
88 | |||
89 | /** |
||
90 | * If a conversion is available, convert one operand to a different type |
||
91 | * |
||
92 | * The \c from \c ir_rvalue is converted "in place". |
||
93 | * |
||
94 | * \param to Type that the operand it to be converted to |
||
95 | * \param from Operand that is being converted |
||
96 | * \param state GLSL compiler state |
||
97 | * |
||
98 | * \return |
||
99 | * If a conversion is possible (or unnecessary), \c true is returned. |
||
100 | * Otherwise \c false is returned. |
||
101 | */ |
||
102 | bool |
||
103 | apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, |
||
104 | struct _mesa_glsl_parse_state *state) |
||
105 | { |
||
106 | void *ctx = state; |
||
107 | if (to->base_type == from->type->base_type) |
||
108 | return true; |
||
109 | |||
110 | /* This conversion was added in GLSL 1.20. If the compilation mode is |
||
111 | * GLSL 1.10, the conversion is skipped. |
||
112 | */ |
||
113 | if (state->language_version < 120) |
||
114 | return false; |
||
115 | |||
116 | /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec: |
||
117 | * |
||
118 | * "There are no implicit array or structure conversions. For |
||
119 | * example, an array of int cannot be implicitly converted to an |
||
120 | * array of float. There are no implicit conversions between |
||
121 | * signed and unsigned integers." |
||
122 | */ |
||
123 | /* FINISHME: The above comment is partially a lie. There is int/uint |
||
124 | * FINISHME: conversion for immediate constants. |
||
125 | */ |
||
126 | if (!to->is_float() || !from->type->is_numeric()) |
||
127 | return false; |
||
128 | |||
129 | /* Convert to a floating point type with the same number of components |
||
130 | * as the original type - i.e. int to float, not int to vec4. |
||
131 | */ |
||
132 | to = glsl_type::get_instance(GLSL_TYPE_FLOAT, from->type->vector_elements, |
||
133 | from->type->matrix_columns); |
||
134 | |||
135 | switch (from->type->base_type) { |
||
136 | case GLSL_TYPE_INT: |
||
137 | from = new(ctx) ir_expression(ir_unop_i2f, to, from, NULL); |
||
138 | break; |
||
139 | case GLSL_TYPE_UINT: |
||
140 | from = new(ctx) ir_expression(ir_unop_u2f, to, from, NULL); |
||
141 | break; |
||
142 | case GLSL_TYPE_BOOL: |
||
143 | from = new(ctx) ir_expression(ir_unop_b2f, to, from, NULL); |
||
144 | break; |
||
145 | default: |
||
146 | assert(0); |
||
147 | } |
||
148 | |||
149 | return true; |
||
150 | } |
||
151 | |||
152 | |||
153 | static const struct glsl_type * |
||
154 | arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, |
||
155 | bool multiply, |
||
156 | struct _mesa_glsl_parse_state *state, YYLTYPE *loc) |
||
157 | { |
||
158 | const glsl_type *type_a = value_a->type; |
||
159 | const glsl_type *type_b = value_b->type; |
||
160 | |||
161 | /* From GLSL 1.50 spec, page 56: |
||
162 | * |
||
163 | * "The arithmetic binary operators add (+), subtract (-), |
||
164 | * multiply (*), and divide (/) operate on integer and |
||
165 | * floating-point scalars, vectors, and matrices." |
||
166 | */ |
||
167 | if (!type_a->is_numeric() || !type_b->is_numeric()) { |
||
168 | _mesa_glsl_error(loc, state, |
||
169 | "Operands to arithmetic operators must be numeric"); |
||
170 | return glsl_type::error_type; |
||
171 | } |
||
172 | |||
173 | |||
174 | /* "If one operand is floating-point based and the other is |
||
175 | * not, then the conversions from Section 4.1.10 "Implicit |
||
176 | * Conversions" are applied to the non-floating-point-based operand." |
||
177 | */ |
||
178 | if (!apply_implicit_conversion(type_a, value_b, state) |
||
179 | && !apply_implicit_conversion(type_b, value_a, state)) { |
||
180 | _mesa_glsl_error(loc, state, |
||
181 | "Could not implicitly convert operands to " |
||
182 | "arithmetic operator"); |
||
183 | return glsl_type::error_type; |
||
184 | } |
||
185 | type_a = value_a->type; |
||
186 | type_b = value_b->type; |
||
187 | |||
188 | /* "If the operands are integer types, they must both be signed or |
||
189 | * both be unsigned." |
||
190 | * |
||
191 | * From this rule and the preceeding conversion it can be inferred that |
||
192 | * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT. |
||
193 | * The is_numeric check above already filtered out the case where either |
||
194 | * type is not one of these, so now the base types need only be tested for |
||
195 | * equality. |
||
196 | */ |
||
197 | if (type_a->base_type != type_b->base_type) { |
||
198 | _mesa_glsl_error(loc, state, |
||
199 | "base type mismatch for arithmetic operator"); |
||
200 | return glsl_type::error_type; |
||
201 | } |
||
202 | |||
203 | /* "All arithmetic binary operators result in the same fundamental type |
||
204 | * (signed integer, unsigned integer, or floating-point) as the |
||
205 | * operands they operate on, after operand type conversion. After |
||
206 | * conversion, the following cases are valid |
||
207 | * |
||
208 | * * The two operands are scalars. In this case the operation is |
||
209 | * applied, resulting in a scalar." |
||
210 | */ |
||
211 | if (type_a->is_scalar() && type_b->is_scalar()) |
||
212 | return type_a; |
||
213 | |||
214 | /* "* One operand is a scalar, and the other is a vector or matrix. |
||
215 | * In this case, the scalar operation is applied independently to each |
||
216 | * component of the vector or matrix, resulting in the same size |
||
217 | * vector or matrix." |
||
218 | */ |
||
219 | if (type_a->is_scalar()) { |
||
220 | if (!type_b->is_scalar()) |
||
221 | return type_b; |
||
222 | } else if (type_b->is_scalar()) { |
||
223 | return type_a; |
||
224 | } |
||
225 | |||
226 | /* All of the combinations of |
||
227 | * |
||
228 | * handled. |
||
229 | */ |
||
230 | assert(!type_a->is_scalar()); |
||
231 | assert(!type_b->is_scalar()); |
||
232 | |||
233 | /* "* The two operands are vectors of the same size. In this case, the |
||
234 | * operation is done component-wise resulting in the same size |
||
235 | * vector." |
||
236 | */ |
||
237 | if (type_a->is_vector() && type_b->is_vector()) { |
||
238 | if (type_a == type_b) { |
||
239 | return type_a; |
||
240 | } else { |
||
241 | _mesa_glsl_error(loc, state, |
||
242 | "vector size mismatch for arithmetic operator"); |
||
243 | return glsl_type::error_type; |
||
244 | } |
||
245 | } |
||
246 | |||
247 | /* All of the combinations of |
||
248 | * |
||
249 | * |
||
250 | * be matrix. Further, since there are no integer matrix types, the base |
||
251 | * type of both operands must be float. |
||
252 | */ |
||
253 | assert(type_a->is_matrix() || type_b->is_matrix()); |
||
254 | assert(type_a->base_type == GLSL_TYPE_FLOAT); |
||
255 | assert(type_b->base_type == GLSL_TYPE_FLOAT); |
||
256 | |||
257 | /* "* The operator is add (+), subtract (-), or divide (/), and the |
||
258 | * operands are matrices with the same number of rows and the same |
||
259 | * number of columns. In this case, the operation is done component- |
||
260 | * wise resulting in the same size matrix." |
||
261 | * * The operator is multiply (*), where both operands are matrices or |
||
262 | * one operand is a vector and the other a matrix. A right vector |
||
263 | * operand is treated as a column vector and a left vector operand as a |
||
264 | * row vector. In all these cases, it is required that the number of |
||
265 | * columns of the left operand is equal to the number of rows of the |
||
266 | * right operand. Then, the multiply (*) operation does a linear |
||
267 | * algebraic multiply, yielding an object that has the same number of |
||
268 | * rows as the left operand and the same number of columns as the right |
||
269 | * operand. Section 5.10 "Vector and Matrix Operations" explains in |
||
270 | * more detail how vectors and matrices are operated on." |
||
271 | */ |
||
272 | if (! multiply) { |
||
273 | if (type_a == type_b) |
||
274 | return type_a; |
||
275 | } else { |
||
276 | if (type_a->is_matrix() && type_b->is_matrix()) { |
||
277 | /* Matrix multiply. The columns of A must match the rows of B. Given |
||
278 | * the other previously tested constraints, this means the vector type |
||
279 | * of a row from A must be the same as the vector type of a column from |
||
280 | * B. |
||
281 | */ |
||
282 | if (type_a->row_type() == type_b->column_type()) { |
||
283 | /* The resulting matrix has the number of columns of matrix B and |
||
284 | * the number of rows of matrix A. We get the row count of A by |
||
285 | * looking at the size of a vector that makes up a column. The |
||
286 | * transpose (size of a row) is done for B. |
||
287 | */ |
||
288 | const glsl_type *const type = |
||
289 | glsl_type::get_instance(type_a->base_type, |
||
290 | type_a->column_type()->vector_elements, |
||
291 | type_b->row_type()->vector_elements); |
||
292 | assert(type != glsl_type::error_type); |
||
293 | |||
294 | return type; |
||
295 | } |
||
296 | } else if (type_a->is_matrix()) { |
||
297 | /* A is a matrix and B is a column vector. Columns of A must match |
||
298 | * rows of B. Given the other previously tested constraints, this |
||
299 | * means the vector type of a row from A must be the same as the |
||
300 | * vector the type of B. |
||
301 | */ |
||
302 | if (type_a->row_type() == type_b) { |
||
303 | /* The resulting vector has a number of elements equal to |
||
304 | * the number of rows of matrix A. */ |
||
305 | const glsl_type *const type = |
||
306 | glsl_type::get_instance(type_a->base_type, |
||
307 | type_a->column_type()->vector_elements, |
||
308 | 1); |
||
309 | assert(type != glsl_type::error_type); |
||
310 | |||
311 | return type; |
||
312 | } |
||
313 | } else { |
||
314 | assert(type_b->is_matrix()); |
||
315 | |||
316 | /* A is a row vector and B is a matrix. Columns of A must match rows |
||
317 | * of B. Given the other previously tested constraints, this means |
||
318 | * the type of A must be the same as the vector type of a column from |
||
319 | * B. |
||
320 | */ |
||
321 | if (type_a == type_b->column_type()) { |
||
322 | /* The resulting vector has a number of elements equal to |
||
323 | * the number of columns of matrix B. */ |
||
324 | const glsl_type *const type = |
||
325 | glsl_type::get_instance(type_a->base_type, |
||
326 | type_b->row_type()->vector_elements, |
||
327 | 1); |
||
328 | assert(type != glsl_type::error_type); |
||
329 | |||
330 | return type; |
||
331 | } |
||
332 | } |
||
333 | |||
334 | _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication"); |
||
335 | return glsl_type::error_type; |
||
336 | } |
||
337 | |||
338 | |||
339 | /* "All other cases are illegal." |
||
340 | */ |
||
341 | _mesa_glsl_error(loc, state, "type mismatch"); |
||
342 | return glsl_type::error_type; |
||
343 | } |
||
344 | |||
345 | |||
346 | static const struct glsl_type * |
||
347 | unary_arithmetic_result_type(const struct glsl_type *type, |
||
348 | struct _mesa_glsl_parse_state *state, YYLTYPE *loc) |
||
349 | { |
||
350 | /* From GLSL 1.50 spec, page 57: |
||
351 | * |
||
352 | * "The arithmetic unary operators negate (-), post- and pre-increment |
||
353 | * and decrement (-- and ++) operate on integer or floating-point |
||
354 | * values (including vectors and matrices). All unary operators work |
||
355 | * component-wise on their operands. These result with the same type |
||
356 | * they operated on." |
||
357 | */ |
||
358 | if (!type->is_numeric()) { |
||
359 | _mesa_glsl_error(loc, state, |
||
360 | "Operands to arithmetic operators must be numeric"); |
||
361 | return glsl_type::error_type; |
||
362 | } |
||
363 | |||
364 | return type; |
||
365 | } |
||
366 | |||
367 | /** |
||
368 | * \brief Return the result type of a bit-logic operation. |
||
369 | * |
||
370 | * If the given types to the bit-logic operator are invalid, return |
||
371 | * glsl_type::error_type. |
||
372 | * |
||
373 | * \param type_a Type of LHS of bit-logic op |
||
374 | * \param type_b Type of RHS of bit-logic op |
||
375 | */ |
||
376 | static const struct glsl_type * |
||
377 | bit_logic_result_type(const struct glsl_type *type_a, |
||
378 | const struct glsl_type *type_b, |
||
379 | ast_operators op, |
||
380 | struct _mesa_glsl_parse_state *state, YYLTYPE *loc) |
||
381 | { |
||
382 | if (state->language_version < 130) { |
||
383 | _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30"); |
||
384 | return glsl_type::error_type; |
||
385 | } |
||
386 | |||
387 | /* From page 50 (page 56 of PDF) of GLSL 1.30 spec: |
||
388 | * |
||
389 | * "The bitwise operators and (&), exclusive-or (^), and inclusive-or |
||
390 | * (|). The operands must be of type signed or unsigned integers or |
||
391 | * integer vectors." |
||
392 | */ |
||
393 | if (!type_a->is_integer()) { |
||
394 | _mesa_glsl_error(loc, state, "LHS of `%s' must be an integer", |
||
395 | ast_expression::operator_string(op)); |
||
396 | return glsl_type::error_type; |
||
397 | } |
||
398 | if (!type_b->is_integer()) { |
||
399 | _mesa_glsl_error(loc, state, "RHS of `%s' must be an integer", |
||
400 | ast_expression::operator_string(op)); |
||
401 | return glsl_type::error_type; |
||
402 | } |
||
403 | |||
404 | /* "The fundamental types of the operands (signed or unsigned) must |
||
405 | * match," |
||
406 | */ |
||
407 | if (type_a->base_type != type_b->base_type) { |
||
408 | _mesa_glsl_error(loc, state, "operands of `%s' must have the same " |
||
409 | "base type", ast_expression::operator_string(op)); |
||
410 | return glsl_type::error_type; |
||
411 | } |
||
412 | |||
413 | /* "The operands cannot be vectors of differing size." */ |
||
414 | if (type_a->is_vector() && |
||
415 | type_b->is_vector() && |
||
416 | type_a->vector_elements != type_b->vector_elements) { |
||
417 | _mesa_glsl_error(loc, state, "operands of `%s' cannot be vectors of " |
||
418 | "different sizes", ast_expression::operator_string(op)); |
||
419 | return glsl_type::error_type; |
||
420 | } |
||
421 | |||
422 | /* "If one operand is a scalar and the other a vector, the scalar is |
||
423 | * applied component-wise to the vector, resulting in the same type as |
||
424 | * the vector. The fundamental types of the operands [...] will be the |
||
425 | * resulting fundamental type." |
||
426 | */ |
||
427 | if (type_a->is_scalar()) |
||
428 | return type_b; |
||
429 | else |
||
430 | return type_a; |
||
431 | } |
||
432 | |||
433 | static const struct glsl_type * |
||
434 | modulus_result_type(const struct glsl_type *type_a, |
||
435 | const struct glsl_type *type_b, |
||
436 | struct _mesa_glsl_parse_state *state, YYLTYPE *loc) |
||
437 | { |
||
438 | if (state->language_version < 130) { |
||
439 | _mesa_glsl_error(loc, state, |
||
440 | "operator '%%' is reserved in %s", |
||
441 | state->version_string); |
||
442 | return glsl_type::error_type; |
||
443 | } |
||
444 | |||
445 | /* From GLSL 1.50 spec, page 56: |
||
446 | * "The operator modulus (%) operates on signed or unsigned integers or |
||
447 | * integer vectors. The operand types must both be signed or both be |
||
448 | * unsigned." |
||
449 | */ |
||
450 | if (!type_a->is_integer() || !type_b->is_integer() |
||
451 | || (type_a->base_type != type_b->base_type)) { |
||
452 | _mesa_glsl_error(loc, state, "type mismatch"); |
||
453 | return glsl_type::error_type; |
||
454 | } |
||
455 | |||
456 | /* "The operands cannot be vectors of differing size. If one operand is |
||
457 | * a scalar and the other vector, then the scalar is applied component- |
||
458 | * wise to the vector, resulting in the same type as the vector. If both |
||
459 | * are vectors of the same size, the result is computed component-wise." |
||
460 | */ |
||
461 | if (type_a->is_vector()) { |
||
462 | if (!type_b->is_vector() |
||
463 | || (type_a->vector_elements == type_b->vector_elements)) |
||
464 | return type_a; |
||
465 | } else |
||
466 | return type_b; |
||
467 | |||
468 | /* "The operator modulus (%) is not defined for any other data types |
||
469 | * (non-integer types)." |
||
470 | */ |
||
471 | _mesa_glsl_error(loc, state, "type mismatch"); |
||
472 | return glsl_type::error_type; |
||
473 | } |
||
474 | |||
475 | |||
476 | static const struct glsl_type * |
||
477 | relational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, |
||
478 | struct _mesa_glsl_parse_state *state, YYLTYPE *loc) |
||
479 | { |
||
480 | const glsl_type *type_a = value_a->type; |
||
481 | const glsl_type *type_b = value_b->type; |
||
482 | |||
483 | /* From GLSL 1.50 spec, page 56: |
||
484 | * "The relational operators greater than (>), less than (<), greater |
||
485 | * than or equal (>=), and less than or equal (<=) operate only on |
||
486 | * scalar integer and scalar floating-point expressions." |
||
487 | */ |
||
488 | if (!type_a->is_numeric() |
||
489 | || !type_b->is_numeric() |
||
490 | || !type_a->is_scalar() |
||
491 | || !type_b->is_scalar()) { |
||
492 | _mesa_glsl_error(loc, state, |
||
493 | "Operands to relational operators must be scalar and " |
||
494 | "numeric"); |
||
495 | return glsl_type::error_type; |
||
496 | } |
||
497 | |||
498 | /* "Either the operands' types must match, or the conversions from |
||
499 | * Section 4.1.10 "Implicit Conversions" will be applied to the integer |
||
500 | * operand, after which the types must match." |
||
501 | */ |
||
502 | if (!apply_implicit_conversion(type_a, value_b, state) |
||
503 | && !apply_implicit_conversion(type_b, value_a, state)) { |
||
504 | _mesa_glsl_error(loc, state, |
||
505 | "Could not implicitly convert operands to " |
||
506 | "relational operator"); |
||
507 | return glsl_type::error_type; |
||
508 | } |
||
509 | type_a = value_a->type; |
||
510 | type_b = value_b->type; |
||
511 | |||
512 | if (type_a->base_type != type_b->base_type) { |
||
513 | _mesa_glsl_error(loc, state, "base type mismatch"); |
||
514 | return glsl_type::error_type; |
||
515 | } |
||
516 | |||
517 | /* "The result is scalar Boolean." |
||
518 | */ |
||
519 | return glsl_type::bool_type; |
||
520 | } |
||
521 | |||
522 | /** |
||
523 | * \brief Return the result type of a bit-shift operation. |
||
524 | * |
||
525 | * If the given types to the bit-shift operator are invalid, return |
||
526 | * glsl_type::error_type. |
||
527 | * |
||
528 | * \param type_a Type of LHS of bit-shift op |
||
529 | * \param type_b Type of RHS of bit-shift op |
||
530 | */ |
||
531 | static const struct glsl_type * |
||
532 | shift_result_type(const struct glsl_type *type_a, |
||
533 | const struct glsl_type *type_b, |
||
534 | ast_operators op, |
||
535 | struct _mesa_glsl_parse_state *state, YYLTYPE *loc) |
||
536 | { |
||
537 | if (state->language_version < 130) { |
||
538 | _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30"); |
||
539 | return glsl_type::error_type; |
||
540 | } |
||
541 | |||
542 | /* From page 50 (page 56 of the PDF) of the GLSL 1.30 spec: |
||
543 | * |
||
544 | * "The shift operators (<<) and (>>). For both operators, the operands |
||
545 | * must be signed or unsigned integers or integer vectors. One operand |
||
546 | * can be signed while the other is unsigned." |
||
547 | */ |
||
548 | if (!type_a->is_integer()) { |
||
549 | _mesa_glsl_error(loc, state, "LHS of operator %s must be an integer or " |
||
550 | "integer vector", ast_expression::operator_string(op)); |
||
551 | return glsl_type::error_type; |
||
552 | |||
553 | } |
||
554 | if (!type_b->is_integer()) { |
||
555 | _mesa_glsl_error(loc, state, "RHS of operator %s must be an integer or " |
||
556 | "integer vector", ast_expression::operator_string(op)); |
||
557 | return glsl_type::error_type; |
||
558 | } |
||
559 | |||
560 | /* "If the first operand is a scalar, the second operand has to be |
||
561 | * a scalar as well." |
||
562 | */ |
||
563 | if (type_a->is_scalar() && !type_b->is_scalar()) { |
||
564 | _mesa_glsl_error(loc, state, "If the first operand of %s is scalar, the " |
||
565 | "second must be scalar as well", |
||
566 | ast_expression::operator_string(op)); |
||
567 | return glsl_type::error_type; |
||
568 | } |
||
569 | |||
570 | /* If both operands are vectors, check that they have same number of |
||
571 | * elements. |
||
572 | */ |
||
573 | if (type_a->is_vector() && |
||
574 | type_b->is_vector() && |
||
575 | type_a->vector_elements != type_b->vector_elements) { |
||
576 | _mesa_glsl_error(loc, state, "Vector operands to operator %s must " |
||
577 | "have same number of elements", |
||
578 | ast_expression::operator_string(op)); |
||
579 | return glsl_type::error_type; |
||
580 | } |
||
581 | |||
582 | /* "In all cases, the resulting type will be the same type as the left |
||
583 | * operand." |
||
584 | */ |
||
585 | return type_a; |
||
586 | } |
||
587 | |||
588 | /** |
||
589 | * Validates that a value can be assigned to a location with a specified type |
||
590 | * |
||
591 | * Validates that \c rhs can be assigned to some location. If the types are |
||
592 | * not an exact match but an automatic conversion is possible, \c rhs will be |
||
593 | * converted. |
||
594 | * |
||
595 | * \return |
||
596 | * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type. |
||
597 | * Otherwise the actual RHS to be assigned will be returned. This may be |
||
598 | * \c rhs, or it may be \c rhs after some type conversion. |
||
599 | * |
||
600 | * \note |
||
601 | * In addition to being used for assignments, this function is used to |
||
602 | * type-check return values. |
||
603 | */ |
||
604 | ir_rvalue * |
||
605 | validate_assignment(struct _mesa_glsl_parse_state *state, |
||
606 | const glsl_type *lhs_type, ir_rvalue *rhs) |
||
607 | { |
||
608 | const glsl_type *rhs_type = rhs->type; |
||
609 | |||
610 | /* If there is already some error in the RHS, just return it. Anything |
||
611 | * else will lead to an avalanche of error message back to the user. |
||
612 | */ |
||
613 | if (rhs_type->is_error()) |
||
614 | return rhs; |
||
615 | |||
616 | /* If the types are identical, the assignment can trivially proceed. |
||
617 | */ |
||
618 | if (rhs_type == lhs_type) |
||
619 | return rhs; |
||
620 | |||
621 | /* If the array element types are the same and the size of the LHS is zero, |
||
622 | * the assignment is okay. |
||
623 | * |
||
624 | * Note: Whole-array assignments are not permitted in GLSL 1.10, but this |
||
625 | * is handled by ir_dereference::is_lvalue. |
||
626 | */ |
||
627 | if (lhs_type->is_array() && rhs->type->is_array() |
||
628 | && (lhs_type->element_type() == rhs->type->element_type()) |
||
629 | && (lhs_type->array_size() == 0)) { |
||
630 | return rhs; |
||
631 | } |
||
632 | |||
633 | /* Check for implicit conversion in GLSL 1.20 */ |
||
634 | if (apply_implicit_conversion(lhs_type, rhs, state)) { |
||
635 | rhs_type = rhs->type; |
||
636 | if (rhs_type == lhs_type) |
||
637 | return rhs; |
||
638 | } |
||
639 | |||
640 | return NULL; |
||
641 | } |
||
642 | |||
643 | ir_rvalue * |
||
644 | do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, |
||
645 | ir_rvalue *lhs, ir_rvalue *rhs, |
||
646 | YYLTYPE lhs_loc) |
||
647 | { |
||
648 | void *ctx = state; |
||
649 | bool error_emitted = (lhs->type->is_error() || rhs->type->is_error()); |
||
650 | |||
651 | if (!error_emitted) { |
||
652 | if (!lhs->is_lvalue()) { |
||
653 | _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment"); |
||
654 | error_emitted = true; |
||
655 | } |
||
656 | |||
657 | if (state->es_shader && lhs->type->is_array()) { |
||
658 | _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not " |
||
659 | "allowed in GLSL ES 1.00."); |
||
660 | error_emitted = true; |
||
661 | } |
||
662 | } |
||
663 | |||
664 | ir_rvalue *new_rhs = validate_assignment(state, lhs->type, rhs); |
||
665 | if (new_rhs == NULL) { |
||
666 | _mesa_glsl_error(& lhs_loc, state, "type mismatch"); |
||
667 | } else { |
||
668 | rhs = new_rhs; |
||
669 | |||
670 | /* If the LHS array was not declared with a size, it takes it size from |
||
671 | * the RHS. If the LHS is an l-value and a whole array, it must be a |
||
672 | * dereference of a variable. Any other case would require that the LHS |
||
673 | * is either not an l-value or not a whole array. |
||
674 | */ |
||
675 | if (lhs->type->array_size() == 0) { |
||
676 | ir_dereference *const d = lhs->as_dereference(); |
||
677 | |||
678 | assert(d != NULL); |
||
679 | |||
680 | ir_variable *const var = d->variable_referenced(); |
||
681 | |||
682 | assert(var != NULL); |
||
683 | |||
684 | if (var->max_array_access >= unsigned(rhs->type->array_size())) { |
||
685 | /* FINISHME: This should actually log the location of the RHS. */ |
||
686 | _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to " |
||
687 | "previous access", |
||
688 | var->max_array_access); |
||
689 | } |
||
690 | |||
691 | var->type = glsl_type::get_array_instance(lhs->type->element_type(), |
||
692 | rhs->type->array_size()); |
||
693 | d->type = var->type; |
||
694 | } |
||
695 | } |
||
696 | |||
697 | /* Most callers of do_assignment (assign, add_assign, pre_inc/dec, |
||
698 | * but not post_inc) need the converted assigned value as an rvalue |
||
699 | * to handle things like: |
||
700 | * |
||
701 | * i = j += 1; |
||
702 | * |
||
703 | * So we always just store the computed value being assigned to a |
||
704 | * temporary and return a deref of that temporary. If the rvalue |
||
705 | * ends up not being used, the temp will get copy-propagated out. |
||
706 | */ |
||
707 | ir_variable *var = new(ctx) ir_variable(rhs->type, "assignment_tmp", |
||
708 | ir_var_temporary); |
||
709 | ir_dereference_variable *deref_var = new(ctx) ir_dereference_variable(var); |
||
710 | instructions->push_tail(var); |
||
711 | instructions->push_tail(new(ctx) ir_assignment(deref_var, |
||
712 | rhs, |
||
713 | NULL)); |
||
714 | deref_var = new(ctx) ir_dereference_variable(var); |
||
715 | |||
716 | if (!error_emitted) |
||
717 | instructions->push_tail(new(ctx) ir_assignment(lhs, deref_var, NULL)); |
||
718 | |||
719 | return new(ctx) ir_dereference_variable(var); |
||
720 | } |
||
721 | |||
722 | static ir_rvalue * |
||
723 | get_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue) |
||
724 | { |
||
725 | void *ctx = ralloc_parent(lvalue); |
||
726 | ir_variable *var; |
||
727 | |||
728 | var = new(ctx) ir_variable(lvalue->type, "_post_incdec_tmp", |
||
729 | ir_var_temporary); |
||
730 | instructions->push_tail(var); |
||
731 | var->mode = ir_var_auto; |
||
732 | |||
733 | instructions->push_tail(new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var), |
||
734 | lvalue, NULL)); |
||
735 | |||
736 | /* Once we've created this temporary, mark it read only so it's no |
||
737 | * longer considered an lvalue. |
||
738 | */ |
||
739 | var->read_only = true; |
||
740 | |||
741 | return new(ctx) ir_dereference_variable(var); |
||
742 | } |
||
743 | |||
744 | |||
745 | ir_rvalue * |
||
746 | ast_node::hir(exec_list *instructions, |
||
747 | struct _mesa_glsl_parse_state *state) |
||
748 | { |
||
749 | (void) instructions; |
||
750 | (void) state; |
||
751 | |||
752 | return NULL; |
||
753 | } |
||
754 | |||
755 | static void |
||
756 | mark_whole_array_access(ir_rvalue *access) |
||
757 | { |
||
758 | ir_dereference_variable *deref = access->as_dereference_variable(); |
||
759 | |||
760 | if (deref) { |
||
761 | deref->var->max_array_access = deref->type->length - 1; |
||
762 | } |
||
763 | } |
||
764 | |||
765 | static ir_rvalue * |
||
766 | do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) |
||
767 | { |
||
768 | int join_op; |
||
769 | ir_rvalue *cmp = NULL; |
||
770 | |||
771 | if (operation == ir_binop_all_equal) |
||
772 | join_op = ir_binop_logic_and; |
||
773 | else |
||
774 | join_op = ir_binop_logic_or; |
||
775 | |||
776 | switch (op0->type->base_type) { |
||
777 | case GLSL_TYPE_FLOAT: |
||
778 | case GLSL_TYPE_UINT: |
||
779 | case GLSL_TYPE_INT: |
||
780 | case GLSL_TYPE_BOOL: |
||
781 | return new(mem_ctx) ir_expression(operation, op0, op1); |
||
782 | |||
783 | case GLSL_TYPE_ARRAY: { |
||
784 | for (unsigned int i = 0; i < op0->type->length; i++) { |
||
785 | ir_rvalue *e0, *e1, *result; |
||
786 | |||
787 | e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL), |
||
788 | new(mem_ctx) ir_constant(i)); |
||
789 | e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL), |
||
790 | new(mem_ctx) ir_constant(i)); |
||
791 | result = do_comparison(mem_ctx, operation, e0, e1); |
||
792 | |||
793 | if (cmp) { |
||
794 | cmp = new(mem_ctx) ir_expression(join_op, cmp, result); |
||
795 | } else { |
||
796 | cmp = result; |
||
797 | } |
||
798 | } |
||
799 | |||
800 | mark_whole_array_access(op0); |
||
801 | mark_whole_array_access(op1); |
||
802 | break; |
||
803 | } |
||
804 | |||
805 | case GLSL_TYPE_STRUCT: { |
||
806 | for (unsigned int i = 0; i < op0->type->length; i++) { |
||
807 | ir_rvalue *e0, *e1, *result; |
||
808 | const char *field_name = op0->type->fields.structure[i].name; |
||
809 | |||
810 | e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL), |
||
811 | field_name); |
||
812 | e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL), |
||
813 | field_name); |
||
814 | result = do_comparison(mem_ctx, operation, e0, e1); |
||
815 | |||
816 | if (cmp) { |
||
817 | cmp = new(mem_ctx) ir_expression(join_op, cmp, result); |
||
818 | } else { |
||
819 | cmp = result; |
||
820 | } |
||
821 | } |
||
822 | break; |
||
823 | } |
||
824 | |||
825 | case GLSL_TYPE_ERROR: |
||
826 | case GLSL_TYPE_VOID: |
||
827 | case GLSL_TYPE_SAMPLER: |
||
828 | /* I assume a comparison of a struct containing a sampler just |
||
829 | * ignores the sampler present in the type. |
||
830 | */ |
||
831 | break; |
||
832 | |||
833 | default: |
||
834 | assert(!"Should not get here."); |
||
835 | break; |
||
836 | } |
||
837 | |||
838 | if (cmp == NULL) |
||
839 | cmp = new(mem_ctx) ir_constant(true); |
||
840 | |||
841 | return cmp; |
||
842 | } |
||
843 | |||
844 | ir_rvalue * |
||
845 | ast_expression::hir(exec_list *instructions, |
||
846 | struct _mesa_glsl_parse_state *state) |
||
847 | { |
||
848 | void *ctx = state; |
||
849 | static const int operations[AST_NUM_OPERATORS] = { |
||
850 | -1, /* ast_assign doesn't convert to ir_expression. */ |
||
851 | -1, /* ast_plus doesn't convert to ir_expression. */ |
||
852 | ir_unop_neg, |
||
853 | ir_binop_add, |
||
854 | ir_binop_sub, |
||
855 | ir_binop_mul, |
||
856 | ir_binop_div, |
||
857 | ir_binop_mod, |
||
858 | ir_binop_lshift, |
||
859 | ir_binop_rshift, |
||
860 | ir_binop_less, |
||
861 | ir_binop_greater, |
||
862 | ir_binop_lequal, |
||
863 | ir_binop_gequal, |
||
864 | ir_binop_all_equal, |
||
865 | ir_binop_any_nequal, |
||
866 | ir_binop_bit_and, |
||
867 | ir_binop_bit_xor, |
||
868 | ir_binop_bit_or, |
||
869 | ir_unop_bit_not, |
||
870 | ir_binop_logic_and, |
||
871 | ir_binop_logic_xor, |
||
872 | ir_binop_logic_or, |
||
873 | ir_unop_logic_not, |
||
874 | |||
875 | /* Note: The following block of expression types actually convert |
||
876 | * to multiple IR instructions. |
||
877 | */ |
||
878 | ir_binop_mul, /* ast_mul_assign */ |
||
879 | ir_binop_div, /* ast_div_assign */ |
||
880 | ir_binop_mod, /* ast_mod_assign */ |
||
881 | ir_binop_add, /* ast_add_assign */ |
||
882 | ir_binop_sub, /* ast_sub_assign */ |
||
883 | ir_binop_lshift, /* ast_ls_assign */ |
||
884 | ir_binop_rshift, /* ast_rs_assign */ |
||
885 | ir_binop_bit_and, /* ast_and_assign */ |
||
886 | ir_binop_bit_xor, /* ast_xor_assign */ |
||
887 | ir_binop_bit_or, /* ast_or_assign */ |
||
888 | |||
889 | -1, /* ast_conditional doesn't convert to ir_expression. */ |
||
890 | ir_binop_add, /* ast_pre_inc. */ |
||
891 | ir_binop_sub, /* ast_pre_dec. */ |
||
892 | ir_binop_add, /* ast_post_inc. */ |
||
893 | ir_binop_sub, /* ast_post_dec. */ |
||
894 | -1, /* ast_field_selection doesn't conv to ir_expression. */ |
||
895 | -1, /* ast_array_index doesn't convert to ir_expression. */ |
||
896 | -1, /* ast_function_call doesn't conv to ir_expression. */ |
||
897 | -1, /* ast_identifier doesn't convert to ir_expression. */ |
||
898 | -1, /* ast_int_constant doesn't convert to ir_expression. */ |
||
899 | -1, /* ast_uint_constant doesn't conv to ir_expression. */ |
||
900 | -1, /* ast_float_constant doesn't conv to ir_expression. */ |
||
901 | -1, /* ast_bool_constant doesn't conv to ir_expression. */ |
||
902 | -1, /* ast_sequence doesn't convert to ir_expression. */ |
||
903 | }; |
||
904 | ir_rvalue *result = NULL; |
||
905 | ir_rvalue *op[3]; |
||
906 | const struct glsl_type *type = glsl_type::error_type; |
||
907 | bool error_emitted = false; |
||
908 | YYLTYPE loc; |
||
909 | |||
910 | loc = this->get_location(); |
||
911 | |||
912 | switch (this->oper) { |
||
913 | case ast_assign: { |
||
914 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
915 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
916 | |||
917 | result = do_assignment(instructions, state, op[0], op[1], |
||
918 | this->subexpressions[0]->get_location()); |
||
919 | error_emitted = result->type->is_error(); |
||
920 | type = result->type; |
||
921 | break; |
||
922 | } |
||
923 | |||
924 | case ast_plus: |
||
925 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
926 | |||
927 | type = unary_arithmetic_result_type(op[0]->type, state, & loc); |
||
928 | |||
929 | error_emitted = type->is_error(); |
||
930 | |||
931 | result = op[0]; |
||
932 | break; |
||
933 | |||
934 | case ast_neg: |
||
935 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
936 | |||
937 | type = unary_arithmetic_result_type(op[0]->type, state, & loc); |
||
938 | |||
939 | error_emitted = type->is_error(); |
||
940 | |||
941 | result = new(ctx) ir_expression(operations[this->oper], type, |
||
942 | op[0], NULL); |
||
943 | break; |
||
944 | |||
945 | case ast_add: |
||
946 | case ast_sub: |
||
947 | case ast_mul: |
||
948 | case ast_div: |
||
949 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
950 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
951 | |||
952 | type = arithmetic_result_type(op[0], op[1], |
||
953 | (this->oper == ast_mul), |
||
954 | state, & loc); |
||
955 | error_emitted = type->is_error(); |
||
956 | |||
957 | result = new(ctx) ir_expression(operations[this->oper], type, |
||
958 | op[0], op[1]); |
||
959 | break; |
||
960 | |||
961 | case ast_mod: |
||
962 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
963 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
964 | |||
965 | type = modulus_result_type(op[0]->type, op[1]->type, state, & loc); |
||
966 | |||
967 | assert(operations[this->oper] == ir_binop_mod); |
||
968 | |||
969 | result = new(ctx) ir_expression(operations[this->oper], type, |
||
970 | op[0], op[1]); |
||
971 | error_emitted = type->is_error(); |
||
972 | break; |
||
973 | |||
974 | case ast_lshift: |
||
975 | case ast_rshift: |
||
976 | if (state->language_version < 130) { |
||
977 | _mesa_glsl_error(&loc, state, "operator %s requires GLSL 1.30", |
||
978 | operator_string(this->oper)); |
||
979 | error_emitted = true; |
||
980 | } |
||
981 | |||
982 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
983 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
984 | type = shift_result_type(op[0]->type, op[1]->type, this->oper, state, |
||
985 | &loc); |
||
986 | result = new(ctx) ir_expression(operations[this->oper], type, |
||
987 | op[0], op[1]); |
||
988 | error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); |
||
989 | break; |
||
990 | |||
991 | case ast_less: |
||
992 | case ast_greater: |
||
993 | case ast_lequal: |
||
994 | case ast_gequal: |
||
995 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
996 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
997 | |||
998 | type = relational_result_type(op[0], op[1], state, & loc); |
||
999 | |||
1000 | /* The relational operators must either generate an error or result |
||
1001 | * in a scalar boolean. See page 57 of the GLSL 1.50 spec. |
||
1002 | */ |
||
1003 | assert(type->is_error() |
||
1004 | || ((type->base_type == GLSL_TYPE_BOOL) |
||
1005 | && type->is_scalar())); |
||
1006 | |||
1007 | result = new(ctx) ir_expression(operations[this->oper], type, |
||
1008 | op[0], op[1]); |
||
1009 | error_emitted = type->is_error(); |
||
1010 | break; |
||
1011 | |||
1012 | case ast_nequal: |
||
1013 | case ast_equal: |
||
1014 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1015 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1016 | |||
1017 | /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec: |
||
1018 | * |
||
1019 | * "The equality operators equal (==), and not equal (!=) |
||
1020 | * operate on all types. They result in a scalar Boolean. If |
||
1021 | * the operand types do not match, then there must be a |
||
1022 | * conversion from Section 4.1.10 "Implicit Conversions" |
||
1023 | * applied to one operand that can make them match, in which |
||
1024 | * case this conversion is done." |
||
1025 | */ |
||
1026 | if ((!apply_implicit_conversion(op[0]->type, op[1], state) |
||
1027 | && !apply_implicit_conversion(op[1]->type, op[0], state)) |
||
1028 | || (op[0]->type != op[1]->type)) { |
||
1029 | _mesa_glsl_error(& loc, state, "operands of `%s' must have the same " |
||
1030 | "type", (this->oper == ast_equal) ? "==" : "!="); |
||
1031 | error_emitted = true; |
||
1032 | } else if ((state->language_version <= 110) |
||
1033 | && (op[0]->type->is_array() || op[1]->type->is_array())) { |
||
1034 | _mesa_glsl_error(& loc, state, "array comparisons forbidden in " |
||
1035 | "GLSL 1.10"); |
||
1036 | error_emitted = true; |
||
1037 | } |
||
1038 | |||
1039 | result = do_comparison(ctx, operations[this->oper], op[0], op[1]); |
||
1040 | type = glsl_type::bool_type; |
||
1041 | |||
1042 | assert(error_emitted || (result->type == glsl_type::bool_type)); |
||
1043 | break; |
||
1044 | |||
1045 | case ast_bit_and: |
||
1046 | case ast_bit_xor: |
||
1047 | case ast_bit_or: |
||
1048 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1049 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1050 | type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper, |
||
1051 | state, &loc); |
||
1052 | result = new(ctx) ir_expression(operations[this->oper], type, |
||
1053 | op[0], op[1]); |
||
1054 | error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); |
||
1055 | break; |
||
1056 | |||
1057 | case ast_bit_not: |
||
1058 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1059 | |||
1060 | if (state->language_version < 130) { |
||
1061 | _mesa_glsl_error(&loc, state, "bit-wise operations require GLSL 1.30"); |
||
1062 | error_emitted = true; |
||
1063 | } |
||
1064 | |||
1065 | if (!op[0]->type->is_integer()) { |
||
1066 | _mesa_glsl_error(&loc, state, "operand of `~' must be an integer"); |
||
1067 | error_emitted = true; |
||
1068 | } |
||
1069 | |||
1070 | type = op[0]->type; |
||
1071 | result = new(ctx) ir_expression(ir_unop_bit_not, type, op[0], NULL); |
||
1072 | break; |
||
1073 | |||
1074 | case ast_logic_and: { |
||
1075 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1076 | |||
1077 | if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) { |
||
1078 | YYLTYPE loc = this->subexpressions[0]->get_location(); |
||
1079 | |||
1080 | _mesa_glsl_error(& loc, state, "LHS of `%s' must be scalar boolean", |
||
1081 | operator_string(this->oper)); |
||
1082 | error_emitted = true; |
||
1083 | } |
||
1084 | |||
1085 | ir_constant *op0_const = op[0]->constant_expression_value(); |
||
1086 | if (op0_const) { |
||
1087 | if (op0_const->value.b[0]) { |
||
1088 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1089 | |||
1090 | if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) { |
||
1091 | YYLTYPE loc = this->subexpressions[1]->get_location(); |
||
1092 | |||
1093 | _mesa_glsl_error(& loc, state, |
||
1094 | "RHS of `%s' must be scalar boolean", |
||
1095 | operator_string(this->oper)); |
||
1096 | error_emitted = true; |
||
1097 | } |
||
1098 | result = op[1]; |
||
1099 | } else { |
||
1100 | result = op0_const; |
||
1101 | } |
||
1102 | type = glsl_type::bool_type; |
||
1103 | } else { |
||
1104 | ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, |
||
1105 | "and_tmp", |
||
1106 | ir_var_temporary); |
||
1107 | instructions->push_tail(tmp); |
||
1108 | |||
1109 | ir_if *const stmt = new(ctx) ir_if(op[0]); |
||
1110 | instructions->push_tail(stmt); |
||
1111 | |||
1112 | op[1] = this->subexpressions[1]->hir(&stmt->then_instructions, state); |
||
1113 | |||
1114 | if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) { |
||
1115 | YYLTYPE loc = this->subexpressions[1]->get_location(); |
||
1116 | |||
1117 | _mesa_glsl_error(& loc, state, |
||
1118 | "RHS of `%s' must be scalar boolean", |
||
1119 | operator_string(this->oper)); |
||
1120 | error_emitted = true; |
||
1121 | } |
||
1122 | |||
1123 | ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); |
||
1124 | ir_assignment *const then_assign = |
||
1125 | new(ctx) ir_assignment(then_deref, op[1], NULL); |
||
1126 | stmt->then_instructions.push_tail(then_assign); |
||
1127 | |||
1128 | ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); |
||
1129 | ir_assignment *const else_assign = |
||
1130 | new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false), NULL); |
||
1131 | stmt->else_instructions.push_tail(else_assign); |
||
1132 | |||
1133 | result = new(ctx) ir_dereference_variable(tmp); |
||
1134 | type = tmp->type; |
||
1135 | } |
||
1136 | break; |
||
1137 | } |
||
1138 | |||
1139 | case ast_logic_or: { |
||
1140 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1141 | |||
1142 | if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) { |
||
1143 | YYLTYPE loc = this->subexpressions[0]->get_location(); |
||
1144 | |||
1145 | _mesa_glsl_error(& loc, state, "LHS of `%s' must be scalar boolean", |
||
1146 | operator_string(this->oper)); |
||
1147 | error_emitted = true; |
||
1148 | } |
||
1149 | |||
1150 | ir_constant *op0_const = op[0]->constant_expression_value(); |
||
1151 | if (op0_const) { |
||
1152 | if (op0_const->value.b[0]) { |
||
1153 | result = op0_const; |
||
1154 | } else { |
||
1155 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1156 | |||
1157 | if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) { |
||
1158 | YYLTYPE loc = this->subexpressions[1]->get_location(); |
||
1159 | |||
1160 | _mesa_glsl_error(& loc, state, |
||
1161 | "RHS of `%s' must be scalar boolean", |
||
1162 | operator_string(this->oper)); |
||
1163 | error_emitted = true; |
||
1164 | } |
||
1165 | result = op[1]; |
||
1166 | } |
||
1167 | type = glsl_type::bool_type; |
||
1168 | } else { |
||
1169 | ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, |
||
1170 | "or_tmp", |
||
1171 | ir_var_temporary); |
||
1172 | instructions->push_tail(tmp); |
||
1173 | |||
1174 | ir_if *const stmt = new(ctx) ir_if(op[0]); |
||
1175 | instructions->push_tail(stmt); |
||
1176 | |||
1177 | op[1] = this->subexpressions[1]->hir(&stmt->else_instructions, state); |
||
1178 | |||
1179 | if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) { |
||
1180 | YYLTYPE loc = this->subexpressions[1]->get_location(); |
||
1181 | |||
1182 | _mesa_glsl_error(& loc, state, "RHS of `%s' must be scalar boolean", |
||
1183 | operator_string(this->oper)); |
||
1184 | error_emitted = true; |
||
1185 | } |
||
1186 | |||
1187 | ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); |
||
1188 | ir_assignment *const then_assign = |
||
1189 | new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true), NULL); |
||
1190 | stmt->then_instructions.push_tail(then_assign); |
||
1191 | |||
1192 | ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); |
||
1193 | ir_assignment *const else_assign = |
||
1194 | new(ctx) ir_assignment(else_deref, op[1], NULL); |
||
1195 | stmt->else_instructions.push_tail(else_assign); |
||
1196 | |||
1197 | result = new(ctx) ir_dereference_variable(tmp); |
||
1198 | type = tmp->type; |
||
1199 | } |
||
1200 | break; |
||
1201 | } |
||
1202 | |||
1203 | case ast_logic_xor: |
||
1204 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1205 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1206 | |||
1207 | |||
1208 | result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, |
||
1209 | op[0], op[1]); |
||
1210 | type = glsl_type::bool_type; |
||
1211 | break; |
||
1212 | |||
1213 | case ast_logic_not: |
||
1214 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1215 | |||
1216 | if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) { |
||
1217 | YYLTYPE loc = this->subexpressions[0]->get_location(); |
||
1218 | |||
1219 | _mesa_glsl_error(& loc, state, |
||
1220 | "operand of `!' must be scalar boolean"); |
||
1221 | error_emitted = true; |
||
1222 | } |
||
1223 | |||
1224 | result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, |
||
1225 | op[0], NULL); |
||
1226 | type = glsl_type::bool_type; |
||
1227 | break; |
||
1228 | |||
1229 | case ast_mul_assign: |
||
1230 | case ast_div_assign: |
||
1231 | case ast_add_assign: |
||
1232 | case ast_sub_assign: { |
||
1233 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1234 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1235 | |||
1236 | type = arithmetic_result_type(op[0], op[1], |
||
1237 | (this->oper == ast_mul_assign), |
||
1238 | state, & loc); |
||
1239 | |||
1240 | ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], type, |
||
1241 | op[0], op[1]); |
||
1242 | |||
1243 | result = do_assignment(instructions, state, |
||
1244 | op[0]->clone(ctx, NULL), temp_rhs, |
||
1245 | this->subexpressions[0]->get_location()); |
||
1246 | type = result->type; |
||
1247 | error_emitted = (op[0]->type->is_error()); |
||
1248 | |||
1249 | /* GLSL 1.10 does not allow array assignment. However, we don't have to |
||
1250 | * explicitly test for this because none of the binary expression |
||
1251 | * operators allow array operands either. |
||
1252 | */ |
||
1253 | |||
1254 | break; |
||
1255 | } |
||
1256 | |||
1257 | case ast_mod_assign: { |
||
1258 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1259 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1260 | |||
1261 | type = modulus_result_type(op[0]->type, op[1]->type, state, & loc); |
||
1262 | |||
1263 | assert(operations[this->oper] == ir_binop_mod); |
||
1264 | |||
1265 | ir_rvalue *temp_rhs; |
||
1266 | temp_rhs = new(ctx) ir_expression(operations[this->oper], type, |
||
1267 | op[0], op[1]); |
||
1268 | |||
1269 | result = do_assignment(instructions, state, |
||
1270 | op[0]->clone(ctx, NULL), temp_rhs, |
||
1271 | this->subexpressions[0]->get_location()); |
||
1272 | type = result->type; |
||
1273 | error_emitted = type->is_error(); |
||
1274 | break; |
||
1275 | } |
||
1276 | |||
1277 | case ast_ls_assign: |
||
1278 | case ast_rs_assign: { |
||
1279 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1280 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1281 | type = shift_result_type(op[0]->type, op[1]->type, this->oper, state, |
||
1282 | &loc); |
||
1283 | ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], |
||
1284 | type, op[0], op[1]); |
||
1285 | result = do_assignment(instructions, state, op[0]->clone(ctx, NULL), |
||
1286 | temp_rhs, |
||
1287 | this->subexpressions[0]->get_location()); |
||
1288 | error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); |
||
1289 | break; |
||
1290 | } |
||
1291 | |||
1292 | case ast_and_assign: |
||
1293 | case ast_xor_assign: |
||
1294 | case ast_or_assign: { |
||
1295 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1296 | op[1] = this->subexpressions[1]->hir(instructions, state); |
||
1297 | type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper, |
||
1298 | state, &loc); |
||
1299 | ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], |
||
1300 | type, op[0], op[1]); |
||
1301 | result = do_assignment(instructions, state, op[0]->clone(ctx, NULL), |
||
1302 | temp_rhs, |
||
1303 | this->subexpressions[0]->get_location()); |
||
1304 | error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); |
||
1305 | break; |
||
1306 | } |
||
1307 | |||
1308 | case ast_conditional: { |
||
1309 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1310 | |||
1311 | /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: |
||
1312 | * |
||
1313 | * "The ternary selection operator (?:). It operates on three |
||
1314 | * expressions (exp1 ? exp2 : exp3). This operator evaluates the |
||
1315 | * first expression, which must result in a scalar Boolean." |
||
1316 | */ |
||
1317 | if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) { |
||
1318 | YYLTYPE loc = this->subexpressions[0]->get_location(); |
||
1319 | |||
1320 | _mesa_glsl_error(& loc, state, "?: condition must be scalar boolean"); |
||
1321 | error_emitted = true; |
||
1322 | } |
||
1323 | |||
1324 | /* The :? operator is implemented by generating an anonymous temporary |
||
1325 | * followed by an if-statement. The last instruction in each branch of |
||
1326 | * the if-statement assigns a value to the anonymous temporary. This |
||
1327 | * temporary is the r-value of the expression. |
||
1328 | */ |
||
1329 | exec_list then_instructions; |
||
1330 | exec_list else_instructions; |
||
1331 | |||
1332 | op[1] = this->subexpressions[1]->hir(&then_instructions, state); |
||
1333 | op[2] = this->subexpressions[2]->hir(&else_instructions, state); |
||
1334 | |||
1335 | /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: |
||
1336 | * |
||
1337 | * "The second and third expressions can be any type, as |
||
1338 | * long their types match, or there is a conversion in |
||
1339 | * Section 4.1.10 "Implicit Conversions" that can be applied |
||
1340 | * to one of the expressions to make their types match. This |
||
1341 | * resulting matching type is the type of the entire |
||
1342 | * expression." |
||
1343 | */ |
||
1344 | if ((!apply_implicit_conversion(op[1]->type, op[2], state) |
||
1345 | && !apply_implicit_conversion(op[2]->type, op[1], state)) |
||
1346 | || (op[1]->type != op[2]->type)) { |
||
1347 | YYLTYPE loc = this->subexpressions[1]->get_location(); |
||
1348 | |||
1349 | _mesa_glsl_error(& loc, state, "Second and third operands of ?: " |
||
1350 | "operator must have matching types."); |
||
1351 | error_emitted = true; |
||
1352 | type = glsl_type::error_type; |
||
1353 | } else { |
||
1354 | type = op[1]->type; |
||
1355 | } |
||
1356 | |||
1357 | /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec: |
||
1358 | * |
||
1359 | * "The second and third expressions must be the same type, but can |
||
1360 | * be of any type other than an array." |
||
1361 | */ |
||
1362 | if ((state->language_version <= 110) && type->is_array()) { |
||
1363 | _mesa_glsl_error(& loc, state, "Second and third operands of ?: " |
||
1364 | "operator must not be arrays."); |
||
1365 | error_emitted = true; |
||
1366 | } |
||
1367 | |||
1368 | ir_constant *cond_val = op[0]->constant_expression_value(); |
||
1369 | ir_constant *then_val = op[1]->constant_expression_value(); |
||
1370 | ir_constant *else_val = op[2]->constant_expression_value(); |
||
1371 | |||
1372 | if (then_instructions.is_empty() |
||
1373 | && else_instructions.is_empty() |
||
1374 | && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) { |
||
1375 | result = (cond_val->value.b[0]) ? then_val : else_val; |
||
1376 | } else { |
||
1377 | ir_variable *const tmp = |
||
1378 | new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary); |
||
1379 | instructions->push_tail(tmp); |
||
1380 | |||
1381 | ir_if *const stmt = new(ctx) ir_if(op[0]); |
||
1382 | instructions->push_tail(stmt); |
||
1383 | |||
1384 | then_instructions.move_nodes_to(& stmt->then_instructions); |
||
1385 | ir_dereference *const then_deref = |
||
1386 | new(ctx) ir_dereference_variable(tmp); |
||
1387 | ir_assignment *const then_assign = |
||
1388 | new(ctx) ir_assignment(then_deref, op[1], NULL); |
||
1389 | stmt->then_instructions.push_tail(then_assign); |
||
1390 | |||
1391 | else_instructions.move_nodes_to(& stmt->else_instructions); |
||
1392 | ir_dereference *const else_deref = |
||
1393 | new(ctx) ir_dereference_variable(tmp); |
||
1394 | ir_assignment *const else_assign = |
||
1395 | new(ctx) ir_assignment(else_deref, op[2], NULL); |
||
1396 | stmt->else_instructions.push_tail(else_assign); |
||
1397 | |||
1398 | result = new(ctx) ir_dereference_variable(tmp); |
||
1399 | } |
||
1400 | break; |
||
1401 | } |
||
1402 | |||
1403 | case ast_pre_inc: |
||
1404 | case ast_pre_dec: { |
||
1405 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1406 | if (op[0]->type->base_type == GLSL_TYPE_FLOAT) |
||
1407 | op[1] = new(ctx) ir_constant(1.0f); |
||
1408 | else |
||
1409 | op[1] = new(ctx) ir_constant(1); |
||
1410 | |||
1411 | type = arithmetic_result_type(op[0], op[1], false, state, & loc); |
||
1412 | |||
1413 | ir_rvalue *temp_rhs; |
||
1414 | temp_rhs = new(ctx) ir_expression(operations[this->oper], type, |
||
1415 | op[0], op[1]); |
||
1416 | |||
1417 | result = do_assignment(instructions, state, |
||
1418 | op[0]->clone(ctx, NULL), temp_rhs, |
||
1419 | this->subexpressions[0]->get_location()); |
||
1420 | type = result->type; |
||
1421 | error_emitted = op[0]->type->is_error(); |
||
1422 | break; |
||
1423 | } |
||
1424 | |||
1425 | case ast_post_inc: |
||
1426 | case ast_post_dec: { |
||
1427 | op[0] = this->subexpressions[0]->hir(instructions, state); |
||
1428 | if (op[0]->type->base_type == GLSL_TYPE_FLOAT) |
||
1429 | op[1] = new(ctx) ir_constant(1.0f); |
||
1430 | else |
||
1431 | op[1] = new(ctx) ir_constant(1); |
||
1432 | |||
1433 | error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); |
||
1434 | |||
1435 | type = arithmetic_result_type(op[0], op[1], false, state, & loc); |
||
1436 | |||
1437 | ir_rvalue *temp_rhs; |
||
1438 | temp_rhs = new(ctx) ir_expression(operations[this->oper], type, |
||
1439 | op[0], op[1]); |
||
1440 | |||
1441 | /* Get a temporary of a copy of the lvalue before it's modified. |
||
1442 | * This may get thrown away later. |
||
1443 | */ |
||
1444 | result = get_lvalue_copy(instructions, op[0]->clone(ctx, NULL)); |
||
1445 | |||
1446 | (void)do_assignment(instructions, state, |
||
1447 | op[0]->clone(ctx, NULL), temp_rhs, |
||
1448 | this->subexpressions[0]->get_location()); |
||
1449 | |||
1450 | type = result->type; |
||
1451 | error_emitted = op[0]->type->is_error(); |
||
1452 | break; |
||
1453 | } |
||
1454 | |||
1455 | case ast_field_selection: |
||
1456 | result = _mesa_ast_field_selection_to_hir(this, instructions, state); |
||
1457 | type = result->type; |
||
1458 | break; |
||
1459 | |||
1460 | case ast_array_index: { |
||
1461 | YYLTYPE index_loc = subexpressions[1]->get_location(); |
||
1462 | |||
1463 | op[0] = subexpressions[0]->hir(instructions, state); |
||
1464 | op[1] = subexpressions[1]->hir(instructions, state); |
||
1465 | |||
1466 | error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); |
||
1467 | |||
1468 | ir_rvalue *const array = op[0]; |
||
1469 | |||
1470 | result = new(ctx) ir_dereference_array(op[0], op[1]); |
||
1471 | |||
1472 | /* Do not use op[0] after this point. Use array. |
||
1473 | */ |
||
1474 | op[0] = NULL; |
||
1475 | |||
1476 | |||
1477 | if (error_emitted) |
||
1478 | break; |
||
1479 | |||
1480 | if (!array->type->is_array() |
||
1481 | && !array->type->is_matrix() |
||
1482 | && !array->type->is_vector()) { |
||
1483 | _mesa_glsl_error(& index_loc, state, |
||
1484 | "cannot dereference non-array / non-matrix / " |
||
1485 | "non-vector"); |
||
1486 | error_emitted = true; |
||
1487 | } |
||
1488 | |||
1489 | if (!op[1]->type->is_integer()) { |
||
1490 | _mesa_glsl_error(& index_loc, state, |
||
1491 | "array index must be integer type"); |
||
1492 | error_emitted = true; |
||
1493 | } else if (!op[1]->type->is_scalar()) { |
||
1494 | _mesa_glsl_error(& index_loc, state, |
||
1495 | "array index must be scalar"); |
||
1496 | error_emitted = true; |
||
1497 | } |
||
1498 | |||
1499 | /* If the array index is a constant expression and the array has a |
||
1500 | * declared size, ensure that the access is in-bounds. If the array |
||
1501 | * index is not a constant expression, ensure that the array has a |
||
1502 | * declared size. |
||
1503 | */ |
||
1504 | ir_constant *const const_index = op[1]->constant_expression_value(); |
||
1505 | if (const_index != NULL) { |
||
1506 | const int idx = const_index->value.i[0]; |
||
1507 | const char *type_name; |
||
1508 | unsigned bound = 0; |
||
1509 | |||
1510 | if (array->type->is_matrix()) { |
||
1511 | type_name = "matrix"; |
||
1512 | } else if (array->type->is_vector()) { |
||
1513 | type_name = "vector"; |
||
1514 | } else { |
||
1515 | type_name = "array"; |
||
1516 | } |
||
1517 | |||
1518 | /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec: |
||
1519 | * |
||
1520 | * "It is illegal to declare an array with a size, and then |
||
1521 | * later (in the same shader) index the same array with an |
||
1522 | * integral constant expression greater than or equal to the |
||
1523 | * declared size. It is also illegal to index an array with a |
||
1524 | * negative constant expression." |
||
1525 | */ |
||
1526 | if (array->type->is_matrix()) { |
||
1527 | if (array->type->row_type()->vector_elements <= idx) { |
||
1528 | bound = array->type->row_type()->vector_elements; |
||
1529 | } |
||
1530 | } else if (array->type->is_vector()) { |
||
1531 | if (array->type->vector_elements <= idx) { |
||
1532 | bound = array->type->vector_elements; |
||
1533 | } |
||
1534 | } else { |
||
1535 | if ((array->type->array_size() > 0) |
||
1536 | && (array->type->array_size() <= idx)) { |
||
1537 | bound = array->type->array_size(); |
||
1538 | } |
||
1539 | } |
||
1540 | |||
1541 | if (bound > 0) { |
||
1542 | _mesa_glsl_error(& loc, state, "%s index must be < %u", |
||
1543 | type_name, bound); |
||
1544 | error_emitted = true; |
||
1545 | } else if (idx < 0) { |
||
1546 | _mesa_glsl_error(& loc, state, "%s index must be >= 0", |
||
1547 | type_name); |
||
1548 | error_emitted = true; |
||
1549 | } |
||
1550 | |||
1551 | if (array->type->is_array()) { |
||
1552 | /* If the array is a variable dereference, it dereferences the |
||
1553 | * whole array, by definition. Use this to get the variable. |
||
1554 | * |
||
1555 | * FINISHME: Should some methods for getting / setting / testing |
||
1556 | * FINISHME: array access limits be added to ir_dereference? |
||
1557 | */ |
||
1558 | ir_variable *const v = array->whole_variable_referenced(); |
||
1559 | if ((v != NULL) && (unsigned(idx) > v->max_array_access)) |
||
1560 | v->max_array_access = idx; |
||
1561 | } |
||
1562 | } else if (array->type->array_size() == 0) { |
||
1563 | _mesa_glsl_error(&loc, state, "unsized array index must be constant"); |
||
1564 | } else { |
||
1565 | if (array->type->is_array()) { |
||
1566 | /* whole_variable_referenced can return NULL if the array is a |
||
1567 | * member of a structure. In this case it is safe to not update |
||
1568 | * the max_array_access field because it is never used for fields |
||
1569 | * of structures. |
||
1570 | */ |
||
1571 | ir_variable *v = array->whole_variable_referenced(); |
||
1572 | if (v != NULL) |
||
1573 | v->max_array_access = array->type->array_size(); |
||
1574 | } |
||
1575 | } |
||
1576 | |||
1577 | /* From page 23 (29 of the PDF) of the GLSL 1.30 spec: |
||
1578 | * |
||
1579 | * "Samplers aggregated into arrays within a shader (using square |
||
1580 | * brackets [ ]) can only be indexed with integral constant |
||
1581 | * expressions [...]." |
||
1582 | * |
||
1583 | * This restriction was added in GLSL 1.30. Shaders using earlier version |
||
1584 | * of the language should not be rejected by the compiler front-end for |
||
1585 | * using this construct. This allows useful things such as using a loop |
||
1586 | * counter as the index to an array of samplers. If the loop in unrolled, |
||
1587 | * the code should compile correctly. Instead, emit a warning. |
||
1588 | */ |
||
1589 | if (array->type->is_array() && |
||
1590 | array->type->element_type()->is_sampler() && |
||
1591 | const_index == NULL) { |
||
1592 | |||
1593 | if (state->language_version == 100) { |
||
1594 | _mesa_glsl_warning(&loc, state, |
||
1595 | "sampler arrays indexed with non-constant " |
||
1596 | "expressions is optional in GLSL ES 1.00"); |
||
1597 | } else if (state->language_version < 130) { |
||
1598 | _mesa_glsl_warning(&loc, state, |
||
1599 | "sampler arrays indexed with non-constant " |
||
1600 | "expressions is forbidden in GLSL 1.30 and " |
||
1601 | "later"); |
||
1602 | } else { |
||
1603 | _mesa_glsl_error(&loc, state, |
||
1604 | "sampler arrays indexed with non-constant " |
||
1605 | "expressions is forbidden in GLSL 1.30 and " |
||
1606 | "later"); |
||
1607 | error_emitted = true; |
||
1608 | } |
||
1609 | } |
||
1610 | |||
1611 | if (error_emitted) |
||
1612 | result->type = glsl_type::error_type; |
||
1613 | |||
1614 | type = result->type; |
||
1615 | break; |
||
1616 | } |
||
1617 | |||
1618 | case ast_function_call: |
||
1619 | /* Should *NEVER* get here. ast_function_call should always be handled |
||
1620 | * by ast_function_expression::hir. |
||
1621 | */ |
||
1622 | assert(0); |
||
1623 | break; |
||
1624 | |||
1625 | case ast_identifier: { |
||
1626 | /* ast_identifier can appear several places in a full abstract syntax |
||
1627 | * tree. This particular use must be at location specified in the grammar |
||
1628 | * as 'variable_identifier'. |
||
1629 | */ |
||
1630 | ir_variable *var = |
||
1631 | state->symbols->get_variable(this->primary_expression.identifier); |
||
1632 | |||
1633 | result = new(ctx) ir_dereference_variable(var); |
||
1634 | |||
1635 | if (var != NULL) { |
||
1636 | var->used = true; |
||
1637 | type = result->type; |
||
1638 | } else { |
||
1639 | _mesa_glsl_error(& loc, state, "`%s' undeclared", |
||
1640 | this->primary_expression.identifier); |
||
1641 | |||
1642 | error_emitted = true; |
||
1643 | } |
||
1644 | break; |
||
1645 | } |
||
1646 | |||
1647 | case ast_int_constant: |
||
1648 | type = glsl_type::int_type; |
||
1649 | result = new(ctx) ir_constant(this->primary_expression.int_constant); |
||
1650 | break; |
||
1651 | |||
1652 | case ast_uint_constant: |
||
1653 | type = glsl_type::uint_type; |
||
1654 | result = new(ctx) ir_constant(this->primary_expression.uint_constant); |
||
1655 | break; |
||
1656 | |||
1657 | case ast_float_constant: |
||
1658 | type = glsl_type::float_type; |
||
1659 | result = new(ctx) ir_constant(this->primary_expression.float_constant); |
||
1660 | break; |
||
1661 | |||
1662 | case ast_bool_constant: |
||
1663 | type = glsl_type::bool_type; |
||
1664 | result = new(ctx) ir_constant(bool(this->primary_expression.bool_constant)); |
||
1665 | break; |
||
1666 | |||
1667 | case ast_sequence: { |
||
1668 | /* It should not be possible to generate a sequence in the AST without |
||
1669 | * any expressions in it. |
||
1670 | */ |
||
1671 | assert(!this->expressions.is_empty()); |
||
1672 | |||
1673 | /* The r-value of a sequence is the last expression in the sequence. If |
||
1674 | * the other expressions in the sequence do not have side-effects (and |
||
1675 | * therefore add instructions to the instruction list), they get dropped |
||
1676 | * on the floor. |
||
1677 | */ |
||
1678 | foreach_list_typed (ast_node, ast, link, &this->expressions) |
||
1679 | result = ast->hir(instructions, state); |
||
1680 | |||
1681 | type = result->type; |
||
1682 | |||
1683 | /* Any errors should have already been emitted in the loop above. |
||
1684 | */ |
||
1685 | error_emitted = true; |
||
1686 | break; |
||
1687 | } |
||
1688 | } |
||
1689 | |||
1690 | if (type->is_error() && !error_emitted) |
||
1691 | _mesa_glsl_error(& loc, state, "type mismatch"); |
||
1692 | |||
1693 | return result; |
||
1694 | } |
||
1695 | |||
1696 | |||
1697 | ir_rvalue * |
||
1698 | ast_expression_statement::hir(exec_list *instructions, |
||
1699 | struct _mesa_glsl_parse_state *state) |
||
1700 | { |
||
1701 | /* It is possible to have expression statements that don't have an |
||
1702 | * expression. This is the solitary semicolon: |
||
1703 | * |
||
1704 | * for (i = 0; i < 5; i++) |
||
1705 | * ; |
||
1706 | * |
||
1707 | * In this case the expression will be NULL. Test for NULL and don't do |
||
1708 | * anything in that case. |
||
1709 | */ |
||
1710 | if (expression != NULL) |
||
1711 | expression->hir(instructions, state); |
||
1712 | |||
1713 | /* Statements do not have r-values. |
||
1714 | */ |
||
1715 | return NULL; |
||
1716 | } |
||
1717 | |||
1718 | |||
1719 | ir_rvalue * |
||
1720 | ast_compound_statement::hir(exec_list *instructions, |
||
1721 | struct _mesa_glsl_parse_state *state) |
||
1722 | { |
||
1723 | if (new_scope) |
||
1724 | state->symbols->push_scope(); |
||
1725 | |||
1726 | foreach_list_typed (ast_node, ast, link, &this->statements) |
||
1727 | ast->hir(instructions, state); |
||
1728 | |||
1729 | if (new_scope) |
||
1730 | state->symbols->pop_scope(); |
||
1731 | |||
1732 | /* Compound statements do not have r-values. |
||
1733 | */ |
||
1734 | return NULL; |
||
1735 | } |
||
1736 | |||
1737 | |||
1738 | static const glsl_type * |
||
1739 | process_array_type(YYLTYPE *loc, const glsl_type *base, ast_node *array_size, |
||
1740 | struct _mesa_glsl_parse_state *state) |
||
1741 | { |
||
1742 | unsigned length = 0; |
||
1743 | |||
1744 | /* FINISHME: Reject delcarations of multidimensional arrays. */ |
||
1745 | |||
1746 | if (array_size != NULL) { |
||
1747 | exec_list dummy_instructions; |
||
1748 | ir_rvalue *const ir = array_size->hir(& dummy_instructions, state); |
||
1749 | YYLTYPE loc = array_size->get_location(); |
||
1750 | |||
1751 | /* FINISHME: Verify that the grammar forbids side-effects in array |
||
1752 | * FINISHME: sizes. i.e., 'vec4 [x = 12] data' |
||
1753 | */ |
||
1754 | assert(dummy_instructions.is_empty()); |
||
1755 | |||
1756 | if (ir != NULL) { |
||
1757 | if (!ir->type->is_integer()) { |
||
1758 | _mesa_glsl_error(& loc, state, "array size must be integer type"); |
||
1759 | } else if (!ir->type->is_scalar()) { |
||
1760 | _mesa_glsl_error(& loc, state, "array size must be scalar type"); |
||
1761 | } else { |
||
1762 | ir_constant *const size = ir->constant_expression_value(); |
||
1763 | |||
1764 | if (size == NULL) { |
||
1765 | _mesa_glsl_error(& loc, state, "array size must be a " |
||
1766 | "constant valued expression"); |
||
1767 | } else if (size->value.i[0] <= 0) { |
||
1768 | _mesa_glsl_error(& loc, state, "array size must be > 0"); |
||
1769 | } else { |
||
1770 | assert(size->type == ir->type); |
||
1771 | length = size->value.u[0]; |
||
1772 | } |
||
1773 | } |
||
1774 | } |
||
1775 | } else if (state->es_shader) { |
||
1776 | /* Section 10.17 of the GLSL ES 1.00 specification states that unsized |
||
1777 | * array declarations have been removed from the language. |
||
1778 | */ |
||
1779 | _mesa_glsl_error(loc, state, "unsized array declarations are not " |
||
1780 | "allowed in GLSL ES 1.00."); |
||
1781 | } |
||
1782 | |||
1783 | return glsl_type::get_array_instance(base, length); |
||
1784 | } |
||
1785 | |||
1786 | |||
1787 | const glsl_type * |
||
1788 | ast_type_specifier::glsl_type(const char **name, |
||
1789 | struct _mesa_glsl_parse_state *state) const |
||
1790 | { |
||
1791 | const struct glsl_type *type; |
||
1792 | |||
1793 | type = state->symbols->get_type(this->type_name); |
||
1794 | *name = this->type_name; |
||
1795 | |||
1796 | if (this->is_array) { |
||
1797 | YYLTYPE loc = this->get_location(); |
||
1798 | type = process_array_type(&loc, type, this->array_size, state); |
||
1799 | } |
||
1800 | |||
1801 | return type; |
||
1802 | } |
||
1803 | |||
1804 | |||
1805 | static void |
||
1806 | apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, |
||
1807 | ir_variable *var, |
||
1808 | struct _mesa_glsl_parse_state *state, |
||
1809 | YYLTYPE *loc) |
||
1810 | { |
||
1811 | if (qual->flags.q.invariant) { |
||
1812 | if (var->used) { |
||
1813 | _mesa_glsl_error(loc, state, |
||
1814 | "variable `%s' may not be redeclared " |
||
1815 | "`invariant' after being used", |
||
1816 | var->name); |
||
1817 | } else { |
||
1818 | var->invariant = 1; |
||
1819 | } |
||
1820 | } |
||
1821 | |||
1822 | if (qual->flags.q.constant || qual->flags.q.attribute |
||
1823 | || qual->flags.q.uniform |
||
1824 | || (qual->flags.q.varying && (state->target == fragment_shader))) |
||
1825 | var->read_only = 1; |
||
1826 | |||
1827 | if (qual->flags.q.centroid) |
||
1828 | var->centroid = 1; |
||
1829 | |||
1830 | if (qual->flags.q.attribute && state->target != vertex_shader) { |
||
1831 | var->type = glsl_type::error_type; |
||
1832 | _mesa_glsl_error(loc, state, |
||
1833 | "`attribute' variables may not be declared in the " |
||
1834 | "%s shader", |
||
1835 | _mesa_glsl_shader_target_name(state->target)); |
||
1836 | } |
||
1837 | |||
1838 | /* From page 25 (page 31 of the PDF) of the GLSL 1.10 spec: |
||
1839 | * |
||
1840 | * "The varying qualifier can be used only with the data types |
||
1841 | * float, vec2, vec3, vec4, mat2, mat3, and mat4, or arrays of |
||
1842 | * these." |
||
1843 | */ |
||
1844 | if (qual->flags.q.varying) { |
||
1845 | const glsl_type *non_array_type; |
||
1846 | |||
1847 | if (var->type && var->type->is_array()) |
||
1848 | non_array_type = var->type->fields.array; |
||
1849 | else |
||
1850 | non_array_type = var->type; |
||
1851 | |||
1852 | if (non_array_type && non_array_type->base_type != GLSL_TYPE_FLOAT) { |
||
1853 | var->type = glsl_type::error_type; |
||
1854 | _mesa_glsl_error(loc, state, |
||
1855 | "varying variables must be of base type float"); |
||
1856 | } |
||
1857 | } |
||
1858 | |||
1859 | /* If there is no qualifier that changes the mode of the variable, leave |
||
1860 | * the setting alone. |
||
1861 | */ |
||
1862 | if (qual->flags.q.in && qual->flags.q.out) |
||
1863 | var->mode = ir_var_inout; |
||
1864 | else if (qual->flags.q.attribute || qual->flags.q.in |
||
1865 | || (qual->flags.q.varying && (state->target == fragment_shader))) |
||
1866 | var->mode = ir_var_in; |
||
1867 | else if (qual->flags.q.out |
||
1868 | || (qual->flags.q.varying && (state->target == vertex_shader))) |
||
1869 | var->mode = ir_var_out; |
||
1870 | else if (qual->flags.q.uniform) |
||
1871 | var->mode = ir_var_uniform; |
||
1872 | |||
1873 | if (state->all_invariant && (state->current_function == NULL)) { |
||
1874 | switch (state->target) { |
||
1875 | case vertex_shader: |
||
1876 | if (var->mode == ir_var_out) |
||
1877 | var->invariant = true; |
||
1878 | break; |
||
1879 | case geometry_shader: |
||
1880 | if ((var->mode == ir_var_in) || (var->mode == ir_var_out)) |
||
1881 | var->invariant = true; |
||
1882 | break; |
||
1883 | case fragment_shader: |
||
1884 | if (var->mode == ir_var_in) |
||
1885 | var->invariant = true; |
||
1886 | break; |
||
1887 | } |
||
1888 | } |
||
1889 | |||
1890 | if (qual->flags.q.flat) |
||
1891 | var->interpolation = ir_var_flat; |
||
1892 | else if (qual->flags.q.noperspective) |
||
1893 | var->interpolation = ir_var_noperspective; |
||
1894 | else |
||
1895 | var->interpolation = ir_var_smooth; |
||
1896 | |||
1897 | var->pixel_center_integer = qual->flags.q.pixel_center_integer; |
||
1898 | var->origin_upper_left = qual->flags.q.origin_upper_left; |
||
1899 | if ((qual->flags.q.origin_upper_left || qual->flags.q.pixel_center_integer) |
||
1900 | && (strcmp(var->name, "gl_FragCoord") != 0)) { |
||
1901 | const char *const qual_string = (qual->flags.q.origin_upper_left) |
||
1902 | ? "origin_upper_left" : "pixel_center_integer"; |
||
1903 | |||
1904 | _mesa_glsl_error(loc, state, |
||
1905 | "layout qualifier `%s' can only be applied to " |
||
1906 | "fragment shader input `gl_FragCoord'", |
||
1907 | qual_string); |
||
1908 | } |
||
1909 | |||
1910 | if (qual->flags.q.explicit_location) { |
||
1911 | const bool global_scope = (state->current_function == NULL); |
||
1912 | bool fail = false; |
||
1913 | const char *string = ""; |
||
1914 | |||
1915 | /* In the vertex shader only shader inputs can be given explicit |
||
1916 | * locations. |
||
1917 | * |
||
1918 | * In the fragment shader only shader outputs can be given explicit |
||
1919 | * locations. |
||
1920 | */ |
||
1921 | switch (state->target) { |
||
1922 | case vertex_shader: |
||
1923 | if (!global_scope || (var->mode != ir_var_in)) { |
||
1924 | fail = true; |
||
1925 | string = "input"; |
||
1926 | } |
||
1927 | break; |
||
1928 | |||
1929 | case geometry_shader: |
||
1930 | _mesa_glsl_error(loc, state, |
||
1931 | "geometry shader variables cannot be given " |
||
1932 | "explicit locations\n"); |
||
1933 | break; |
||
1934 | |||
1935 | case fragment_shader: |
||
1936 | if (!global_scope || (var->mode != ir_var_in)) { |
||
1937 | fail = true; |
||
1938 | string = "output"; |
||
1939 | } |
||
1940 | break; |
||
1941 | }; |
||
1942 | |||
1943 | if (fail) { |
||
1944 | _mesa_glsl_error(loc, state, |
||
1945 | "only %s shader %s variables can be given an " |
||
1946 | "explicit location\n", |
||
1947 | _mesa_glsl_shader_target_name(state->target), |
||
1948 | string); |
||
1949 | } else { |
||
1950 | var->explicit_location = true; |
||
1951 | |||
1952 | /* This bit of silliness is needed because invalid explicit locations |
||
1953 | * are supposed to be flagged during linking. Small negative values |
||
1954 | * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias |
||
1955 | * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 = VERT_ATTRIB_POS). |
||
1956 | * The linker needs to be able to differentiate these cases. This |
||
1957 | * ensures that negative values stay negative. |
||
1958 | */ |
||
1959 | if (qual->location >= 0) { |
||
1960 | var->location = (state->target == vertex_shader) |
||
1961 | ? (qual->location + VERT_ATTRIB_GENERIC0) |
||
1962 | : (qual->location + FRAG_RESULT_DATA0); |
||
1963 | } else { |
||
1964 | var->location = qual->location; |
||
1965 | } |
||
1966 | } |
||
1967 | } |
||
1968 | |||
1969 | /* Does the declaration use the 'layout' keyword? |
||
1970 | */ |
||
1971 | const bool uses_layout = qual->flags.q.pixel_center_integer |
||
1972 | || qual->flags.q.origin_upper_left |
||
1973 | || qual->flags.q.explicit_location; |
||
1974 | |||
1975 | /* Does the declaration use the deprecated 'attribute' or 'varying' |
||
1976 | * keywords? |
||
1977 | */ |
||
1978 | const bool uses_deprecated_qualifier = qual->flags.q.attribute |
||
1979 | || qual->flags.q.varying; |
||
1980 | |||
1981 | /* Is the 'layout' keyword used with parameters that allow relaxed checking. |
||
1982 | * Many implementations of GL_ARB_fragment_coord_conventions_enable and some |
||
1983 | * implementations (only Mesa?) GL_ARB_explicit_attrib_location_enable |
||
1984 | * allowed the layout qualifier to be used with 'varying' and 'attribute'. |
||
1985 | * These extensions and all following extensions that add the 'layout' |
||
1986 | * keyword have been modified to require the use of 'in' or 'out'. |
||
1987 | * |
||
1988 | * The following extension do not allow the deprecated keywords: |
||
1989 | * |
||
1990 | * GL_AMD_conservative_depth |
||
1991 | * GL_ARB_gpu_shader5 |
||
1992 | * GL_ARB_separate_shader_objects |
||
1993 | * GL_ARB_tesselation_shader |
||
1994 | * GL_ARB_transform_feedback3 |
||
1995 | * GL_ARB_uniform_buffer_object |
||
1996 | * |
||
1997 | * It is unknown whether GL_EXT_shader_image_load_store or GL_NV_gpu_shader5 |
||
1998 | * allow layout with the deprecated keywords. |
||
1999 | */ |
||
2000 | const bool relaxed_layout_qualifier_checking = |
||
2001 | state->ARB_fragment_coord_conventions_enable; |
||
2002 | |||
2003 | if (uses_layout && uses_deprecated_qualifier) { |
||
2004 | if (relaxed_layout_qualifier_checking) { |
||
2005 | _mesa_glsl_warning(loc, state, |
||
2006 | "`layout' qualifier may not be used with " |
||
2007 | "`attribute' or `varying'"); |
||
2008 | } else { |
||
2009 | _mesa_glsl_error(loc, state, |
||
2010 | "`layout' qualifier may not be used with " |
||
2011 | "`attribute' or `varying'"); |
||
2012 | } |
||
2013 | } |
||
2014 | |||
2015 | if (var->type->is_array() && state->language_version != 110) { |
||
2016 | var->array_lvalue = true; |
||
2017 | } |
||
2018 | } |
||
2019 | |||
2020 | |||
2021 | ir_rvalue * |
||
2022 | ast_declarator_list::hir(exec_list *instructions, |
||
2023 | struct _mesa_glsl_parse_state *state) |
||
2024 | { |
||
2025 | void *ctx = state; |
||
2026 | const struct glsl_type *decl_type; |
||
2027 | const char *type_name = NULL; |
||
2028 | ir_rvalue *result = NULL; |
||
2029 | YYLTYPE loc = this->get_location(); |
||
2030 | |||
2031 | /* From page 46 (page 52 of the PDF) of the GLSL 1.50 spec: |
||
2032 | * |
||
2033 | * "To ensure that a particular output variable is invariant, it is |
||
2034 | * necessary to use the invariant qualifier. It can either be used to |
||
2035 | * qualify a previously declared variable as being invariant |
||
2036 | * |
||
2037 | * invariant gl_Position; // make existing gl_Position be invariant" |
||
2038 | * |
||
2039 | * In these cases the parser will set the 'invariant' flag in the declarator |
||
2040 | * list, and the type will be NULL. |
||
2041 | */ |
||
2042 | if (this->invariant) { |
||
2043 | assert(this->type == NULL); |
||
2044 | |||
2045 | if (state->current_function != NULL) { |
||
2046 | _mesa_glsl_error(& loc, state, |
||
2047 | "All uses of `invariant' keyword must be at global " |
||
2048 | "scope\n"); |
||
2049 | } |
||
2050 | |||
2051 | foreach_list_typed (ast_declaration, decl, link, &this->declarations) { |
||
2052 | assert(!decl->is_array); |
||
2053 | assert(decl->array_size == NULL); |
||
2054 | assert(decl->initializer == NULL); |
||
2055 | |||
2056 | ir_variable *const earlier = |
||
2057 | state->symbols->get_variable(decl->identifier); |
||
2058 | if (earlier == NULL) { |
||
2059 | _mesa_glsl_error(& loc, state, |
||
2060 | "Undeclared variable `%s' cannot be marked " |
||
2061 | "invariant\n", decl->identifier); |
||
2062 | } else if ((state->target == vertex_shader) |
||
2063 | && (earlier->mode != ir_var_out)) { |
||
2064 | _mesa_glsl_error(& loc, state, |
||
2065 | "`%s' cannot be marked invariant, vertex shader " |
||
2066 | "outputs only\n", decl->identifier); |
||
2067 | } else if ((state->target == fragment_shader) |
||
2068 | && (earlier->mode != ir_var_in)) { |
||
2069 | _mesa_glsl_error(& loc, state, |
||
2070 | "`%s' cannot be marked invariant, fragment shader " |
||
2071 | "inputs only\n", decl->identifier); |
||
2072 | } else if (earlier->used) { |
||
2073 | _mesa_glsl_error(& loc, state, |
||
2074 | "variable `%s' may not be redeclared " |
||
2075 | "`invariant' after being used", |
||
2076 | earlier->name); |
||
2077 | } else { |
||
2078 | earlier->invariant = true; |
||
2079 | } |
||
2080 | } |
||
2081 | |||
2082 | /* Invariant redeclarations do not have r-values. |
||
2083 | */ |
||
2084 | return NULL; |
||
2085 | } |
||
2086 | |||
2087 | assert(this->type != NULL); |
||
2088 | assert(!this->invariant); |
||
2089 | |||
2090 | /* The type specifier may contain a structure definition. Process that |
||
2091 | * before any of the variable declarations. |
||
2092 | */ |
||
2093 | (void) this->type->specifier->hir(instructions, state); |
||
2094 | |||
2095 | decl_type = this->type->specifier->glsl_type(& type_name, state); |
||
2096 | if (this->declarations.is_empty()) { |
||
2097 | /* The only valid case where the declaration list can be empty is when |
||
2098 | * the declaration is setting the default precision of a built-in type |
||
2099 | * (e.g., 'precision highp vec4;'). |
||
2100 | */ |
||
2101 | |||
2102 | if (decl_type != NULL) { |
||
2103 | } else { |
||
2104 | _mesa_glsl_error(& loc, state, "incomplete declaration"); |
||
2105 | } |
||
2106 | } |
||
2107 | |||
2108 | foreach_list_typed (ast_declaration, decl, link, &this->declarations) { |
||
2109 | const struct glsl_type *var_type; |
||
2110 | ir_variable *var; |
||
2111 | |||
2112 | /* FINISHME: Emit a warning if a variable declaration shadows a |
||
2113 | * FINISHME: declaration at a higher scope. |
||
2114 | */ |
||
2115 | |||
2116 | if ((decl_type == NULL) || decl_type->is_void()) { |
||
2117 | if (type_name != NULL) { |
||
2118 | _mesa_glsl_error(& loc, state, |
||
2119 | "invalid type `%s' in declaration of `%s'", |
||
2120 | type_name, decl->identifier); |
||
2121 | } else { |
||
2122 | _mesa_glsl_error(& loc, state, |
||
2123 | "invalid type in declaration of `%s'", |
||
2124 | decl->identifier); |
||
2125 | } |
||
2126 | continue; |
||
2127 | } |
||
2128 | |||
2129 | if (decl->is_array) { |
||
2130 | var_type = process_array_type(&loc, decl_type, decl->array_size, |
||
2131 | state); |
||
2132 | } else { |
||
2133 | var_type = decl_type; |
||
2134 | } |
||
2135 | |||
2136 | var = new(ctx) ir_variable(var_type, decl->identifier, ir_var_auto); |
||
2137 | |||
2138 | /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification; |
||
2139 | * |
||
2140 | * "Global variables can only use the qualifiers const, |
||
2141 | * attribute, uni form, or varying. Only one may be |
||
2142 | * specified. |
||
2143 | * |
||
2144 | * Local variables can only use the qualifier const." |
||
2145 | * |
||
2146 | * This is relaxed in GLSL 1.30. It is also relaxed by any extension |
||
2147 | * that adds the 'layout' keyword. |
||
2148 | */ |
||
2149 | if ((state->language_version < 130) |
||
2150 | && !state->ARB_explicit_attrib_location_enable |
||
2151 | && !state->ARB_fragment_coord_conventions_enable) { |
||
2152 | if (this->type->qualifier.flags.q.out) { |
||
2153 | _mesa_glsl_error(& loc, state, |
||
2154 | "`out' qualifier in declaration of `%s' " |
||
2155 | "only valid for function parameters in %s.", |
||
2156 | decl->identifier, state->version_string); |
||
2157 | } |
||
2158 | if (this->type->qualifier.flags.q.in) { |
||
2159 | _mesa_glsl_error(& loc, state, |
||
2160 | "`in' qualifier in declaration of `%s' " |
||
2161 | "only valid for function parameters in %s.", |
||
2162 | decl->identifier, state->version_string); |
||
2163 | } |
||
2164 | /* FINISHME: Test for other invalid qualifiers. */ |
||
2165 | } |
||
2166 | |||
2167 | apply_type_qualifier_to_variable(& this->type->qualifier, var, state, |
||
2168 | & loc); |
||
2169 | |||
2170 | if (this->type->qualifier.flags.q.invariant) { |
||
2171 | if ((state->target == vertex_shader) && !(var->mode == ir_var_out || |
||
2172 | var->mode == ir_var_inout)) { |
||
2173 | /* FINISHME: Note that this doesn't work for invariant on |
||
2174 | * a function signature outval |
||
2175 | */ |
||
2176 | _mesa_glsl_error(& loc, state, |
||
2177 | "`%s' cannot be marked invariant, vertex shader " |
||
2178 | "outputs only\n", var->name); |
||
2179 | } else if ((state->target == fragment_shader) && |
||
2180 | !(var->mode == ir_var_in || var->mode == ir_var_inout)) { |
||
2181 | /* FINISHME: Note that this doesn't work for invariant on |
||
2182 | * a function signature inval |
||
2183 | */ |
||
2184 | _mesa_glsl_error(& loc, state, |
||
2185 | "`%s' cannot be marked invariant, fragment shader " |
||
2186 | "inputs only\n", var->name); |
||
2187 | } |
||
2188 | } |
||
2189 | |||
2190 | if (state->current_function != NULL) { |
||
2191 | const char *mode = NULL; |
||
2192 | const char *extra = ""; |
||
2193 | |||
2194 | /* There is no need to check for 'inout' here because the parser will |
||
2195 | * only allow that in function parameter lists. |
||
2196 | */ |
||
2197 | if (this->type->qualifier.flags.q.attribute) { |
||
2198 | mode = "attribute"; |
||
2199 | } else if (this->type->qualifier.flags.q.uniform) { |
||
2200 | mode = "uniform"; |
||
2201 | } else if (this->type->qualifier.flags.q.varying) { |
||
2202 | mode = "varying"; |
||
2203 | } else if (this->type->qualifier.flags.q.in) { |
||
2204 | mode = "in"; |
||
2205 | extra = " or in function parameter list"; |
||
2206 | } else if (this->type->qualifier.flags.q.out) { |
||
2207 | mode = "out"; |
||
2208 | extra = " or in function parameter list"; |
||
2209 | } |
||
2210 | |||
2211 | if (mode) { |
||
2212 | _mesa_glsl_error(& loc, state, |
||
2213 | "%s variable `%s' must be declared at " |
||
2214 | "global scope%s", |
||
2215 | mode, var->name, extra); |
||
2216 | } |
||
2217 | } else if (var->mode == ir_var_in) { |
||
2218 | var->read_only = true; |
||
2219 | |||
2220 | if (state->target == vertex_shader) { |
||
2221 | bool error_emitted = false; |
||
2222 | |||
2223 | /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: |
||
2224 | * |
||
2225 | * "Vertex shader inputs can only be float, floating-point |
||
2226 | * vectors, matrices, signed and unsigned integers and integer |
||
2227 | * vectors. Vertex shader inputs can also form arrays of these |
||
2228 | * types, but not structures." |
||
2229 | * |
||
2230 | * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec: |
||
2231 | * |
||
2232 | * "Vertex shader inputs can only be float, floating-point |
||
2233 | * vectors, matrices, signed and unsigned integers and integer |
||
2234 | * vectors. They cannot be arrays or structures." |
||
2235 | * |
||
2236 | * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec: |
||
2237 | * |
||
2238 | * "The attribute qualifier can be used only with float, |
||
2239 | * floating-point vectors, and matrices. Attribute variables |
||
2240 | * cannot be declared as arrays or structures." |
||
2241 | */ |
||
2242 | const glsl_type *check_type = var->type->is_array() |
||
2243 | ? var->type->fields.array : var->type; |
||
2244 | |||
2245 | switch (check_type->base_type) { |
||
2246 | case GLSL_TYPE_FLOAT: |
||
2247 | break; |
||
2248 | case GLSL_TYPE_UINT: |
||
2249 | case GLSL_TYPE_INT: |
||
2250 | if (state->language_version > 120) |
||
2251 | break; |
||
2252 | /* FALLTHROUGH */ |
||
2253 | default: |
||
2254 | _mesa_glsl_error(& loc, state, |
||
2255 | "vertex shader input / attribute cannot have " |
||
2256 | "type %s`%s'", |
||
2257 | var->type->is_array() ? "array of " : "", |
||
2258 | check_type->name); |
||
2259 | error_emitted = true; |
||
2260 | } |
||
2261 | |||
2262 | if (!error_emitted && (state->language_version <= 130) |
||
2263 | && var->type->is_array()) { |
||
2264 | _mesa_glsl_error(& loc, state, |
||
2265 | "vertex shader input / attribute cannot have " |
||
2266 | "array type"); |
||
2267 | error_emitted = true; |
||
2268 | } |
||
2269 | } |
||
2270 | } |
||
2271 | |||
2272 | /* Precision qualifiers exists only in GLSL versions 1.00 and >= 1.30. |
||
2273 | */ |
||
2274 | if (this->type->specifier->precision != ast_precision_none |
||
2275 | && state->language_version != 100 |
||
2276 | && state->language_version < 130) { |
||
2277 | |||
2278 | _mesa_glsl_error(&loc, state, |
||
2279 | "precision qualifiers are supported only in GLSL ES " |
||
2280 | "1.00, and GLSL 1.30 and later"); |
||
2281 | } |
||
2282 | |||
2283 | |||
2284 | /* Precision qualifiers only apply to floating point and integer types. |
||
2285 | * |
||
2286 | * From section 4.5.2 of the GLSL 1.30 spec: |
||
2287 | * "Any floating point or any integer declaration can have the type |
||
2288 | * preceded by one of these precision qualifiers [...] Literal |
||
2289 | * constants do not have precision qualifiers. Neither do Boolean |
||
2290 | * variables. |
||
2291 | */ |
||
2292 | if (this->type->specifier->precision != ast_precision_none |
||
2293 | && !var->type->is_float() |
||
2294 | && !var->type->is_integer() |
||
2295 | && !(var->type->is_array() |
||
2296 | && (var->type->fields.array->is_float() |
||
2297 | || var->type->fields.array->is_integer()))) { |
||
2298 | |||
2299 | _mesa_glsl_error(&loc, state, |
||
2300 | "precision qualifiers apply only to floating point " |
||
2301 | "and integer types"); |
||
2302 | } |
||
2303 | |||
2304 | /* Process the initializer and add its instructions to a temporary |
||
2305 | * list. This list will be added to the instruction stream (below) after |
||
2306 | * the declaration is added. This is done because in some cases (such as |
||
2307 | * redeclarations) the declaration may not actually be added to the |
||
2308 | * instruction stream. |
||
2309 | */ |
||
2310 | exec_list initializer_instructions; |
||
2311 | if (decl->initializer != NULL) { |
||
2312 | YYLTYPE initializer_loc = decl->initializer->get_location(); |
||
2313 | |||
2314 | /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec: |
||
2315 | * |
||
2316 | * "All uniform variables are read-only and are initialized either |
||
2317 | * directly by an application via API commands, or indirectly by |
||
2318 | * OpenGL." |
||
2319 | */ |
||
2320 | if ((state->language_version <= 110) |
||
2321 | && (var->mode == ir_var_uniform)) { |
||
2322 | _mesa_glsl_error(& initializer_loc, state, |
||
2323 | "cannot initialize uniforms in GLSL 1.10"); |
||
2324 | } |
||
2325 | |||
2326 | if (var->type->is_sampler()) { |
||
2327 | _mesa_glsl_error(& initializer_loc, state, |
||
2328 | "cannot initialize samplers"); |
||
2329 | } |
||
2330 | |||
2331 | if ((var->mode == ir_var_in) && (state->current_function == NULL)) { |
||
2332 | _mesa_glsl_error(& initializer_loc, state, |
||
2333 | "cannot initialize %s shader input / %s", |
||
2334 | _mesa_glsl_shader_target_name(state->target), |
||
2335 | (state->target == vertex_shader) |
||
2336 | ? "attribute" : "varying"); |
||
2337 | } |
||
2338 | |||
2339 | ir_dereference *const lhs = new(ctx) ir_dereference_variable(var); |
||
2340 | ir_rvalue *rhs = decl->initializer->hir(&initializer_instructions, |
||
2341 | state); |
||
2342 | |||
2343 | /* Calculate the constant value if this is a const or uniform |
||
2344 | * declaration. |
||
2345 | */ |
||
2346 | if (this->type->qualifier.flags.q.constant |
||
2347 | || this->type->qualifier.flags.q.uniform) { |
||
2348 | ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs); |
||
2349 | if (new_rhs != NULL) { |
||
2350 | rhs = new_rhs; |
||
2351 | |||
2352 | ir_constant *constant_value = rhs->constant_expression_value(); |
||
2353 | if (!constant_value) { |
||
2354 | _mesa_glsl_error(& initializer_loc, state, |
||
2355 | "initializer of %s variable `%s' must be a " |
||
2356 | "constant expression", |
||
2357 | (this->type->qualifier.flags.q.constant) |
||
2358 | ? "const" : "uniform", |
||
2359 | decl->identifier); |
||
2360 | if (var->type->is_numeric()) { |
||
2361 | /* Reduce cascading errors. */ |
||
2362 | var->constant_value = ir_constant::zero(ctx, var->type); |
||
2363 | } |
||
2364 | } else { |
||
2365 | rhs = constant_value; |
||
2366 | var->constant_value = constant_value; |
||
2367 | } |
||
2368 | } else { |
||
2369 | _mesa_glsl_error(&initializer_loc, state, |
||
2370 | "initializer of type %s cannot be assigned to " |
||
2371 | "variable of type %s", |
||
2372 | rhs->type->name, var->type->name); |
||
2373 | if (var->type->is_numeric()) { |
||
2374 | /* Reduce cascading errors. */ |
||
2375 | var->constant_value = ir_constant::zero(ctx, var->type); |
||
2376 | } |
||
2377 | } |
||
2378 | } |
||
2379 | |||
2380 | if (rhs && !rhs->type->is_error()) { |
||
2381 | bool temp = var->read_only; |
||
2382 | if (this->type->qualifier.flags.q.constant) |
||
2383 | var->read_only = false; |
||
2384 | |||
2385 | /* Never emit code to initialize a uniform. |
||
2386 | */ |
||
2387 | const glsl_type *initializer_type; |
||
2388 | if (!this->type->qualifier.flags.q.uniform) { |
||
2389 | result = do_assignment(&initializer_instructions, state, |
||
2390 | lhs, rhs, |
||
2391 | this->get_location()); |
||
2392 | initializer_type = result->type; |
||
2393 | } else |
||
2394 | initializer_type = rhs->type; |
||
2395 | |||
2396 | /* If the declared variable is an unsized array, it must inherrit |
||
2397 | * its full type from the initializer. A declaration such as |
||
2398 | * |
||
2399 | * uniform float a[] = float[](1.0, 2.0, 3.0, 3.0); |
||
2400 | * |
||
2401 | * becomes |
||
2402 | * |
||
2403 | * uniform float a[4] = float[](1.0, 2.0, 3.0, 3.0); |
||
2404 | * |
||
2405 | * The assignment generated in the if-statement (below) will also |
||
2406 | * automatically handle this case for non-uniforms. |
||
2407 | * |
||
2408 | * If the declared variable is not an array, the types must |
||
2409 | * already match exactly. As a result, the type assignment |
||
2410 | * here can be done unconditionally. For non-uniforms the call |
||
2411 | * to do_assignment can change the type of the initializer (via |
||
2412 | * the implicit conversion rules). For uniforms the initializer |
||
2413 | * must be a constant expression, and the type of that expression |
||
2414 | * was validated above. |
||
2415 | */ |
||
2416 | var->type = initializer_type; |
||
2417 | |||
2418 | var->read_only = temp; |
||
2419 | } |
||
2420 | } |
||
2421 | |||
2422 | /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec: |
||
2423 | * |
||
2424 | * "It is an error to write to a const variable outside of |
||
2425 | * its declaration, so they must be initialized when |
||
2426 | * declared." |
||
2427 | */ |
||
2428 | if (this->type->qualifier.flags.q.constant && decl->initializer == NULL) { |
||
2429 | _mesa_glsl_error(& loc, state, |
||
2430 | "const declaration of `%s' must be initialized", |
||
2431 | decl->identifier); |
||
2432 | } |
||
2433 | |||
2434 | /* Check if this declaration is actually a re-declaration, either to |
||
2435 | * resize an array or add qualifiers to an existing variable. |
||
2436 | * |
||
2437 | * This is allowed for variables in the current scope, or when at |
||
2438 | * global scope (for built-ins in the implicit outer scope). |
||
2439 | */ |
||
2440 | ir_variable *earlier = state->symbols->get_variable(decl->identifier); |
||
2441 | if (earlier != NULL && (state->current_function == NULL || |
||
2442 | state->symbols->name_declared_this_scope(decl->identifier))) { |
||
2443 | |||
2444 | /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec, |
||
2445 | * |
||
2446 | * "It is legal to declare an array without a size and then |
||
2447 | * later re-declare the same name as an array of the same |
||
2448 | * type and specify a size." |
||
2449 | */ |
||
2450 | if ((earlier->type->array_size() == 0) |
||
2451 | && var->type->is_array() |
||
2452 | && (var->type->element_type() == earlier->type->element_type())) { |
||
2453 | /* FINISHME: This doesn't match the qualifiers on the two |
||
2454 | * FINISHME: declarations. It's not 100% clear whether this is |
||
2455 | * FINISHME: required or not. |
||
2456 | */ |
||
2457 | |||
2458 | /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec: |
||
2459 | * |
||
2460 | * "The size [of gl_TexCoord] can be at most |
||
2461 | * gl_MaxTextureCoords." |
||
2462 | */ |
||
2463 | const unsigned size = unsigned(var->type->array_size()); |
||
2464 | if ((strcmp("gl_TexCoord", var->name) == 0) |
||
2465 | && (size > state->Const.MaxTextureCoords)) { |
||
2466 | YYLTYPE loc = this->get_location(); |
||
2467 | |||
2468 | _mesa_glsl_error(& loc, state, "`gl_TexCoord' array size cannot " |
||
2469 | "be larger than gl_MaxTextureCoords (%u)\n", |
||
2470 | state->Const.MaxTextureCoords); |
||
2471 | } else if ((size > 0) && (size <= earlier->max_array_access)) { |
||
2472 | YYLTYPE loc = this->get_location(); |
||
2473 | |||
2474 | _mesa_glsl_error(& loc, state, "array size must be > %u due to " |
||
2475 | "previous access", |
||
2476 | earlier->max_array_access); |
||
2477 | } |
||
2478 | |||
2479 | earlier->type = var->type; |
||
2480 | delete var; |
||
2481 | var = NULL; |
||
2482 | } else if (state->ARB_fragment_coord_conventions_enable |
||
2483 | && strcmp(var->name, "gl_FragCoord") == 0 |
||
2484 | && earlier->type == var->type |
||
2485 | && earlier->mode == var->mode) { |
||
2486 | /* Allow redeclaration of gl_FragCoord for ARB_fcc layout |
||
2487 | * qualifiers. |
||
2488 | */ |
||
2489 | earlier->origin_upper_left = var->origin_upper_left; |
||
2490 | earlier->pixel_center_integer = var->pixel_center_integer; |
||
2491 | } else { |
||
2492 | YYLTYPE loc = this->get_location(); |
||
2493 | _mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier); |
||
2494 | } |
||
2495 | |||
2496 | continue; |
||
2497 | } |
||
2498 | |||
2499 | /* By now, we know it's a new variable declaration (we didn't hit the |
||
2500 | * above "continue"). |
||
2501 | * |
||
2502 | * From page 15 (page 21 of the PDF) of the GLSL 1.10 spec, |
||
2503 | * |
||
2504 | * "Identifiers starting with "gl_" are reserved for use by |
||
2505 | * OpenGL, and may not be declared in a shader as either a |
||
2506 | * variable or a function." |
||
2507 | */ |
||
2508 | if (strncmp(decl->identifier, "gl_", 3) == 0) |
||
2509 | _mesa_glsl_error(& loc, state, |
||
2510 | "identifier `%s' uses reserved `gl_' prefix", |
||
2511 | decl->identifier); |
||
2512 | |||
2513 | /* Add the variable to the symbol table. Note that the initializer's |
||
2514 | * IR was already processed earlier (though it hasn't been emitted yet), |
||
2515 | * without the variable in scope. |
||
2516 | * |
||
2517 | * This differs from most C-like languages, but it follows the GLSL |
||
2518 | * specification. From page 28 (page 34 of the PDF) of the GLSL 1.50 |
||
2519 | * spec: |
||
2520 | * |
||
2521 | * "Within a declaration, the scope of a name starts immediately |
||
2522 | * after the initializer if present or immediately after the name |
||
2523 | * being declared if not." |
||
2524 | */ |
||
2525 | if (!state->symbols->add_variable(var)) { |
||
2526 | YYLTYPE loc = this->get_location(); |
||
2527 | _mesa_glsl_error(&loc, state, "name `%s' already taken in the " |
||
2528 | "current scope", decl->identifier); |
||
2529 | continue; |
||
2530 | } |
||
2531 | |||
2532 | /* Push the variable declaration to the top. It means that all |
||
2533 | * the variable declarations will appear in a funny |
||
2534 | * last-to-first order, but otherwise we run into trouble if a |
||
2535 | * function is prototyped, a global var is decled, then the |
||
2536 | * function is defined with usage of the global var. See |
||
2537 | * glslparsertest's CorrectModule.frag. |
||
2538 | */ |
||
2539 | instructions->push_head(var); |
||
2540 | instructions->append_list(&initializer_instructions); |
||
2541 | } |
||
2542 | |||
2543 | |||
2544 | /* Generally, variable declarations do not have r-values. However, |
||
2545 | * one is used for the declaration in |
||
2546 | * |
||
2547 | * while (bool b = some_condition()) { |
||
2548 | * ... |
||
2549 | * } |
||
2550 | * |
||
2551 | * so we return the rvalue from the last seen declaration here. |
||
2552 | */ |
||
2553 | return result; |
||
2554 | } |
||
2555 | |||
2556 | |||
2557 | ir_rvalue * |
||
2558 | ast_parameter_declarator::hir(exec_list *instructions, |
||
2559 | struct _mesa_glsl_parse_state *state) |
||
2560 | { |
||
2561 | void *ctx = state; |
||
2562 | const struct glsl_type *type; |
||
2563 | const char *name = NULL; |
||
2564 | YYLTYPE loc = this->get_location(); |
||
2565 | |||
2566 | type = this->type->specifier->glsl_type(& name, state); |
||
2567 | |||
2568 | if (type == NULL) { |
||
2569 | if (name != NULL) { |
||
2570 | _mesa_glsl_error(& loc, state, |
||
2571 | "invalid type `%s' in declaration of `%s'", |
||
2572 | name, this->identifier); |
||
2573 | } else { |
||
2574 | _mesa_glsl_error(& loc, state, |
||
2575 | "invalid type in declaration of `%s'", |
||
2576 | this->identifier); |
||
2577 | } |
||
2578 | |||
2579 | type = glsl_type::error_type; |
||
2580 | } |
||
2581 | |||
2582 | /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec: |
||
2583 | * |
||
2584 | * "Functions that accept no input arguments need not use void in the |
||
2585 | * argument list because prototypes (or definitions) are required and |
||
2586 | * therefore there is no ambiguity when an empty argument list "( )" is |
||
2587 | * declared. The idiom "(void)" as a parameter list is provided for |
||
2588 | * convenience." |
||
2589 | * |
||
2590 | * Placing this check here prevents a void parameter being set up |
||
2591 | * for a function, which avoids tripping up checks for main taking |
||
2592 | * parameters and lookups of an unnamed symbol. |
||
2593 | */ |
||
2594 | if (type->is_void()) { |
||
2595 | if (this->identifier != NULL) |
||
2596 | _mesa_glsl_error(& loc, state, |
||
2597 | "named parameter cannot have type `void'"); |
||
2598 | |||
2599 | is_void = true; |
||
2600 | return NULL; |
||
2601 | } |
||
2602 | |||
2603 | if (formal_parameter && (this->identifier == NULL)) { |
||
2604 | _mesa_glsl_error(& loc, state, "formal parameter lacks a name"); |
||
2605 | return NULL; |
||
2606 | } |
||
2607 | |||
2608 | /* This only handles "vec4 foo[..]". The earlier specifier->glsl_type(...) |
||
2609 | * call already handled the "vec4[..] foo" case. |
||
2610 | */ |
||
2611 | if (this->is_array) { |
||
2612 | type = process_array_type(&loc, type, this->array_size, state); |
||
2613 | } |
||
2614 | |||
2615 | if (type->array_size() == 0) { |
||
2616 | _mesa_glsl_error(&loc, state, "arrays passed as parameters must have " |
||
2617 | "a declared size."); |
||
2618 | type = glsl_type::error_type; |
||
2619 | } |
||
2620 | |||
2621 | is_void = false; |
||
2622 | ir_variable *var = new(ctx) ir_variable(type, this->identifier, ir_var_in); |
||
2623 | |||
2624 | /* Apply any specified qualifiers to the parameter declaration. Note that |
||
2625 | * for function parameters the default mode is 'in'. |
||
2626 | */ |
||
2627 | apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc); |
||
2628 | |||
2629 | instructions->push_tail(var); |
||
2630 | |||
2631 | /* Parameter declarations do not have r-values. |
||
2632 | */ |
||
2633 | return NULL; |
||
2634 | } |
||
2635 | |||
2636 | |||
2637 | void |
||
2638 | ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters, |
||
2639 | bool formal, |
||
2640 | exec_list *ir_parameters, |
||
2641 | _mesa_glsl_parse_state *state) |
||
2642 | { |
||
2643 | ast_parameter_declarator *void_param = NULL; |
||
2644 | unsigned count = 0; |
||
2645 | |||
2646 | foreach_list_typed (ast_parameter_declarator, param, link, ast_parameters) { |
||
2647 | param->formal_parameter = formal; |
||
2648 | param->hir(ir_parameters, state); |
||
2649 | |||
2650 | if (param->is_void) |
||
2651 | void_param = param; |
||
2652 | |||
2653 | count++; |
||
2654 | } |
||
2655 | |||
2656 | if ((void_param != NULL) && (count > 1)) { |
||
2657 | YYLTYPE loc = void_param->get_location(); |
||
2658 | |||
2659 | _mesa_glsl_error(& loc, state, |
||
2660 | "`void' parameter must be only parameter"); |
||
2661 | } |
||
2662 | } |
||
2663 | |||
2664 | |||
2665 | void |
||
2666 | emit_function(_mesa_glsl_parse_state *state, exec_list *instructions, |
||
2667 | ir_function *f) |
||
2668 | { |
||
2669 | /* Emit the new function header */ |
||
2670 | if (state->current_function == NULL) { |
||
2671 | instructions->push_tail(f); |
||
2672 | } else { |
||
2673 | /* IR invariants disallow function declarations or definitions nested |
||
2674 | * within other function definitions. Insert the new ir_function |
||
2675 | * block in the instruction sequence before the ir_function block |
||
2676 | * containing the current ir_function_signature. |
||
2677 | */ |
||
2678 | ir_function *const curr = |
||
2679 | const_cast |
||
2680 | |||
2681 | curr->insert_before(f); |
||
2682 | } |
||
2683 | } |
||
2684 | |||
2685 | |||
2686 | ir_rvalue * |
||
2687 | ast_function::hir(exec_list *instructions, |
||
2688 | struct _mesa_glsl_parse_state *state) |
||
2689 | { |
||
2690 | void *ctx = state; |
||
2691 | ir_function *f = NULL; |
||
2692 | ir_function_signature *sig = NULL; |
||
2693 | exec_list hir_parameters; |
||
2694 | |||
2695 | const char *const name = identifier; |
||
2696 | |||
2697 | /* From page 21 (page 27 of the PDF) of the GLSL 1.20 spec, |
||
2698 | * |
||
2699 | * "Function declarations (prototypes) cannot occur inside of functions; |
||
2700 | * they must be at global scope, or for the built-in functions, outside |
||
2701 | * the global scope." |
||
2702 | * |
||
2703 | * From page 27 (page 33 of the PDF) of the GLSL ES 1.00.16 spec, |
||
2704 | * |
||
2705 | * "User defined functions may only be defined within the global scope." |
||
2706 | * |
||
2707 | * Note that this language does not appear in GLSL 1.10. |
||
2708 | */ |
||
2709 | if ((state->current_function != NULL) && (state->language_version != 110)) { |
||
2710 | YYLTYPE loc = this->get_location(); |
||
2711 | _mesa_glsl_error(&loc, state, |
||
2712 | "declaration of function `%s' not allowed within " |
||
2713 | "function body", name); |
||
2714 | } |
||
2715 | |||
2716 | /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec, |
||
2717 | * |
||
2718 | * "Identifiers starting with "gl_" are reserved for use by |
||
2719 | * OpenGL, and may not be declared in a shader as either a |
||
2720 | * variable or a function." |
||
2721 | */ |
||
2722 | if (strncmp(name, "gl_", 3) == 0) { |
||
2723 | YYLTYPE loc = this->get_location(); |
||
2724 | _mesa_glsl_error(&loc, state, |
||
2725 | "identifier `%s' uses reserved `gl_' prefix", name); |
||
2726 | } |
||
2727 | |||
2728 | /* Convert the list of function parameters to HIR now so that they can be |
||
2729 | * used below to compare this function's signature with previously seen |
||
2730 | * signatures for functions with the same name. |
||
2731 | */ |
||
2732 | ast_parameter_declarator::parameters_to_hir(& this->parameters, |
||
2733 | is_definition, |
||
2734 | & hir_parameters, state); |
||
2735 | |||
2736 | const char *return_type_name; |
||
2737 | const glsl_type *return_type = |
||
2738 | this->return_type->specifier->glsl_type(& return_type_name, state); |
||
2739 | |||
2740 | if (!return_type) { |
||
2741 | YYLTYPE loc = this->get_location(); |
||
2742 | _mesa_glsl_error(&loc, state, |
||
2743 | "function `%s' has undeclared return type `%s'", |
||
2744 | name, return_type_name); |
||
2745 | return_type = glsl_type::error_type; |
||
2746 | } |
||
2747 | |||
2748 | /* From page 56 (page 62 of the PDF) of the GLSL 1.30 spec: |
||
2749 | * "No qualifier is allowed on the return type of a function." |
||
2750 | */ |
||
2751 | if (this->return_type->has_qualifiers()) { |
||
2752 | YYLTYPE loc = this->get_location(); |
||
2753 | _mesa_glsl_error(& loc, state, |
||
2754 | "function `%s' return type has qualifiers", name); |
||
2755 | } |
||
2756 | |||
2757 | /* Verify that this function's signature either doesn't match a previously |
||
2758 | * seen signature for a function with the same name, or, if a match is found, |
||
2759 | * that the previously seen signature does not have an associated definition. |
||
2760 | */ |
||
2761 | f = state->symbols->get_function(name); |
||
2762 | if (f != NULL && (state->es_shader || f->has_user_signature())) { |
||
2763 | sig = f->exact_matching_signature(&hir_parameters); |
||
2764 | if (sig != NULL) { |
||
2765 | const char *badvar = sig->qualifiers_match(&hir_parameters); |
||
2766 | if (badvar != NULL) { |
||
2767 | YYLTYPE loc = this->get_location(); |
||
2768 | |||
2769 | _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' " |
||
2770 | "qualifiers don't match prototype", name, badvar); |
||
2771 | } |
||
2772 | |||
2773 | if (sig->return_type != return_type) { |
||
2774 | YYLTYPE loc = this->get_location(); |
||
2775 | |||
2776 | _mesa_glsl_error(&loc, state, "function `%s' return type doesn't " |
||
2777 | "match prototype", name); |
||
2778 | } |
||
2779 | |||
2780 | if (is_definition && sig->is_defined) { |
||
2781 | YYLTYPE loc = this->get_location(); |
||
2782 | |||
2783 | _mesa_glsl_error(& loc, state, "function `%s' redefined", name); |
||
2784 | } |
||
2785 | } |
||
2786 | } else { |
||
2787 | f = new(ctx) ir_function(name); |
||
2788 | if (!state->symbols->add_function(f)) { |
||
2789 | /* This function name shadows a non-function use of the same name. */ |
||
2790 | YYLTYPE loc = this->get_location(); |
||
2791 | |||
2792 | _mesa_glsl_error(&loc, state, "function name `%s' conflicts with " |
||
2793 | "non-function", name); |
||
2794 | return NULL; |
||
2795 | } |
||
2796 | |||
2797 | emit_function(state, instructions, f); |
||
2798 | } |
||
2799 | |||
2800 | /* Verify the return type of main() */ |
||
2801 | if (strcmp(name, "main") == 0) { |
||
2802 | if (! return_type->is_void()) { |
||
2803 | YYLTYPE loc = this->get_location(); |
||
2804 | |||
2805 | _mesa_glsl_error(& loc, state, "main() must return void"); |
||
2806 | } |
||
2807 | |||
2808 | if (!hir_parameters.is_empty()) { |
||
2809 | YYLTYPE loc = this->get_location(); |
||
2810 | |||
2811 | _mesa_glsl_error(& loc, state, "main() must not take any parameters"); |
||
2812 | } |
||
2813 | } |
||
2814 | |||
2815 | /* Finish storing the information about this new function in its signature. |
||
2816 | */ |
||
2817 | if (sig == NULL) { |
||
2818 | sig = new(ctx) ir_function_signature(return_type); |
||
2819 | f->add_signature(sig); |
||
2820 | } |
||
2821 | |||
2822 | sig->replace_parameters(&hir_parameters); |
||
2823 | signature = sig; |
||
2824 | |||
2825 | /* Function declarations (prototypes) do not have r-values. |
||
2826 | */ |
||
2827 | return NULL; |
||
2828 | } |
||
2829 | |||
2830 | |||
2831 | ir_rvalue * |
||
2832 | ast_function_definition::hir(exec_list *instructions, |
||
2833 | struct _mesa_glsl_parse_state *state) |
||
2834 | { |
||
2835 | prototype->is_definition = true; |
||
2836 | prototype->hir(instructions, state); |
||
2837 | |||
2838 | ir_function_signature *signature = prototype->signature; |
||
2839 | if (signature == NULL) |
||
2840 | return NULL; |
||
2841 | |||
2842 | assert(state->current_function == NULL); |
||
2843 | state->current_function = signature; |
||
2844 | state->found_return = false; |
||
2845 | |||
2846 | /* Duplicate parameters declared in the prototype as concrete variables. |
||
2847 | * Add these to the symbol table. |
||
2848 | */ |
||
2849 | state->symbols->push_scope(); |
||
2850 | foreach_iter(exec_list_iterator, iter, signature->parameters) { |
||
2851 | ir_variable *const var = ((ir_instruction *) iter.get())->as_variable(); |
||
2852 | |||
2853 | assert(var != NULL); |
||
2854 | |||
2855 | /* The only way a parameter would "exist" is if two parameters have |
||
2856 | * the same name. |
||
2857 | */ |
||
2858 | if (state->symbols->name_declared_this_scope(var->name)) { |
||
2859 | YYLTYPE loc = this->get_location(); |
||
2860 | |||
2861 | _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name); |
||
2862 | } else { |
||
2863 | state->symbols->add_variable(var); |
||
2864 | } |
||
2865 | } |
||
2866 | |||
2867 | /* Convert the body of the function to HIR. */ |
||
2868 | this->body->hir(&signature->body, state); |
||
2869 | signature->is_defined = true; |
||
2870 | |||
2871 | state->symbols->pop_scope(); |
||
2872 | |||
2873 | assert(state->current_function == signature); |
||
2874 | state->current_function = NULL; |
||
2875 | |||
2876 | if (!signature->return_type->is_void() && !state->found_return) { |
||
2877 | YYLTYPE loc = this->get_location(); |
||
2878 | _mesa_glsl_error(& loc, state, "function `%s' has non-void return type " |
||
2879 | "%s, but no return statement", |
||
2880 | signature->function_name(), |
||
2881 | signature->return_type->name); |
||
2882 | } |
||
2883 | |||
2884 | /* Function definitions do not have r-values. |
||
2885 | */ |
||
2886 | return NULL; |
||
2887 | } |
||
2888 | |||
2889 | |||
2890 | ir_rvalue * |
||
2891 | ast_jump_statement::hir(exec_list *instructions, |
||
2892 | struct _mesa_glsl_parse_state *state) |
||
2893 | { |
||
2894 | void *ctx = state; |
||
2895 | |||
2896 | switch (mode) { |
||
2897 | case ast_return: { |
||
2898 | ir_return *inst; |
||
2899 | assert(state->current_function); |
||
2900 | |||
2901 | if (opt_return_value) { |
||
2902 | ir_rvalue *const ret = opt_return_value->hir(instructions, state); |
||
2903 | |||
2904 | /* The value of the return type can be NULL if the shader says |
||
2905 | * 'return foo();' and foo() is a function that returns void. |
||
2906 | * |
||
2907 | * NOTE: The GLSL spec doesn't say that this is an error. The type |
||
2908 | * of the return value is void. If the return type of the function is |
||
2909 | * also void, then this should compile without error. Seriously. |
||
2910 | */ |
||
2911 | const glsl_type *const ret_type = |
||
2912 | (ret == NULL) ? glsl_type::void_type : ret->type; |
||
2913 | |||
2914 | /* Implicit conversions are not allowed for return values. */ |
||
2915 | if (state->current_function->return_type != ret_type) { |
||
2916 | YYLTYPE loc = this->get_location(); |
||
2917 | |||
2918 | _mesa_glsl_error(& loc, state, |
||
2919 | "`return' with wrong type %s, in function `%s' " |
||
2920 | "returning %s", |
||
2921 | ret_type->name, |
||
2922 | state->current_function->function_name(), |
||
2923 | state->current_function->return_type->name); |
||
2924 | } |
||
2925 | |||
2926 | inst = new(ctx) ir_return(ret); |
||
2927 | } else { |
||
2928 | if (state->current_function->return_type->base_type != |
||
2929 | GLSL_TYPE_VOID) { |
||
2930 | YYLTYPE loc = this->get_location(); |
||
2931 | |||
2932 | _mesa_glsl_error(& loc, state, |
||
2933 | "`return' with no value, in function %s returning " |
||
2934 | "non-void", |
||
2935 | state->current_function->function_name()); |
||
2936 | } |
||
2937 | inst = new(ctx) ir_return; |
||
2938 | } |
||
2939 | |||
2940 | state->found_return = true; |
||
2941 | instructions->push_tail(inst); |
||
2942 | break; |
||
2943 | } |
||
2944 | |||
2945 | case ast_discard: |
||
2946 | if (state->target != fragment_shader) { |
||
2947 | YYLTYPE loc = this->get_location(); |
||
2948 | |||
2949 | _mesa_glsl_error(& loc, state, |
||
2950 | "`discard' may only appear in a fragment shader"); |
||
2951 | } |
||
2952 | instructions->push_tail(new(ctx) ir_discard); |
||
2953 | break; |
||
2954 | |||
2955 | case ast_break: |
||
2956 | case ast_continue: |
||
2957 | /* FINISHME: Handle switch-statements. They cannot contain 'continue', |
||
2958 | * FINISHME: and they use a different IR instruction for 'break'. |
||
2959 | */ |
||
2960 | /* FINISHME: Correctly handle the nesting. If a switch-statement is |
||
2961 | * FINISHME: inside a loop, a 'continue' is valid and will bind to the |
||
2962 | * FINISHME: loop. |
||
2963 | */ |
||
2964 | if (state->loop_or_switch_nesting == NULL) { |
||
2965 | YYLTYPE loc = this->get_location(); |
||
2966 | |||
2967 | _mesa_glsl_error(& loc, state, |
||
2968 | "`%s' may only appear in a loop", |
||
2969 | (mode == ast_break) ? "break" : "continue"); |
||
2970 | } else { |
||
2971 | ir_loop *const loop = state->loop_or_switch_nesting->as_loop(); |
||
2972 | |||
2973 | /* Inline the for loop expression again, since we don't know |
||
2974 | * where near the end of the loop body the normal copy of it |
||
2975 | * is going to be placed. |
||
2976 | */ |
||
2977 | if (mode == ast_continue && |
||
2978 | state->loop_or_switch_nesting_ast->rest_expression) { |
||
2979 | state->loop_or_switch_nesting_ast->rest_expression->hir(instructions, |
||
2980 | state); |
||
2981 | } |
||
2982 | |||
2983 | if (loop != NULL) { |
||
2984 | ir_loop_jump *const jump = |
||
2985 | new(ctx) ir_loop_jump((mode == ast_break) |
||
2986 | ? ir_loop_jump::jump_break |
||
2987 | : ir_loop_jump::jump_continue); |
||
2988 | instructions->push_tail(jump); |
||
2989 | } |
||
2990 | } |
||
2991 | |||
2992 | break; |
||
2993 | } |
||
2994 | |||
2995 | /* Jump instructions do not have r-values. |
||
2996 | */ |
||
2997 | return NULL; |
||
2998 | } |
||
2999 | |||
3000 | |||
3001 | ir_rvalue * |
||
3002 | ast_selection_statement::hir(exec_list *instructions, |
||
3003 | struct _mesa_glsl_parse_state *state) |
||
3004 | { |
||
3005 | void *ctx = state; |
||
3006 | |||
3007 | ir_rvalue *const condition = this->condition->hir(instructions, state); |
||
3008 | |||
3009 | /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec: |
||
3010 | * |
||
3011 | * "Any expression whose type evaluates to a Boolean can be used as the |
||
3012 | * conditional expression bool-expression. Vector types are not accepted |
||
3013 | * as the expression to if." |
||
3014 | * |
||
3015 | * The checks are separated so that higher quality diagnostics can be |
||
3016 | * generated for cases where both rules are violated. |
||
3017 | */ |
||
3018 | if (!condition->type->is_boolean() || !condition->type->is_scalar()) { |
||
3019 | YYLTYPE loc = this->condition->get_location(); |
||
3020 | |||
3021 | _mesa_glsl_error(& loc, state, "if-statement condition must be scalar " |
||
3022 | "boolean"); |
||
3023 | } |
||
3024 | |||
3025 | ir_if *const stmt = new(ctx) ir_if(condition); |
||
3026 | |||
3027 | if (then_statement != NULL) { |
||
3028 | state->symbols->push_scope(); |
||
3029 | then_statement->hir(& stmt->then_instructions, state); |
||
3030 | state->symbols->pop_scope(); |
||
3031 | } |
||
3032 | |||
3033 | if (else_statement != NULL) { |
||
3034 | state->symbols->push_scope(); |
||
3035 | else_statement->hir(& stmt->else_instructions, state); |
||
3036 | state->symbols->pop_scope(); |
||
3037 | } |
||
3038 | |||
3039 | instructions->push_tail(stmt); |
||
3040 | |||
3041 | /* if-statements do not have r-values. |
||
3042 | */ |
||
3043 | return NULL; |
||
3044 | } |
||
3045 | |||
3046 | |||
3047 | void |
||
3048 | ast_iteration_statement::condition_to_hir(ir_loop *stmt, |
||
3049 | struct _mesa_glsl_parse_state *state) |
||
3050 | { |
||
3051 | void *ctx = state; |
||
3052 | |||
3053 | if (condition != NULL) { |
||
3054 | ir_rvalue *const cond = |
||
3055 | condition->hir(& stmt->body_instructions, state); |
||
3056 | |||
3057 | if ((cond == NULL) |
||
3058 | || !cond->type->is_boolean() || !cond->type->is_scalar()) { |
||
3059 | YYLTYPE loc = condition->get_location(); |
||
3060 | |||
3061 | _mesa_glsl_error(& loc, state, |
||
3062 | "loop condition must be scalar boolean"); |
||
3063 | } else { |
||
3064 | /* As the first code in the loop body, generate a block that looks |
||
3065 | * like 'if (!condition) break;' as the loop termination condition. |
||
3066 | */ |
||
3067 | ir_rvalue *const not_cond = |
||
3068 | new(ctx) ir_expression(ir_unop_logic_not, glsl_type::bool_type, cond, |
||
3069 | NULL); |
||
3070 | |||
3071 | ir_if *const if_stmt = new(ctx) ir_if(not_cond); |
||
3072 | |||
3073 | ir_jump *const break_stmt = |
||
3074 | new(ctx) ir_loop_jump(ir_loop_jump::jump_break); |
||
3075 | |||
3076 | if_stmt->then_instructions.push_tail(break_stmt); |
||
3077 | stmt->body_instructions.push_tail(if_stmt); |
||
3078 | } |
||
3079 | } |
||
3080 | } |
||
3081 | |||
3082 | |||
3083 | ir_rvalue * |
||
3084 | ast_iteration_statement::hir(exec_list *instructions, |
||
3085 | struct _mesa_glsl_parse_state *state) |
||
3086 | { |
||
3087 | void *ctx = state; |
||
3088 | |||
3089 | /* For-loops and while-loops start a new scope, but do-while loops do not. |
||
3090 | */ |
||
3091 | if (mode != ast_do_while) |
||
3092 | state->symbols->push_scope(); |
||
3093 | |||
3094 | if (init_statement != NULL) |
||
3095 | init_statement->hir(instructions, state); |
||
3096 | |||
3097 | ir_loop *const stmt = new(ctx) ir_loop(); |
||
3098 | instructions->push_tail(stmt); |
||
3099 | |||
3100 | /* Track the current loop and / or switch-statement nesting. |
||
3101 | */ |
||
3102 | ir_instruction *const nesting = state->loop_or_switch_nesting; |
||
3103 | ast_iteration_statement *nesting_ast = state->loop_or_switch_nesting_ast; |
||
3104 | |||
3105 | state->loop_or_switch_nesting = stmt; |
||
3106 | state->loop_or_switch_nesting_ast = this; |
||
3107 | |||
3108 | if (mode != ast_do_while) |
||
3109 | condition_to_hir(stmt, state); |
||
3110 | |||
3111 | if (body != NULL) |
||
3112 | body->hir(& stmt->body_instructions, state); |
||
3113 | |||
3114 | if (rest_expression != NULL) |
||
3115 | rest_expression->hir(& stmt->body_instructions, state); |
||
3116 | |||
3117 | if (mode == ast_do_while) |
||
3118 | condition_to_hir(stmt, state); |
||
3119 | |||
3120 | if (mode != ast_do_while) |
||
3121 | state->symbols->pop_scope(); |
||
3122 | |||
3123 | /* Restore previous nesting before returning. |
||
3124 | */ |
||
3125 | state->loop_or_switch_nesting = nesting; |
||
3126 | state->loop_or_switch_nesting_ast = nesting_ast; |
||
3127 | |||
3128 | /* Loops do not have r-values. |
||
3129 | */ |
||
3130 | return NULL; |
||
3131 | } |
||
3132 | |||
3133 | |||
3134 | ir_rvalue * |
||
3135 | ast_type_specifier::hir(exec_list *instructions, |
||
3136 | struct _mesa_glsl_parse_state *state) |
||
3137 | { |
||
3138 | if (!this->is_precision_statement && this->structure == NULL) |
||
3139 | return NULL; |
||
3140 | |||
3141 | YYLTYPE loc = this->get_location(); |
||
3142 | |||
3143 | if (this->precision != ast_precision_none |
||
3144 | && state->language_version != 100 |
||
3145 | && state->language_version < 130) { |
||
3146 | _mesa_glsl_error(&loc, state, |
||
3147 | "precision qualifiers exist only in " |
||
3148 | "GLSL ES 1.00, and GLSL 1.30 and later"); |
||
3149 | return NULL; |
||
3150 | } |
||
3151 | if (this->precision != ast_precision_none |
||
3152 | && this->structure != NULL) { |
||
3153 | _mesa_glsl_error(&loc, state, |
||
3154 | "precision qualifiers do not apply to structures"); |
||
3155 | return NULL; |
||
3156 | } |
||
3157 | |||
3158 | /* If this is a precision statement, check that the type to which it is |
||
3159 | * applied is either float or int. |
||
3160 | * |
||
3161 | * From section 4.5.3 of the GLSL 1.30 spec: |
||
3162 | * "The precision statement |
||
3163 | * precision precision-qualifier type; |
||
3164 | * can be used to establish a default precision qualifier. The type |
||
3165 | * field can be either int or float [...]. Any other types or |
||
3166 | * qualifiers will result in an error. |
||
3167 | */ |
||
3168 | if (this->is_precision_statement) { |
||
3169 | assert(this->precision != ast_precision_none); |
||
3170 | assert(this->structure == NULL); /* The check for structures was |
||
3171 | * performed above. */ |
||
3172 | if (this->is_array) { |
||
3173 | _mesa_glsl_error(&loc, state, |
||
3174 | "default precision statements do not apply to " |
||
3175 | "arrays"); |
||
3176 | return NULL; |
||
3177 | } |
||
3178 | if (this->type_specifier != ast_float |
||
3179 | && this->type_specifier != ast_int) { |
||
3180 | _mesa_glsl_error(&loc, state, |
||
3181 | "default precision statements apply only to types " |
||
3182 | "float and int"); |
||
3183 | return NULL; |
||
3184 | } |
||
3185 | |||
3186 | /* FINISHME: Translate precision statements into IR. */ |
||
3187 | return NULL; |
||
3188 | } |
||
3189 | |||
3190 | if (this->structure != NULL) |
||
3191 | return this->structure->hir(instructions, state); |
||
3192 | |||
3193 | return NULL; |
||
3194 | } |
||
3195 | |||
3196 | |||
3197 | ir_rvalue * |
||
3198 | ast_struct_specifier::hir(exec_list *instructions, |
||
3199 | struct _mesa_glsl_parse_state *state) |
||
3200 | { |
||
3201 | unsigned decl_count = 0; |
||
3202 | |||
3203 | /* Make an initial pass over the list of structure fields to determine how |
||
3204 | * many there are. Each element in this list is an ast_declarator_list. |
||
3205 | * This means that we actually need to count the number of elements in the |
||
3206 | * 'declarations' list in each of the elements. |
||
3207 | */ |
||
3208 | foreach_list_typed (ast_declarator_list, decl_list, link, |
||
3209 | &this->declarations) { |
||
3210 | foreach_list_const (decl_ptr, & decl_list->declarations) { |
||
3211 | decl_count++; |
||
3212 | } |
||
3213 | } |
||
3214 | |||
3215 | /* Allocate storage for the structure fields and process the field |
||
3216 | * declarations. As the declarations are processed, try to also convert |
||
3217 | * the types to HIR. This ensures that structure definitions embedded in |
||
3218 | * other structure definitions are processed. |
||
3219 | */ |
||
3220 | glsl_struct_field *const fields = ralloc_array(state, glsl_struct_field, |
||
3221 | decl_count); |
||
3222 | |||
3223 | unsigned i = 0; |
||
3224 | foreach_list_typed (ast_declarator_list, decl_list, link, |
||
3225 | &this->declarations) { |
||
3226 | const char *type_name; |
||
3227 | |||
3228 | decl_list->type->specifier->hir(instructions, state); |
||
3229 | |||
3230 | /* Section 10.9 of the GLSL ES 1.00 specification states that |
||
3231 | * embedded structure definitions have been removed from the language. |
||
3232 | */ |
||
3233 | if (state->es_shader && decl_list->type->specifier->structure != NULL) { |
||
3234 | YYLTYPE loc = this->get_location(); |
||
3235 | _mesa_glsl_error(&loc, state, "Embedded structure definitions are " |
||
3236 | "not allowed in GLSL ES 1.00."); |
||
3237 | } |
||
3238 | |||
3239 | const glsl_type *decl_type = |
||
3240 | decl_list->type->specifier->glsl_type(& type_name, state); |
||
3241 | |||
3242 | foreach_list_typed (ast_declaration, decl, link, |
||
3243 | &decl_list->declarations) { |
||
3244 | const struct glsl_type *field_type = decl_type; |
||
3245 | if (decl->is_array) { |
||
3246 | YYLTYPE loc = decl->get_location(); |
||
3247 | field_type = process_array_type(&loc, decl_type, decl->array_size, |
||
3248 | state); |
||
3249 | } |
||
3250 | fields[i].type = (field_type != NULL) |
||
3251 | ? field_type : glsl_type::error_type; |
||
3252 | fields[i].name = decl->identifier; |
||
3253 | i++; |
||
3254 | } |
||
3255 | } |
||
3256 | |||
3257 | assert(i == decl_count); |
||
3258 | |||
3259 | const glsl_type *t = |
||
3260 | glsl_type::get_record_instance(fields, decl_count, this->name); |
||
3261 | |||
3262 | YYLTYPE loc = this->get_location(); |
||
3263 | if (!state->symbols->add_type(name, t)) { |
||
3264 | _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name); |
||
3265 | } else { |
||
3266 | const glsl_type **s = reralloc(state, state->user_structures, |
||
3267 | const glsl_type *, |
||
3268 | state->num_user_structures + 1); |
||
3269 | if (s != NULL) { |
||
3270 | s[state->num_user_structures] = t; |
||
3271 | state->user_structures = s; |
||
3272 | state->num_user_structures++; |
||
3273 | } |
||
3274 | } |
||
3275 | |||
3276 | /* Structure type definitions do not have r-values. |
||
3277 | */ |
||
3278 | return NULL; |
||
3279 | }>=>=>>=>>=>>>>>=>=>=>=>>=>>>>)><)>>=)>),>>>> |