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#include "glsl_symbol_table.h"
25#include "ast.h"
26#include "compiler/glsl_types.h"
27#include "ir.h"
28#include "main/shader_types.h"
29#include "main/consts_exts.h"
30#include "main/shaderobj.h"
31#include "builtin_functions.h"
32
33static ir_rvalue *
34convert_component(ir_rvalue *src, const glsl_type *desired_type);
35
36static unsigned
37process_parameters(exec_list *instructions, exec_list *actual_parameters,
38                   exec_list *parameters,
39                   struct _mesa_glsl_parse_state *state)
40{
41   void *mem_ctx = state;
42   unsigned count = 0;
43
44   foreach_list_typed(ast_node, ast, link, parameters) {
45      /* We need to process the parameters first in order to know if we can
46       * raise or not a unitialized warning. Calling set_is_lhs silence the
47       * warning for now. Raising the warning or not will be checked at
48       * verify_parameter_modes.
49       */
50      ast->set_is_lhs(true);
51      ir_rvalue *result = ast->hir(instructions, state);
52
53      /* Error happened processing function parameter */
54      if (!result) {
55         actual_parameters->push_tail(ir_rvalue::error_value(mem_ctx));
56         count++;
57         continue;
58      }
59
60      ir_constant *const constant =
61         result->constant_expression_value(mem_ctx);
62
63      if (constant != NULL)
64         result = constant;
65
66      actual_parameters->push_tail(result);
67      count++;
68   }
69
70   return count;
71}
72
73
74/**
75 * Generate a source prototype for a function signature
76 *
77 * \param return_type Return type of the function.  May be \c NULL.
78 * \param name        Name of the function.
79 * \param parameters  List of \c ir_instruction nodes representing the
80 *                    parameter list for the function.  This may be either a
81 *                    formal (\c ir_variable) or actual (\c ir_rvalue)
82 *                    parameter list.  Only the type is used.
83 *
84 * \return
85 * A ralloced string representing the prototype of the function.
86 */
87char *
88prototype_string(const glsl_type *return_type, const char *name,
89                 exec_list *parameters)
90{
91   char *str = NULL;
92
93   if (return_type != NULL)
94      str = ralloc_asprintf(NULL, "%s ", return_type->name);
95
96   ralloc_asprintf_append(&str, "%s(", name);
97
98   const char *comma = "";
99   foreach_in_list(const ir_variable, param, parameters) {
100      ralloc_asprintf_append(&str, "%s%s", comma, param->type->name);
101      comma = ", ";
102   }
103
104   ralloc_strcat(&str, ")");
105   return str;
106}
107
108static bool
109verify_image_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state,
110                       const ir_variable *formal, const ir_variable *actual)
111{
112   /**
113    * From the ARB_shader_image_load_store specification:
114    *
115    * "The values of image variables qualified with coherent,
116    *  volatile, restrict, readonly, or writeonly may not be passed
117    *  to functions whose formal parameters lack such
118    *  qualifiers. [...] It is legal to have additional qualifiers
119    *  on a formal parameter, but not to have fewer."
120    */
121   if (actual->data.memory_coherent && !formal->data.memory_coherent) {
122      _mesa_glsl_error(loc, state,
123                       "function call parameter `%s' drops "
124                       "`coherent' qualifier", formal->name);
125      return false;
126   }
127
128   if (actual->data.memory_volatile && !formal->data.memory_volatile) {
129      _mesa_glsl_error(loc, state,
130                       "function call parameter `%s' drops "
131                       "`volatile' qualifier", formal->name);
132      return false;
133   }
134
135   if (actual->data.memory_restrict && !formal->data.memory_restrict) {
136      _mesa_glsl_error(loc, state,
137                       "function call parameter `%s' drops "
138                       "`restrict' qualifier", formal->name);
139      return false;
140   }
141
142   if (actual->data.memory_read_only && !formal->data.memory_read_only) {
143      _mesa_glsl_error(loc, state,
144                       "function call parameter `%s' drops "
145                       "`readonly' qualifier", formal->name);
146      return false;
147   }
148
149   if (actual->data.memory_write_only && !formal->data.memory_write_only) {
150      _mesa_glsl_error(loc, state,
151                       "function call parameter `%s' drops "
152                       "`writeonly' qualifier", formal->name);
153      return false;
154   }
155
156   return true;
157}
158
159static bool
160verify_first_atomic_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state,
161                              ir_variable *var)
162{
163   if (!var ||
164       (!var->is_in_shader_storage_block() &&
165        var->data.mode != ir_var_shader_shared)) {
166      _mesa_glsl_error(loc, state, "First argument to atomic function "
167                       "must be a buffer or shared variable");
168      return false;
169   }
170   return true;
171}
172
173static bool
174is_atomic_function(const char *func_name)
175{
176   return !strcmp(func_name, "atomicAdd") ||
177          !strcmp(func_name, "atomicMin") ||
178          !strcmp(func_name, "atomicMax") ||
179          !strcmp(func_name, "atomicAnd") ||
180          !strcmp(func_name, "atomicOr") ||
181          !strcmp(func_name, "atomicXor") ||
182          !strcmp(func_name, "atomicExchange") ||
183          !strcmp(func_name, "atomicCompSwap");
184}
185
186static bool
187verify_atomic_image_parameter_qualifier(YYLTYPE *loc, _mesa_glsl_parse_state *state,
188                                        ir_variable *var)
189{
190   if (!var ||
191       (var->data.image_format != PIPE_FORMAT_R32_UINT &&
192        var->data.image_format != PIPE_FORMAT_R32_SINT &&
193        var->data.image_format != PIPE_FORMAT_R32_FLOAT)) {
194      _mesa_glsl_error(loc, state, "Image atomic functions should use r32i/r32ui "
195                       "format qualifier");
196      return false;
197   }
198   return true;
199}
200
201static bool
202is_atomic_image_function(const char *func_name)
203{
204   return !strcmp(func_name, "imageAtomicAdd") ||
205          !strcmp(func_name, "imageAtomicMin") ||
206          !strcmp(func_name, "imageAtomicMax") ||
207          !strcmp(func_name, "imageAtomicAnd") ||
208          !strcmp(func_name, "imageAtomicOr") ||
209          !strcmp(func_name, "imageAtomicXor") ||
210          !strcmp(func_name, "imageAtomicExchange") ||
211          !strcmp(func_name, "imageAtomicCompSwap") ||
212          !strcmp(func_name, "imageAtomicIncWrap") ||
213          !strcmp(func_name, "imageAtomicDecWrap");
214}
215
216
217/**
218 * Verify that 'out' and 'inout' actual parameters are lvalues.  Also, verify
219 * that 'const_in' formal parameters (an extension in our IR) correspond to
220 * ir_constant actual parameters.
221 */
222static bool
223verify_parameter_modes(_mesa_glsl_parse_state *state,
224                       ir_function_signature *sig,
225                       exec_list &actual_ir_parameters,
226                       exec_list &actual_ast_parameters)
227{
228   exec_node *actual_ir_node  = actual_ir_parameters.get_head_raw();
229   exec_node *actual_ast_node = actual_ast_parameters.get_head_raw();
230
231   foreach_in_list(const ir_variable, formal, &sig->parameters) {
232      /* The lists must be the same length. */
233      assert(!actual_ir_node->is_tail_sentinel());
234      assert(!actual_ast_node->is_tail_sentinel());
235
236      const ir_rvalue *const actual = (ir_rvalue *) actual_ir_node;
237      const ast_expression *const actual_ast =
238         exec_node_data(ast_expression, actual_ast_node, link);
239
240      YYLTYPE loc = actual_ast->get_location();
241
242      /* Verify that 'const_in' parameters are ir_constants. */
243      if (formal->data.mode == ir_var_const_in &&
244          actual->ir_type != ir_type_constant) {
245         _mesa_glsl_error(&loc, state,
246                          "parameter `in %s' must be a constant expression",
247                          formal->name);
248         return false;
249      }
250
251      /* Verify that shader_in parameters are shader inputs */
252      if (formal->data.must_be_shader_input) {
253         const ir_rvalue *val = actual;
254
255         /* GLSL 4.40 allows swizzles, while earlier GLSL versions do not. */
256         if (val->ir_type == ir_type_swizzle) {
257            if (!state->is_version(440, 0)) {
258               _mesa_glsl_error(&loc, state,
259                                "parameter `%s` must not be swizzled",
260                                formal->name);
261               return false;
262            }
263            val = ((ir_swizzle *)val)->val;
264         }
265
266         for (;;) {
267            if (val->ir_type == ir_type_dereference_array) {
268               val = ((ir_dereference_array *)val)->array;
269            } else if (val->ir_type == ir_type_dereference_record &&
270                       !state->es_shader) {
271               val = ((ir_dereference_record *)val)->record;
272            } else
273               break;
274         }
275
276         ir_variable *var = NULL;
277         if (const ir_dereference_variable *deref_var = val->as_dereference_variable())
278            var = deref_var->variable_referenced();
279
280         if (!var || var->data.mode != ir_var_shader_in) {
281            _mesa_glsl_error(&loc, state,
282                             "parameter `%s` must be a shader input",
283                             formal->name);
284            return false;
285         }
286
287         var->data.must_be_shader_input = 1;
288      }
289
290      /* Verify that 'out' and 'inout' actual parameters are lvalues. */
291      if (formal->data.mode == ir_var_function_out
292          || formal->data.mode == ir_var_function_inout) {
293         const char *mode = NULL;
294         switch (formal->data.mode) {
295         case ir_var_function_out:   mode = "out";   break;
296         case ir_var_function_inout: mode = "inout"; break;
297         default:                    assert(false);  break;
298         }
299
300         /* This AST-based check catches errors like f(i++).  The IR-based
301          * is_lvalue() is insufficient because the actual parameter at the
302          * IR-level is just a temporary value, which is an l-value.
303          */
304         if (actual_ast->non_lvalue_description != NULL) {
305            _mesa_glsl_error(&loc, state,
306                             "function parameter '%s %s' references a %s",
307                             mode, formal->name,
308                             actual_ast->non_lvalue_description);
309            return false;
310         }
311
312         ir_variable *var = actual->variable_referenced();
313
314         if (var && formal->data.mode == ir_var_function_inout) {
315            if ((var->data.mode == ir_var_auto ||
316                 var->data.mode == ir_var_shader_out) &&
317                !var->data.assigned &&
318                !is_gl_identifier(var->name)) {
319               _mesa_glsl_warning(&loc, state, "`%s' used uninitialized",
320                                  var->name);
321            }
322         }
323
324         if (var)
325            var->data.assigned = true;
326
327         if (var && var->data.read_only) {
328            _mesa_glsl_error(&loc, state,
329                             "function parameter '%s %s' references the "
330                             "read-only variable '%s'",
331                             mode, formal->name,
332                             actual->variable_referenced()->name);
333            return false;
334         } else if (!actual->is_lvalue(state)) {
335            _mesa_glsl_error(&loc, state,
336                             "function parameter '%s %s' is not an lvalue",
337                             mode, formal->name);
338            return false;
339         }
340      } else {
341         assert(formal->data.mode == ir_var_function_in ||
342                formal->data.mode == ir_var_const_in);
343         ir_variable *var = actual->variable_referenced();
344         if (var) {
345            if ((var->data.mode == ir_var_auto ||
346                 var->data.mode == ir_var_shader_out) &&
347                !var->data.assigned &&
348                !is_gl_identifier(var->name)) {
349               _mesa_glsl_warning(&loc, state, "`%s' used uninitialized",
350                                  var->name);
351            }
352         }
353      }
354
355      if (formal->type->is_image() &&
356          actual->variable_referenced()) {
357         if (!verify_image_parameter(&loc, state, formal,
358                                     actual->variable_referenced()))
359            return false;
360      }
361
362      actual_ir_node  = actual_ir_node->next;
363      actual_ast_node = actual_ast_node->next;
364   }
365
366   /* The first parameter of atomic functions must be a buffer variable */
367   const char *func_name = sig->function_name();
368   bool is_atomic = is_atomic_function(func_name);
369   if (is_atomic) {
370      const ir_rvalue *const actual =
371         (ir_rvalue *) actual_ir_parameters.get_head_raw();
372
373      const ast_expression *const actual_ast =
374         exec_node_data(ast_expression,
375                        actual_ast_parameters.get_head_raw(), link);
376      YYLTYPE loc = actual_ast->get_location();
377
378      if (!verify_first_atomic_parameter(&loc, state,
379                                         actual->variable_referenced())) {
380         return false;
381      }
382   } else if (is_atomic_image_function(func_name)) {
383      const ir_rvalue *const actual =
384         (ir_rvalue *) actual_ir_parameters.get_head_raw();
385
386      const ast_expression *const actual_ast =
387         exec_node_data(ast_expression,
388                        actual_ast_parameters.get_head_raw(), link);
389      YYLTYPE loc = actual_ast->get_location();
390
391      if (!verify_atomic_image_parameter_qualifier(&loc, state,
392                                         actual->variable_referenced())) {
393         return false;
394      }
395   }
396
397   return true;
398}
399
400struct copy_index_deref_data {
401   void *mem_ctx;
402   exec_list *before_instructions;
403};
404
405static void
406copy_index_derefs_to_temps(ir_instruction *ir, void *data)
407{
408   struct copy_index_deref_data *d = (struct copy_index_deref_data *)data;
409
410   if (ir->ir_type == ir_type_dereference_array) {
411      ir_dereference_array *a = (ir_dereference_array *) ir;
412      ir = a->array->as_dereference();
413
414      ir_rvalue *idx = a->array_index;
415      ir_variable *var = idx->variable_referenced();
416
417      /* If the index is read only it cannot change so there is no need
418       * to copy it.
419       */
420      if (!var || var->data.read_only || var->data.memory_read_only)
421         return;
422
423      ir_variable *tmp = new(d->mem_ctx) ir_variable(idx->type, "idx_tmp",
424                                                      ir_var_temporary);
425      d->before_instructions->push_tail(tmp);
426
427      ir_dereference_variable *const deref_tmp_1 =
428         new(d->mem_ctx) ir_dereference_variable(tmp);
429      ir_assignment *const assignment =
430         new(d->mem_ctx) ir_assignment(deref_tmp_1,
431                                       idx->clone(d->mem_ctx, NULL));
432      d->before_instructions->push_tail(assignment);
433
434      /* Replace the array index with a dereference of the new temporary */
435      ir_dereference_variable *const deref_tmp_2 =
436         new(d->mem_ctx) ir_dereference_variable(tmp);
437      a->array_index = deref_tmp_2;
438   }
439}
440
441static void
442fix_parameter(void *mem_ctx, ir_rvalue *actual, const glsl_type *formal_type,
443              exec_list *before_instructions, exec_list *after_instructions,
444              bool parameter_is_inout)
445{
446   ir_expression *const expr = actual->as_expression();
447
448   /* If the types match exactly and the parameter is not a vector-extract,
449    * nothing needs to be done to fix the parameter.
450    */
451   if (formal_type == actual->type
452       && (expr == NULL || expr->operation != ir_binop_vector_extract)
453       && actual->as_dereference_variable())
454      return;
455
456   /* An array index could also be an out variable so we need to make a copy
457    * of them before the function is called.
458    */
459   if (!actual->as_dereference_variable()) {
460      struct copy_index_deref_data data;
461      data.mem_ctx = mem_ctx;
462      data.before_instructions = before_instructions;
463
464      visit_tree(actual, copy_index_derefs_to_temps, &data);
465   }
466
467   /* To convert an out parameter, we need to create a temporary variable to
468    * hold the value before conversion, and then perform the conversion after
469    * the function call returns.
470    *
471    * This has the effect of transforming code like this:
472    *
473    *   void f(out int x);
474    *   float value;
475    *   f(value);
476    *
477    * Into IR that's equivalent to this:
478    *
479    *   void f(out int x);
480    *   float value;
481    *   int out_parameter_conversion;
482    *   f(out_parameter_conversion);
483    *   value = float(out_parameter_conversion);
484    *
485    * If the parameter is an ir_expression of ir_binop_vector_extract,
486    * additional conversion is needed in the post-call re-write.
487    */
488   ir_variable *tmp =
489      new(mem_ctx) ir_variable(formal_type, "inout_tmp", ir_var_temporary);
490
491   before_instructions->push_tail(tmp);
492
493   /* If the parameter is an inout parameter, copy the value of the actual
494    * parameter to the new temporary.  Note that no type conversion is allowed
495    * here because inout parameters must match types exactly.
496    */
497   if (parameter_is_inout) {
498      /* Inout parameters should never require conversion, since that would
499       * require an implicit conversion to exist both to and from the formal
500       * parameter type, and there are no bidirectional implicit conversions.
501       */
502      assert (actual->type == formal_type);
503
504      ir_dereference_variable *const deref_tmp_1 =
505         new(mem_ctx) ir_dereference_variable(tmp);
506      ir_assignment *const assignment =
507         new(mem_ctx) ir_assignment(deref_tmp_1, actual->clone(mem_ctx, NULL));
508      before_instructions->push_tail(assignment);
509   }
510
511   /* Replace the parameter in the call with a dereference of the new
512    * temporary.
513    */
514   ir_dereference_variable *const deref_tmp_2 =
515      new(mem_ctx) ir_dereference_variable(tmp);
516   actual->replace_with(deref_tmp_2);
517
518
519   /* Copy the temporary variable to the actual parameter with optional
520    * type conversion applied.
521    */
522   ir_rvalue *rhs = new(mem_ctx) ir_dereference_variable(tmp);
523   if (actual->type != formal_type)
524      rhs = convert_component(rhs, actual->type);
525
526   ir_rvalue *lhs = actual;
527   if (expr != NULL && expr->operation == ir_binop_vector_extract) {
528      lhs = new(mem_ctx) ir_dereference_array(expr->operands[0]->clone(mem_ctx,
529                                                                       NULL),
530                                              expr->operands[1]->clone(mem_ctx,
531                                                                       NULL));
532   }
533
534   ir_assignment *const assignment_2 = new(mem_ctx) ir_assignment(lhs, rhs);
535   after_instructions->push_tail(assignment_2);
536}
537
538/**
539 * Generate a function call.
540 *
541 * For non-void functions, this returns a dereference of the temporary
542 * variable which stores the return value for the call.  For void functions,
543 * this returns NULL.
544 */
545static ir_rvalue *
546generate_call(exec_list *instructions, ir_function_signature *sig,
547              exec_list *actual_parameters,
548              ir_variable *sub_var,
549              ir_rvalue *array_idx,
550              struct _mesa_glsl_parse_state *state)
551{
552   void *ctx = state;
553   exec_list post_call_conversions;
554
555   /* Perform implicit conversion of arguments.  For out parameters, we need
556    * to place them in a temporary variable and do the conversion after the
557    * call takes place.  Since we haven't emitted the call yet, we'll place
558    * the post-call conversions in a temporary exec_list, and emit them later.
559    */
560   foreach_two_lists(formal_node, &sig->parameters,
561                     actual_node, actual_parameters) {
562      ir_rvalue *actual = (ir_rvalue *) actual_node;
563      ir_variable *formal = (ir_variable *) formal_node;
564
565      if (formal->type->is_numeric() || formal->type->is_boolean()) {
566         switch (formal->data.mode) {
567         case ir_var_const_in:
568         case ir_var_function_in: {
569            ir_rvalue *converted
570               = convert_component(actual, formal->type);
571            actual->replace_with(converted);
572            break;
573         }
574         case ir_var_function_out:
575         case ir_var_function_inout:
576            fix_parameter(ctx, actual, formal->type,
577                          instructions, &post_call_conversions,
578                          formal->data.mode == ir_var_function_inout);
579            break;
580         default:
581            assert (!"Illegal formal parameter mode");
582            break;
583         }
584      }
585   }
586
587   /* Section 4.3.2 (Const) of the GLSL 1.10.59 spec says:
588    *
589    *     "Initializers for const declarations must be formed from literal
590    *     values, other const variables (not including function call
591    *     paramaters), or expressions of these.
592    *
593    *     Constructors may be used in such expressions, but function calls may
594    *     not."
595    *
596    * Section 4.3.3 (Constant Expressions) of the GLSL 1.20.8 spec says:
597    *
598    *     "A constant expression is one of
599    *
600    *         ...
601    *
602    *         - a built-in function call whose arguments are all constant
603    *           expressions, with the exception of the texture lookup
604    *           functions, the noise functions, and ftransform. The built-in
605    *           functions dFdx, dFdy, and fwidth must return 0 when evaluated
606    *           inside an initializer with an argument that is a constant
607    *           expression."
608    *
609    * Section 5.10 (Constant Expressions) of the GLSL ES 1.00.17 spec says:
610    *
611    *     "A constant expression is one of
612    *
613    *         ...
614    *
615    *         - a built-in function call whose arguments are all constant
616    *           expressions, with the exception of the texture lookup
617    *           functions."
618    *
619    * Section 4.3.3 (Constant Expressions) of the GLSL ES 3.00.4 spec says:
620    *
621    *     "A constant expression is one of
622    *
623    *         ...
624    *
625    *         - a built-in function call whose arguments are all constant
626    *           expressions, with the exception of the texture lookup
627    *           functions.  The built-in functions dFdx, dFdy, and fwidth must
628    *           return 0 when evaluated inside an initializer with an argument
629    *           that is a constant expression."
630    *
631    * If the function call is a constant expression, don't generate any
632    * instructions; just generate an ir_constant.
633    */
634   if (state->is_version(120, 100) ||
635       state->consts->AllowGLSLBuiltinConstantExpression) {
636      ir_constant *value = sig->constant_expression_value(ctx,
637                                                          actual_parameters,
638                                                          NULL);
639      if (value != NULL) {
640         return value;
641      }
642   }
643
644   ir_dereference_variable *deref = NULL;
645   if (!sig->return_type->is_void()) {
646      /* Create a new temporary to hold the return value. */
647      char *const name = ir_variable::temporaries_allocate_names
648         ? ralloc_asprintf(ctx, "%s_retval", sig->function_name())
649         : NULL;
650
651      ir_variable *var;
652
653      var = new(ctx) ir_variable(sig->return_type, name, ir_var_temporary);
654      instructions->push_tail(var);
655
656      ralloc_free(name);
657
658      deref = new(ctx) ir_dereference_variable(var);
659   }
660
661   ir_call *call = new(ctx) ir_call(sig, deref,
662                                    actual_parameters, sub_var, array_idx);
663   instructions->push_tail(call);
664
665   /* Also emit any necessary out-parameter conversions. */
666   instructions->append_list(&post_call_conversions);
667
668   return deref ? deref->clone(ctx, NULL) : NULL;
669}
670
671/**
672 * Given a function name and parameter list, find the matching signature.
673 */
674static ir_function_signature *
675match_function_by_name(const char *name,
676                       exec_list *actual_parameters,
677                       struct _mesa_glsl_parse_state *state)
678{
679   ir_function *f = state->symbols->get_function(name);
680   ir_function_signature *local_sig = NULL;
681   ir_function_signature *sig = NULL;
682
683   /* Is the function hidden by a record type constructor? */
684   if (state->symbols->get_type(name))
685      return sig; /* no match */
686
687   /* Is the function hidden by a variable (impossible in 1.10)? */
688   if (!state->symbols->separate_function_namespace
689       && state->symbols->get_variable(name))
690      return sig; /* no match */
691
692   if (f != NULL) {
693      /* In desktop GL, the presence of a user-defined signature hides any
694       * built-in signatures, so we must ignore them.  In contrast, in ES2
695       * user-defined signatures add new overloads, so we must consider them.
696       */
697      bool allow_builtins = state->es_shader || !f->has_user_signature();
698
699      /* Look for a match in the local shader.  If exact, we're done. */
700      bool is_exact = false;
701      sig = local_sig = f->matching_signature(state, actual_parameters,
702                                              allow_builtins, &is_exact);
703      if (is_exact)
704         return sig;
705
706      if (!allow_builtins)
707         return sig;
708   }
709
710   /* Local shader has no exact candidates; check the built-ins. */
711   sig = _mesa_glsl_find_builtin_function(state, name, actual_parameters);
712
713   /* if _mesa_glsl_find_builtin_function failed, fall back to the result
714    * of choose_best_inexact_overload() instead. This should only affect
715    * GLES.
716    */
717   return sig ? sig : local_sig;
718}
719
720static ir_function_signature *
721match_subroutine_by_name(const char *name,
722                         exec_list *actual_parameters,
723                         struct _mesa_glsl_parse_state *state,
724                         ir_variable **var_r)
725{
726   void *ctx = state;
727   ir_function_signature *sig = NULL;
728   ir_function *f, *found = NULL;
729   const char *new_name;
730   ir_variable *var;
731   bool is_exact = false;
732
733   new_name =
734      ralloc_asprintf(ctx, "%s_%s",
735                      _mesa_shader_stage_to_subroutine_prefix(state->stage),
736                      name);
737   var = state->symbols->get_variable(new_name);
738   if (!var)
739      return NULL;
740
741   for (int i = 0; i < state->num_subroutine_types; i++) {
742      f = state->subroutine_types[i];
743      if (strcmp(f->name, var->type->without_array()->name))
744         continue;
745      found = f;
746      break;
747   }
748
749   if (!found)
750      return NULL;
751   *var_r = var;
752   sig = found->matching_signature(state, actual_parameters,
753                                   false, &is_exact);
754   return sig;
755}
756
757static ir_rvalue *
758generate_array_index(void *mem_ctx, exec_list *instructions,
759                     struct _mesa_glsl_parse_state *state, YYLTYPE loc,
760                     const ast_expression *array, ast_expression *idx,
761                     const char **function_name, exec_list *actual_parameters)
762{
763   if (array->oper == ast_array_index) {
764      /* This handles arrays of arrays */
765      ir_rvalue *outer_array = generate_array_index(mem_ctx, instructions,
766                                                    state, loc,
767                                                    array->subexpressions[0],
768                                                    array->subexpressions[1],
769                                                    function_name,
770                                                    actual_parameters);
771      ir_rvalue *outer_array_idx = idx->hir(instructions, state);
772
773      YYLTYPE index_loc = idx->get_location();
774      return _mesa_ast_array_index_to_hir(mem_ctx, state, outer_array,
775                                          outer_array_idx, loc,
776                                          index_loc);
777   } else {
778      ir_variable *sub_var = NULL;
779      *function_name = array->primary_expression.identifier;
780
781      if (!match_subroutine_by_name(*function_name, actual_parameters,
782                                    state, &sub_var)) {
783         _mesa_glsl_error(&loc, state, "Unknown subroutine `%s'",
784                          *function_name);
785         *function_name = NULL; /* indicate error condition to caller */
786         return NULL;
787      }
788
789      ir_rvalue *outer_array_idx = idx->hir(instructions, state);
790      return new(mem_ctx) ir_dereference_array(sub_var, outer_array_idx);
791   }
792}
793
794static bool
795function_exists(_mesa_glsl_parse_state *state,
796                struct glsl_symbol_table *symbols, const char *name)
797{
798   ir_function *f = symbols->get_function(name);
799   if (f != NULL) {
800      foreach_in_list(ir_function_signature, sig, &f->signatures) {
801         if (sig->is_builtin() && !sig->is_builtin_available(state))
802            continue;
803         return true;
804      }
805   }
806   return false;
807}
808
809static void
810print_function_prototypes(_mesa_glsl_parse_state *state, YYLTYPE *loc,
811                          ir_function *f)
812{
813   if (f == NULL)
814      return;
815
816   foreach_in_list(ir_function_signature, sig, &f->signatures) {
817      if (sig->is_builtin() && !sig->is_builtin_available(state))
818         continue;
819
820      char *str = prototype_string(sig->return_type, f->name,
821                                   &sig->parameters);
822      _mesa_glsl_error(loc, state, "   %s", str);
823      ralloc_free(str);
824   }
825}
826
827/**
828 * Raise a "no matching function" error, listing all possible overloads the
829 * compiler considered so developers can figure out what went wrong.
830 */
831static void
832no_matching_function_error(const char *name,
833                           YYLTYPE *loc,
834                           exec_list *actual_parameters,
835                           _mesa_glsl_parse_state *state)
836{
837   gl_shader *sh = _mesa_glsl_get_builtin_function_shader();
838
839   if (!function_exists(state, state->symbols, name)
840       && (!state->uses_builtin_functions
841           || !function_exists(state, sh->symbols, name))) {
842      _mesa_glsl_error(loc, state, "no function with name '%s'", name);
843   } else {
844      char *str = prototype_string(NULL, name, actual_parameters);
845      _mesa_glsl_error(loc, state,
846                       "no matching function for call to `%s';"
847                       " candidates are:",
848                       str);
849      ralloc_free(str);
850
851      print_function_prototypes(state, loc,
852                                state->symbols->get_function(name));
853
854      if (state->uses_builtin_functions) {
855         print_function_prototypes(state, loc,
856                                   sh->symbols->get_function(name));
857      }
858   }
859}
860
861/**
862 * Perform automatic type conversion of constructor parameters
863 *
864 * This implements the rules in the "Conversion and Scalar Constructors"
865 * section (GLSL 1.10 section 5.4.1), not the "Implicit Conversions" rules.
866 */
867static ir_rvalue *
868convert_component(ir_rvalue *src, const glsl_type *desired_type)
869{
870   void *ctx = ralloc_parent(src);
871   const unsigned a = desired_type->base_type;
872   const unsigned b = src->type->base_type;
873   ir_expression *result = NULL;
874
875   if (src->type->is_error())
876      return src;
877
878   assert(a <= GLSL_TYPE_IMAGE);
879   assert(b <= GLSL_TYPE_IMAGE);
880
881   if (a == b)
882      return src;
883
884   switch (a) {
885   case GLSL_TYPE_UINT:
886      switch (b) {
887      case GLSL_TYPE_INT:
888         result = new(ctx) ir_expression(ir_unop_i2u, src);
889         break;
890      case GLSL_TYPE_FLOAT:
891         result = new(ctx) ir_expression(ir_unop_f2u, src);
892         break;
893      case GLSL_TYPE_BOOL:
894         result = new(ctx) ir_expression(ir_unop_i2u,
895                                         new(ctx) ir_expression(ir_unop_b2i,
896                                                                src));
897         break;
898      case GLSL_TYPE_DOUBLE:
899         result = new(ctx) ir_expression(ir_unop_d2u, src);
900         break;
901      case GLSL_TYPE_UINT64:
902         result = new(ctx) ir_expression(ir_unop_u642u, src);
903         break;
904      case GLSL_TYPE_INT64:
905         result = new(ctx) ir_expression(ir_unop_i642u, src);
906         break;
907      case GLSL_TYPE_SAMPLER:
908         result = new(ctx) ir_expression(ir_unop_unpack_sampler_2x32, src);
909         break;
910      case GLSL_TYPE_IMAGE:
911         result = new(ctx) ir_expression(ir_unop_unpack_image_2x32, src);
912         break;
913      }
914      break;
915   case GLSL_TYPE_INT:
916      switch (b) {
917      case GLSL_TYPE_UINT:
918         result = new(ctx) ir_expression(ir_unop_u2i, src);
919         break;
920      case GLSL_TYPE_FLOAT:
921         result = new(ctx) ir_expression(ir_unop_f2i, src);
922         break;
923      case GLSL_TYPE_BOOL:
924         result = new(ctx) ir_expression(ir_unop_b2i, src);
925         break;
926      case GLSL_TYPE_DOUBLE:
927         result = new(ctx) ir_expression(ir_unop_d2i, src);
928         break;
929      case GLSL_TYPE_UINT64:
930         result = new(ctx) ir_expression(ir_unop_u642i, src);
931         break;
932      case GLSL_TYPE_INT64:
933         result = new(ctx) ir_expression(ir_unop_i642i, src);
934         break;
935      }
936      break;
937   case GLSL_TYPE_FLOAT:
938      switch (b) {
939      case GLSL_TYPE_UINT:
940         result = new(ctx) ir_expression(ir_unop_u2f, desired_type, src, NULL);
941         break;
942      case GLSL_TYPE_INT:
943         result = new(ctx) ir_expression(ir_unop_i2f, desired_type, src, NULL);
944         break;
945      case GLSL_TYPE_BOOL:
946         result = new(ctx) ir_expression(ir_unop_b2f, desired_type, src, NULL);
947         break;
948      case GLSL_TYPE_DOUBLE:
949         result = new(ctx) ir_expression(ir_unop_d2f, desired_type, src, NULL);
950         break;
951      case GLSL_TYPE_UINT64:
952         result = new(ctx) ir_expression(ir_unop_u642f, desired_type, src, NULL);
953         break;
954      case GLSL_TYPE_INT64:
955         result = new(ctx) ir_expression(ir_unop_i642f, desired_type, src, NULL);
956         break;
957      }
958      break;
959   case GLSL_TYPE_BOOL:
960      switch (b) {
961      case GLSL_TYPE_UINT:
962         result = new(ctx) ir_expression(ir_unop_i2b,
963                                         new(ctx) ir_expression(ir_unop_u2i,
964                                                                src));
965         break;
966      case GLSL_TYPE_INT:
967         result = new(ctx) ir_expression(ir_unop_i2b, desired_type, src, NULL);
968         break;
969      case GLSL_TYPE_FLOAT:
970         result = new(ctx) ir_expression(ir_unop_f2b, desired_type, src, NULL);
971         break;
972      case GLSL_TYPE_DOUBLE:
973         result = new(ctx) ir_expression(ir_unop_d2b, desired_type, src, NULL);
974         break;
975      case GLSL_TYPE_UINT64:
976         result = new(ctx) ir_expression(ir_unop_i642b,
977                                         new(ctx) ir_expression(ir_unop_u642i64,
978                                                                src));
979         break;
980      case GLSL_TYPE_INT64:
981         result = new(ctx) ir_expression(ir_unop_i642b, desired_type, src, NULL);
982         break;
983      }
984      break;
985   case GLSL_TYPE_DOUBLE:
986      switch (b) {
987      case GLSL_TYPE_INT:
988         result = new(ctx) ir_expression(ir_unop_i2d, src);
989         break;
990      case GLSL_TYPE_UINT:
991         result = new(ctx) ir_expression(ir_unop_u2d, src);
992         break;
993      case GLSL_TYPE_BOOL:
994         result = new(ctx) ir_expression(ir_unop_f2d,
995                                         new(ctx) ir_expression(ir_unop_b2f,
996                                                                src));
997         break;
998      case GLSL_TYPE_FLOAT:
999         result = new(ctx) ir_expression(ir_unop_f2d, desired_type, src, NULL);
1000         break;
1001      case GLSL_TYPE_UINT64:
1002         result = new(ctx) ir_expression(ir_unop_u642d, desired_type, src, NULL);
1003         break;
1004      case GLSL_TYPE_INT64:
1005         result = new(ctx) ir_expression(ir_unop_i642d, desired_type, src, NULL);
1006         break;
1007      }
1008      break;
1009   case GLSL_TYPE_UINT64:
1010      switch (b) {
1011      case GLSL_TYPE_INT:
1012         result = new(ctx) ir_expression(ir_unop_i2u64, src);
1013         break;
1014      case GLSL_TYPE_UINT:
1015         result = new(ctx) ir_expression(ir_unop_u2u64, src);
1016         break;
1017      case GLSL_TYPE_BOOL:
1018         result = new(ctx) ir_expression(ir_unop_i642u64,
1019                                         new(ctx) ir_expression(ir_unop_b2i64,
1020                                                                src));
1021         break;
1022      case GLSL_TYPE_FLOAT:
1023         result = new(ctx) ir_expression(ir_unop_f2u64, src);
1024         break;
1025      case GLSL_TYPE_DOUBLE:
1026         result = new(ctx) ir_expression(ir_unop_d2u64, src);
1027         break;
1028      case GLSL_TYPE_INT64:
1029         result = new(ctx) ir_expression(ir_unop_i642u64, src);
1030         break;
1031      }
1032      break;
1033   case GLSL_TYPE_INT64:
1034      switch (b) {
1035      case GLSL_TYPE_INT:
1036         result = new(ctx) ir_expression(ir_unop_i2i64, src);
1037         break;
1038      case GLSL_TYPE_UINT:
1039         result = new(ctx) ir_expression(ir_unop_u2i64, src);
1040         break;
1041      case GLSL_TYPE_BOOL:
1042         result = new(ctx) ir_expression(ir_unop_b2i64, src);
1043         break;
1044      case GLSL_TYPE_FLOAT:
1045         result = new(ctx) ir_expression(ir_unop_f2i64, src);
1046         break;
1047      case GLSL_TYPE_DOUBLE:
1048         result = new(ctx) ir_expression(ir_unop_d2i64, src);
1049         break;
1050      case GLSL_TYPE_UINT64:
1051         result = new(ctx) ir_expression(ir_unop_u642i64, src);
1052         break;
1053      }
1054      break;
1055   case GLSL_TYPE_SAMPLER:
1056      switch (b) {
1057      case GLSL_TYPE_UINT:
1058         result = new(ctx)
1059            ir_expression(ir_unop_pack_sampler_2x32, desired_type, src);
1060         break;
1061      }
1062      break;
1063   case GLSL_TYPE_IMAGE:
1064      switch (b) {
1065      case GLSL_TYPE_UINT:
1066         result = new(ctx)
1067            ir_expression(ir_unop_pack_image_2x32, desired_type, src);
1068         break;
1069      }
1070      break;
1071   }
1072
1073   assert(result != NULL);
1074   assert(result->type == desired_type);
1075
1076   /* Try constant folding; it may fold in the conversion we just added. */
1077   ir_constant *const constant = result->constant_expression_value(ctx);
1078   return (constant != NULL) ? (ir_rvalue *) constant : (ir_rvalue *) result;
1079}
1080
1081
1082/**
1083 * Perform automatic type and constant conversion of constructor parameters
1084 *
1085 * This implements the rules in the "Implicit Conversions" rules, not the
1086 * "Conversion and Scalar Constructors".
1087 *
1088 * After attempting the implicit conversion, an attempt to convert into a
1089 * constant valued expression is also done.
1090 *
1091 * The \c from \c ir_rvalue is converted "in place".
1092 *
1093 * \param from   Operand that is being converted
1094 * \param to     Base type the operand will be converted to
1095 * \param state  GLSL compiler state
1096 *
1097 * \return
1098 * If the attempt to convert into a constant expression succeeds, \c true is
1099 * returned. Otherwise \c false is returned.
1100 */
1101static bool
1102implicitly_convert_component(ir_rvalue * &from, const glsl_base_type to,
1103                             struct _mesa_glsl_parse_state *state)
1104{
1105   void *mem_ctx = state;
1106   ir_rvalue *result = from;
1107
1108   if (to != from->type->base_type) {
1109      const glsl_type *desired_type =
1110         glsl_type::get_instance(to,
1111                                 from->type->vector_elements,
1112                                 from->type->matrix_columns);
1113
1114      if (from->type->can_implicitly_convert_to(desired_type, state)) {
1115         /* Even though convert_component() implements the constructor
1116          * conversion rules (not the implicit conversion rules), its safe
1117          * to use it here because we already checked that the implicit
1118          * conversion is legal.
1119          */
1120         result = convert_component(from, desired_type);
1121      }
1122   }
1123
1124   ir_rvalue *const constant = result->constant_expression_value(mem_ctx);
1125
1126   if (constant != NULL)
1127      result = constant;
1128
1129   if (from != result) {
1130      from->replace_with(result);
1131      from = result;
1132   }
1133
1134   return constant != NULL;
1135}
1136
1137
1138/**
1139 * Dereference a specific component from a scalar, vector, or matrix
1140 */
1141static ir_rvalue *
1142dereference_component(ir_rvalue *src, unsigned component)
1143{
1144   void *ctx = ralloc_parent(src);
1145   assert(component < src->type->components());
1146
1147   /* If the source is a constant, just create a new constant instead of a
1148    * dereference of the existing constant.
1149    */
1150   ir_constant *constant = src->as_constant();
1151   if (constant)
1152      return new(ctx) ir_constant(constant, component);
1153
1154   if (src->type->is_scalar()) {
1155      return src;
1156   } else if (src->type->is_vector()) {
1157      return new(ctx) ir_swizzle(src, component, 0, 0, 0, 1);
1158   } else {
1159      assert(src->type->is_matrix());
1160
1161      /* Dereference a row of the matrix, then call this function again to get
1162       * a specific element from that row.
1163       */
1164      const int c = component / src->type->column_type()->vector_elements;
1165      const int r = component % src->type->column_type()->vector_elements;
1166      ir_constant *const col_index = new(ctx) ir_constant(c);
1167      ir_dereference *const col = new(ctx) ir_dereference_array(src,
1168                                                                col_index);
1169
1170      col->type = src->type->column_type();
1171
1172      return dereference_component(col, r);
1173   }
1174
1175   assert(!"Should not get here.");
1176   return NULL;
1177}
1178
1179
1180static ir_rvalue *
1181process_vec_mat_constructor(exec_list *instructions,
1182                            const glsl_type *constructor_type,
1183                            YYLTYPE *loc, exec_list *parameters,
1184                            struct _mesa_glsl_parse_state *state)
1185{
1186   void *ctx = state;
1187
1188   /* The ARB_shading_language_420pack spec says:
1189    *
1190    * "If an initializer is a list of initializers enclosed in curly braces,
1191    *  the variable being declared must be a vector, a matrix, an array, or a
1192    *  structure.
1193    *
1194    *      int i = { 1 }; // illegal, i is not an aggregate"
1195    */
1196   if (constructor_type->vector_elements <= 1) {
1197      _mesa_glsl_error(loc, state, "aggregates can only initialize vectors, "
1198                       "matrices, arrays, and structs");
1199      return ir_rvalue::error_value(ctx);
1200   }
1201
1202   exec_list actual_parameters;
1203   const unsigned parameter_count =
1204      process_parameters(instructions, &actual_parameters, parameters, state);
1205
1206   if (parameter_count == 0
1207       || (constructor_type->is_vector() &&
1208           constructor_type->vector_elements != parameter_count)
1209       || (constructor_type->is_matrix() &&
1210           constructor_type->matrix_columns != parameter_count)) {
1211      _mesa_glsl_error(loc, state, "%s constructor must have %u parameters",
1212                       constructor_type->is_vector() ? "vector" : "matrix",
1213                       constructor_type->vector_elements);
1214      return ir_rvalue::error_value(ctx);
1215   }
1216
1217   bool all_parameters_are_constant = true;
1218
1219   /* Type cast each parameter and, if possible, fold constants. */
1220   foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) {
1221      /* Apply implicit conversions (not the scalar constructor rules, see the
1222       * spec quote above!) and attempt to convert the parameter to a constant
1223       * valued expression. After doing so, track whether or not all the
1224       * parameters to the constructor are trivially constant valued
1225       * expressions.
1226       */
1227      all_parameters_are_constant &=
1228         implicitly_convert_component(ir, constructor_type->base_type, state);
1229
1230      if (constructor_type->is_matrix()) {
1231         if (ir->type != constructor_type->column_type()) {
1232            _mesa_glsl_error(loc, state, "type error in matrix constructor: "
1233                             "expected: %s, found %s",
1234                             constructor_type->column_type()->name,
1235                             ir->type->name);
1236            return ir_rvalue::error_value(ctx);
1237         }
1238      } else if (ir->type != constructor_type->get_scalar_type()) {
1239         _mesa_glsl_error(loc, state, "type error in vector constructor: "
1240                          "expected: %s, found %s",
1241                          constructor_type->get_scalar_type()->name,
1242                          ir->type->name);
1243         return ir_rvalue::error_value(ctx);
1244      }
1245   }
1246
1247   if (all_parameters_are_constant)
1248      return new(ctx) ir_constant(constructor_type, &actual_parameters);
1249
1250   ir_variable *var = new(ctx) ir_variable(constructor_type, "vec_mat_ctor",
1251                                           ir_var_temporary);
1252   instructions->push_tail(var);
1253
1254   int i = 0;
1255
1256   foreach_in_list(ir_rvalue, rhs, &actual_parameters) {
1257      ir_instruction *assignment = NULL;
1258
1259      if (var->type->is_matrix()) {
1260         ir_rvalue *lhs =
1261            new(ctx) ir_dereference_array(var, new(ctx) ir_constant(i));
1262         assignment = new(ctx) ir_assignment(lhs, rhs);
1263      } else {
1264         /* use writemask rather than index for vector */
1265         assert(var->type->is_vector());
1266         assert(i < 4);
1267         ir_dereference *lhs = new(ctx) ir_dereference_variable(var);
1268         assignment = new(ctx) ir_assignment(lhs, rhs, 1u << i);
1269      }
1270
1271      instructions->push_tail(assignment);
1272
1273      i++;
1274   }
1275
1276   return new(ctx) ir_dereference_variable(var);
1277}
1278
1279
1280static ir_rvalue *
1281process_array_constructor(exec_list *instructions,
1282                          const glsl_type *constructor_type,
1283                          YYLTYPE *loc, exec_list *parameters,
1284                          struct _mesa_glsl_parse_state *state)
1285{
1286   void *ctx = state;
1287   /* Array constructors come in two forms: sized and unsized.  Sized array
1288    * constructors look like 'vec4[2](a, b)', where 'a' and 'b' are vec4
1289    * variables.  In this case the number of parameters must exactly match the
1290    * specified size of the array.
1291    *
1292    * Unsized array constructors look like 'vec4[](a, b)', where 'a' and 'b'
1293    * are vec4 variables.  In this case the size of the array being constructed
1294    * is determined by the number of parameters.
1295    *
1296    * From page 52 (page 58 of the PDF) of the GLSL 1.50 spec:
1297    *
1298    *    "There must be exactly the same number of arguments as the size of
1299    *    the array being constructed. If no size is present in the
1300    *    constructor, then the array is explicitly sized to the number of
1301    *    arguments provided. The arguments are assigned in order, starting at
1302    *    element 0, to the elements of the constructed array. Each argument
1303    *    must be the same type as the element type of the array, or be a type
1304    *    that can be converted to the element type of the array according to
1305    *    Section 4.1.10 "Implicit Conversions.""
1306    */
1307   exec_list actual_parameters;
1308   const unsigned parameter_count =
1309      process_parameters(instructions, &actual_parameters, parameters, state);
1310   bool is_unsized_array = constructor_type->is_unsized_array();
1311
1312   if ((parameter_count == 0) ||
1313       (!is_unsized_array && (constructor_type->length != parameter_count))) {
1314      const unsigned min_param = is_unsized_array
1315         ? 1 : constructor_type->length;
1316
1317      _mesa_glsl_error(loc, state, "array constructor must have %s %u "
1318                       "parameter%s",
1319                       is_unsized_array ? "at least" : "exactly",
1320                       min_param, (min_param <= 1) ? "" : "s");
1321      return ir_rvalue::error_value(ctx);
1322   }
1323
1324   if (is_unsized_array) {
1325      constructor_type =
1326         glsl_type::get_array_instance(constructor_type->fields.array,
1327                                       parameter_count);
1328      assert(constructor_type != NULL);
1329      assert(constructor_type->length == parameter_count);
1330   }
1331
1332   bool all_parameters_are_constant = true;
1333   const glsl_type *element_type = constructor_type->fields.array;
1334
1335   /* Type cast each parameter and, if possible, fold constants. */
1336   foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) {
1337      /* Apply implicit conversions (not the scalar constructor rules, see the
1338       * spec quote above!) and attempt to convert the parameter to a constant
1339       * valued expression. After doing so, track whether or not all the
1340       * parameters to the constructor are trivially constant valued
1341       * expressions.
1342       */
1343      all_parameters_are_constant &=
1344         implicitly_convert_component(ir, element_type->base_type, state);
1345
1346      if (constructor_type->fields.array->is_unsized_array()) {
1347         /* As the inner parameters of the constructor are created without
1348          * knowledge of each other we need to check to make sure unsized
1349          * parameters of unsized constructors all end up with the same size.
1350          *
1351          * e.g we make sure to fail for a constructor like this:
1352          * vec4[][] a = vec4[][](vec4[](vec4(0.0), vec4(1.0)),
1353          *                       vec4[](vec4(0.0), vec4(1.0), vec4(1.0)),
1354          *                       vec4[](vec4(0.0), vec4(1.0)));
1355          */
1356         if (element_type->is_unsized_array()) {
1357            /* This is the first parameter so just get the type */
1358            element_type = ir->type;
1359         } else if (element_type != ir->type) {
1360            _mesa_glsl_error(loc, state, "type error in array constructor: "
1361                             "expected: %s, found %s",
1362                             element_type->name,
1363                             ir->type->name);
1364            return ir_rvalue::error_value(ctx);
1365         }
1366      } else if (ir->type != constructor_type->fields.array) {
1367         _mesa_glsl_error(loc, state, "type error in array constructor: "
1368                          "expected: %s, found %s",
1369                          constructor_type->fields.array->name,
1370                          ir->type->name);
1371         return ir_rvalue::error_value(ctx);
1372      } else {
1373         element_type = ir->type;
1374      }
1375   }
1376
1377   if (constructor_type->fields.array->is_unsized_array()) {
1378      constructor_type =
1379         glsl_type::get_array_instance(element_type,
1380                                       parameter_count);
1381      assert(constructor_type != NULL);
1382      assert(constructor_type->length == parameter_count);
1383   }
1384
1385   if (all_parameters_are_constant)
1386      return new(ctx) ir_constant(constructor_type, &actual_parameters);
1387
1388   ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor",
1389                                           ir_var_temporary);
1390   instructions->push_tail(var);
1391
1392   int i = 0;
1393   foreach_in_list(ir_rvalue, rhs, &actual_parameters) {
1394      ir_rvalue *lhs = new(ctx) ir_dereference_array(var,
1395                                                     new(ctx) ir_constant(i));
1396
1397      ir_instruction *assignment = new(ctx) ir_assignment(lhs, rhs);
1398      instructions->push_tail(assignment);
1399
1400      i++;
1401   }
1402
1403   return new(ctx) ir_dereference_variable(var);
1404}
1405
1406
1407/**
1408 * Determine if a list consists of a single scalar r-value
1409 */
1410static bool
1411single_scalar_parameter(exec_list *parameters)
1412{
1413   const ir_rvalue *const p = (ir_rvalue *) parameters->get_head_raw();
1414   assert(((ir_rvalue *)p)->as_rvalue() != NULL);
1415
1416   return (p->type->is_scalar() && p->next->is_tail_sentinel());
1417}
1418
1419
1420/**
1421 * Generate inline code for a vector constructor
1422 *
1423 * The generated constructor code will consist of a temporary variable
1424 * declaration of the same type as the constructor.  A sequence of assignments
1425 * from constructor parameters to the temporary will follow.
1426 *
1427 * \return
1428 * An \c ir_dereference_variable of the temprorary generated in the constructor
1429 * body.
1430 */
1431static ir_rvalue *
1432emit_inline_vector_constructor(const glsl_type *type,
1433                               exec_list *instructions,
1434                               exec_list *parameters,
1435                               void *ctx)
1436{
1437   assert(!parameters->is_empty());
1438
1439   ir_variable *var = new(ctx) ir_variable(type, "vec_ctor", ir_var_temporary);
1440   instructions->push_tail(var);
1441
1442   /* There are three kinds of vector constructors.
1443    *
1444    *  - Construct a vector from a single scalar by replicating that scalar to
1445    *    all components of the vector.
1446    *
1447    *  - Construct a vector from at least a matrix. This case should already
1448    *    have been taken care of in ast_function_expression::hir by breaking
1449    *    down the matrix into a series of column vectors.
1450    *
1451    *  - Construct a vector from an arbirary combination of vectors and
1452    *    scalars.  The components of the constructor parameters are assigned
1453    *    to the vector in order until the vector is full.
1454    */
1455   const unsigned lhs_components = type->components();
1456   if (single_scalar_parameter(parameters)) {
1457      ir_rvalue *first_param = (ir_rvalue *)parameters->get_head_raw();
1458      ir_rvalue *rhs = new(ctx) ir_swizzle(first_param, 0, 0, 0, 0,
1459                                           lhs_components);
1460      ir_dereference_variable *lhs = new(ctx) ir_dereference_variable(var);
1461      const unsigned mask = (1U << lhs_components) - 1;
1462
1463      assert(rhs->type == lhs->type);
1464
1465      ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, mask);
1466      instructions->push_tail(inst);
1467   } else {
1468      unsigned base_component = 0;
1469      unsigned base_lhs_component = 0;
1470      ir_constant_data data;
1471      unsigned constant_mask = 0, constant_components = 0;
1472
1473      memset(&data, 0, sizeof(data));
1474
1475      foreach_in_list(ir_rvalue, param, parameters) {
1476         unsigned rhs_components = param->type->components();
1477
1478         /* Do not try to assign more components to the vector than it has! */
1479         if ((rhs_components + base_lhs_component) > lhs_components) {
1480            rhs_components = lhs_components - base_lhs_component;
1481         }
1482
1483         const ir_constant *const c = param->as_constant();
1484         if (c != NULL) {
1485            for (unsigned i = 0; i < rhs_components; i++) {
1486               switch (c->type->base_type) {
1487               case GLSL_TYPE_UINT:
1488                  data.u[i + base_component] = c->get_uint_component(i);
1489                  break;
1490               case GLSL_TYPE_INT:
1491                  data.i[i + base_component] = c->get_int_component(i);
1492                  break;
1493               case GLSL_TYPE_FLOAT:
1494                  data.f[i + base_component] = c->get_float_component(i);
1495                  break;
1496               case GLSL_TYPE_DOUBLE:
1497                  data.d[i + base_component] = c->get_double_component(i);
1498                  break;
1499               case GLSL_TYPE_BOOL:
1500                  data.b[i + base_component] = c->get_bool_component(i);
1501                  break;
1502               case GLSL_TYPE_UINT64:
1503                  data.u64[i + base_component] = c->get_uint64_component(i);
1504                  break;
1505               case GLSL_TYPE_INT64:
1506                  data.i64[i + base_component] = c->get_int64_component(i);
1507                  break;
1508               default:
1509                  assert(!"Should not get here.");
1510                  break;
1511               }
1512            }
1513
1514            /* Mask of fields to be written in the assignment. */
1515            constant_mask |= ((1U << rhs_components) - 1) << base_lhs_component;
1516            constant_components += rhs_components;
1517
1518            base_component += rhs_components;
1519         }
1520         /* Advance the component index by the number of components
1521          * that were just assigned.
1522          */
1523         base_lhs_component += rhs_components;
1524      }
1525
1526      if (constant_mask != 0) {
1527         ir_dereference *lhs = new(ctx) ir_dereference_variable(var);
1528         const glsl_type *rhs_type =
1529            glsl_type::get_instance(var->type->base_type,
1530                                    constant_components,
1531                                    1);
1532         ir_rvalue *rhs = new(ctx) ir_constant(rhs_type, &data);
1533
1534         ir_instruction *inst =
1535            new(ctx) ir_assignment(lhs, rhs, constant_mask);
1536         instructions->push_tail(inst);
1537      }
1538
1539      base_component = 0;
1540      foreach_in_list(ir_rvalue, param, parameters) {
1541         unsigned rhs_components = param->type->components();
1542
1543         /* Do not try to assign more components to the vector than it has! */
1544         if ((rhs_components + base_component) > lhs_components) {
1545            rhs_components = lhs_components - base_component;
1546         }
1547
1548         /* If we do not have any components left to copy, break out of the
1549          * loop. This can happen when initializing a vec4 with a mat3 as the
1550          * mat3 would have been broken into a series of column vectors.
1551          */
1552         if (rhs_components == 0) {
1553            break;
1554         }
1555
1556         const ir_constant *const c = param->as_constant();
1557         if (c == NULL) {
1558            /* Mask of fields to be written in the assignment. */
1559            const unsigned write_mask = ((1U << rhs_components) - 1)
1560               << base_component;
1561
1562            ir_dereference *lhs = new(ctx) ir_dereference_variable(var);
1563
1564            /* Generate a swizzle so that LHS and RHS sizes match. */
1565            ir_rvalue *rhs =
1566               new(ctx) ir_swizzle(param, 0, 1, 2, 3, rhs_components);
1567
1568            ir_instruction *inst =
1569               new(ctx) ir_assignment(lhs, rhs, write_mask);
1570            instructions->push_tail(inst);
1571         }
1572
1573         /* Advance the component index by the number of components that were
1574          * just assigned.
1575          */
1576         base_component += rhs_components;
1577      }
1578   }
1579   return new(ctx) ir_dereference_variable(var);
1580}
1581
1582
1583/**
1584 * Generate assignment of a portion of a vector to a portion of a matrix column
1585 *
1586 * \param src_base  First component of the source to be used in assignment
1587 * \param column    Column of destination to be assiged
1588 * \param row_base  First component of the destination column to be assigned
1589 * \param count     Number of components to be assigned
1590 *
1591 * \note
1592 * \c src_base + \c count must be less than or equal to the number of
1593 * components in the source vector.
1594 */
1595static ir_instruction *
1596assign_to_matrix_column(ir_variable *var, unsigned column, unsigned row_base,
1597                        ir_rvalue *src, unsigned src_base, unsigned count,
1598                        void *mem_ctx)
1599{
1600   ir_constant *col_idx = new(mem_ctx) ir_constant(column);
1601   ir_dereference *column_ref = new(mem_ctx) ir_dereference_array(var,
1602                                                                  col_idx);
1603
1604   assert(column_ref->type->components() >= (row_base + count));
1605   assert(src->type->components() >= (src_base + count));
1606
1607   /* Generate a swizzle that extracts the number of components from the source
1608    * that are to be assigned to the column of the matrix.
1609    */
1610   if (count < src->type->vector_elements) {
1611      src = new(mem_ctx) ir_swizzle(src,
1612                                    src_base + 0, src_base + 1,
1613                                    src_base + 2, src_base + 3,
1614                                    count);
1615   }
1616
1617   /* Mask of fields to be written in the assignment. */
1618   const unsigned write_mask = ((1U << count) - 1) << row_base;
1619
1620   return new(mem_ctx) ir_assignment(column_ref, src, write_mask);
1621}
1622
1623
1624/**
1625 * Generate inline code for a matrix constructor
1626 *
1627 * The generated constructor code will consist of a temporary variable
1628 * declaration of the same type as the constructor.  A sequence of assignments
1629 * from constructor parameters to the temporary will follow.
1630 *
1631 * \return
1632 * An \c ir_dereference_variable of the temprorary generated in the constructor
1633 * body.
1634 */
1635static ir_rvalue *
1636emit_inline_matrix_constructor(const glsl_type *type,
1637                               exec_list *instructions,
1638                               exec_list *parameters,
1639                               void *ctx)
1640{
1641   assert(!parameters->is_empty());
1642
1643   ir_variable *var = new(ctx) ir_variable(type, "mat_ctor", ir_var_temporary);
1644   instructions->push_tail(var);
1645
1646   /* There are three kinds of matrix constructors.
1647    *
1648    *  - Construct a matrix from a single scalar by replicating that scalar to
1649    *    along the diagonal of the matrix and setting all other components to
1650    *    zero.
1651    *
1652    *  - Construct a matrix from an arbirary combination of vectors and
1653    *    scalars.  The components of the constructor parameters are assigned
1654    *    to the matrix in column-major order until the matrix is full.
1655    *
1656    *  - Construct a matrix from a single matrix.  The source matrix is copied
1657    *    to the upper left portion of the constructed matrix, and the remaining
1658    *    elements take values from the identity matrix.
1659    */
1660   ir_rvalue *const first_param = (ir_rvalue *) parameters->get_head_raw();
1661   if (single_scalar_parameter(parameters)) {
1662      /* Assign the scalar to the X component of a vec4, and fill the remaining
1663       * components with zero.
1664       */
1665      glsl_base_type param_base_type = first_param->type->base_type;
1666      assert(first_param->type->is_float() || first_param->type->is_double());
1667      ir_variable *rhs_var =
1668         new(ctx) ir_variable(glsl_type::get_instance(param_base_type, 4, 1),
1669                              "mat_ctor_vec",
1670                              ir_var_temporary);
1671      instructions->push_tail(rhs_var);
1672
1673      ir_constant_data zero;
1674      for (unsigned i = 0; i < 4; i++)
1675         if (first_param->type->is_float())
1676            zero.f[i] = 0.0;
1677         else
1678            zero.d[i] = 0.0;
1679
1680      ir_instruction *inst =
1681         new(ctx) ir_assignment(new(ctx) ir_dereference_variable(rhs_var),
1682                                new(ctx) ir_constant(rhs_var->type, &zero));
1683      instructions->push_tail(inst);
1684
1685      ir_dereference *const rhs_ref =
1686         new(ctx) ir_dereference_variable(rhs_var);
1687
1688      inst = new(ctx) ir_assignment(rhs_ref, first_param, 0x01);
1689      instructions->push_tail(inst);
1690
1691      /* Assign the temporary vector to each column of the destination matrix
1692       * with a swizzle that puts the X component on the diagonal of the
1693       * matrix.  In some cases this may mean that the X component does not
1694       * get assigned into the column at all (i.e., when the matrix has more
1695       * columns than rows).
1696       */
1697      static const unsigned rhs_swiz[4][4] = {
1698         { 0, 1, 1, 1 },
1699         { 1, 0, 1, 1 },
1700         { 1, 1, 0, 1 },
1701         { 1, 1, 1, 0 }
1702      };
1703
1704      const unsigned cols_to_init = MIN2(type->matrix_columns,
1705                                         type->vector_elements);
1706      for (unsigned i = 0; i < cols_to_init; i++) {
1707         ir_constant *const col_idx = new(ctx) ir_constant(i);
1708         ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var,
1709                                                                  col_idx);
1710
1711         ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var);
1712         ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, rhs_swiz[i],
1713                                                    type->vector_elements);
1714
1715         inst = new(ctx) ir_assignment(col_ref, rhs);
1716         instructions->push_tail(inst);
1717      }
1718
1719      for (unsigned i = cols_to_init; i < type->matrix_columns; i++) {
1720         ir_constant *const col_idx = new(ctx) ir_constant(i);
1721         ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var,
1722                                                                  col_idx);
1723
1724         ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var);
1725         ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, 1, 1, 1, 1,
1726                                                    type->vector_elements);
1727
1728         inst = new(ctx) ir_assignment(col_ref, rhs);
1729         instructions->push_tail(inst);
1730      }
1731   } else if (first_param->type->is_matrix()) {
1732      /* From page 50 (56 of the PDF) of the GLSL 1.50 spec:
1733       *
1734       *     "If a matrix is constructed from a matrix, then each component
1735       *     (column i, row j) in the result that has a corresponding
1736       *     component (column i, row j) in the argument will be initialized
1737       *     from there. All other components will be initialized to the
1738       *     identity matrix. If a matrix argument is given to a matrix
1739       *     constructor, it is an error to have any other arguments."
1740       */
1741      assert(first_param->next->is_tail_sentinel());
1742      ir_rvalue *const src_matrix = first_param;
1743
1744      /* If the source matrix is smaller, pre-initialize the relavent parts of
1745       * the destination matrix to the identity matrix.
1746       */
1747      if ((src_matrix->type->matrix_columns < var->type->matrix_columns) ||
1748          (src_matrix->type->vector_elements < var->type->vector_elements)) {
1749
1750         /* If the source matrix has fewer rows, every column of the
1751          * destination must be initialized.  Otherwise only the columns in
1752          * the destination that do not exist in the source must be
1753          * initialized.
1754          */
1755         unsigned col =
1756            (src_matrix->type->vector_elements < var->type->vector_elements)
1757            ? 0 : src_matrix->type->matrix_columns;
1758
1759         const glsl_type *const col_type = var->type->column_type();
1760         for (/* empty */; col < var->type->matrix_columns; col++) {
1761            ir_constant_data ident;
1762
1763            if (!col_type->is_double()) {
1764               ident.f[0] = 0.0f;
1765               ident.f[1] = 0.0f;
1766               ident.f[2] = 0.0f;
1767               ident.f[3] = 0.0f;
1768               ident.f[col] = 1.0f;
1769            } else {
1770               ident.d[0] = 0.0;
1771               ident.d[1] = 0.0;
1772               ident.d[2] = 0.0;
1773               ident.d[3] = 0.0;
1774               ident.d[col] = 1.0;
1775            }
1776
1777            ir_rvalue *const rhs = new(ctx) ir_constant(col_type, &ident);
1778
1779            ir_rvalue *const lhs =
1780               new(ctx) ir_dereference_array(var, new(ctx) ir_constant(col));
1781
1782            ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs);
1783            instructions->push_tail(inst);
1784         }
1785      }
1786
1787      /* Assign columns from the source matrix to the destination matrix.
1788       *
1789       * Since the parameter will be used in the RHS of multiple assignments,
1790       * generate a temporary and copy the paramter there.
1791       */
1792      ir_variable *const rhs_var =
1793         new(ctx) ir_variable(first_param->type, "mat_ctor_mat",
1794                              ir_var_temporary);
1795      instructions->push_tail(rhs_var);
1796
1797      ir_dereference *const rhs_var_ref =
1798         new(ctx) ir_dereference_variable(rhs_var);
1799      ir_instruction *const inst =
1800         new(ctx) ir_assignment(rhs_var_ref, first_param);
1801      instructions->push_tail(inst);
1802
1803      const unsigned last_row = MIN2(src_matrix->type->vector_elements,
1804                                     var->type->vector_elements);
1805      const unsigned last_col = MIN2(src_matrix->type->matrix_columns,
1806                                     var->type->matrix_columns);
1807
1808      unsigned swiz[4] = { 0, 0, 0, 0 };
1809      for (unsigned i = 1; i < last_row; i++)
1810         swiz[i] = i;
1811
1812      const unsigned write_mask = (1U << last_row) - 1;
1813
1814      for (unsigned i = 0; i < last_col; i++) {
1815         ir_dereference *const lhs =
1816            new(ctx) ir_dereference_array(var, new(ctx) ir_constant(i));
1817         ir_rvalue *const rhs_col =
1818            new(ctx) ir_dereference_array(rhs_var, new(ctx) ir_constant(i));
1819
1820         /* If one matrix has columns that are smaller than the columns of the
1821          * other matrix, wrap the column access of the larger with a swizzle
1822          * so that the LHS and RHS of the assignment have the same size (and
1823          * therefore have the same type).
1824          *
1825          * It would be perfectly valid to unconditionally generate the
1826          * swizzles, this this will typically result in a more compact IR
1827          * tree.
1828          */
1829         ir_rvalue *rhs;
1830         if (lhs->type->vector_elements != rhs_col->type->vector_elements) {
1831            rhs = new(ctx) ir_swizzle(rhs_col, swiz, last_row);
1832         } else {
1833            rhs = rhs_col;
1834         }
1835
1836         ir_instruction *inst =
1837            new(ctx) ir_assignment(lhs, rhs, write_mask);
1838         instructions->push_tail(inst);
1839      }
1840   } else {
1841      const unsigned cols = type->matrix_columns;
1842      const unsigned rows = type->vector_elements;
1843      unsigned remaining_slots = rows * cols;
1844      unsigned col_idx = 0;
1845      unsigned row_idx = 0;
1846
1847      foreach_in_list(ir_rvalue, rhs, parameters) {
1848         unsigned rhs_components = rhs->type->components();
1849         unsigned rhs_base = 0;
1850
1851         if (remaining_slots == 0)
1852            break;
1853
1854         /* Since the parameter might be used in the RHS of two assignments,
1855          * generate a temporary and copy the paramter there.
1856          */
1857         ir_variable *rhs_var =
1858            new(ctx) ir_variable(rhs->type, "mat_ctor_vec", ir_var_temporary);
1859         instructions->push_tail(rhs_var);
1860
1861         ir_dereference *rhs_var_ref =
1862            new(ctx) ir_dereference_variable(rhs_var);
1863         ir_instruction *inst = new(ctx) ir_assignment(rhs_var_ref, rhs);
1864         instructions->push_tail(inst);
1865
1866         do {
1867            /* Assign the current parameter to as many components of the matrix
1868             * as it will fill.
1869             *
1870             * NOTE: A single vector parameter can span two matrix columns.  A
1871             * single vec4, for example, can completely fill a mat2.
1872             */
1873            unsigned count = MIN2(rows - row_idx,
1874                                  rhs_components - rhs_base);
1875
1876            rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var);
1877            ir_instruction *inst = assign_to_matrix_column(var, col_idx,
1878                                                           row_idx,
1879                                                           rhs_var_ref,
1880                                                           rhs_base,
1881                                                           count, ctx);
1882            instructions->push_tail(inst);
1883            rhs_base += count;
1884            row_idx += count;
1885            remaining_slots -= count;
1886
1887            /* Sometimes, there is still data left in the parameters and
1888             * components left to be set in the destination but in other
1889             * column.
1890             */
1891            if (row_idx >= rows) {
1892               row_idx = 0;
1893               col_idx++;
1894            }
1895         } while(remaining_slots > 0 && rhs_base < rhs_components);
1896      }
1897   }
1898
1899   return new(ctx) ir_dereference_variable(var);
1900}
1901
1902
1903static ir_rvalue *
1904emit_inline_record_constructor(const glsl_type *type,
1905                               exec_list *instructions,
1906                               exec_list *parameters,
1907                               void *mem_ctx)
1908{
1909   ir_variable *const var =
1910      new(mem_ctx) ir_variable(type, "record_ctor", ir_var_temporary);
1911   ir_dereference_variable *const d =
1912      new(mem_ctx) ir_dereference_variable(var);
1913
1914   instructions->push_tail(var);
1915
1916   exec_node *node = parameters->get_head_raw();
1917   for (unsigned i = 0; i < type->length; i++) {
1918      assert(!node->is_tail_sentinel());
1919
1920      ir_dereference *const lhs =
1921         new(mem_ctx) ir_dereference_record(d->clone(mem_ctx, NULL),
1922                                            type->fields.structure[i].name);
1923
1924      ir_rvalue *const rhs = ((ir_instruction *) node)->as_rvalue();
1925      assert(rhs != NULL);
1926
1927      ir_instruction *const assign = new(mem_ctx) ir_assignment(lhs, rhs);
1928
1929      instructions->push_tail(assign);
1930      node = node->next;
1931   }
1932
1933   return d;
1934}
1935
1936
1937static ir_rvalue *
1938process_record_constructor(exec_list *instructions,
1939                           const glsl_type *constructor_type,
1940                           YYLTYPE *loc, exec_list *parameters,
1941                           struct _mesa_glsl_parse_state *state)
1942{
1943   void *ctx = state;
1944   /* From page 32 (page 38 of the PDF) of the GLSL 1.20 spec:
1945    *
1946    *    "The arguments to the constructor will be used to set the structure's
1947    *     fields, in order, using one argument per field. Each argument must
1948    *     be the same type as the field it sets, or be a type that can be
1949    *     converted to the field's type according to Section 4.1.10 “Implicit
1950    *     Conversions.”"
1951    *
1952    * From page 35 (page 41 of the PDF) of the GLSL 4.20 spec:
1953    *
1954    *    "In all cases, the innermost initializer (i.e., not a list of
1955    *     initializers enclosed in curly braces) applied to an object must
1956    *     have the same type as the object being initialized or be a type that
1957    *     can be converted to the object's type according to section 4.1.10
1958    *     "Implicit Conversions". In the latter case, an implicit conversion
1959    *     will be done on the initializer before the assignment is done."
1960    */
1961   exec_list actual_parameters;
1962
1963   const unsigned parameter_count =
1964         process_parameters(instructions, &actual_parameters, parameters,
1965                            state);
1966
1967   if (parameter_count != constructor_type->length) {
1968      _mesa_glsl_error(loc, state,
1969                       "%s parameters in constructor for `%s'",
1970                       parameter_count > constructor_type->length
1971                       ? "too many": "insufficient",
1972                       constructor_type->name);
1973      return ir_rvalue::error_value(ctx);
1974   }
1975
1976   bool all_parameters_are_constant = true;
1977
1978   int i = 0;
1979   /* Type cast each parameter and, if possible, fold constants. */
1980   foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) {
1981
1982      const glsl_struct_field *struct_field =
1983         &constructor_type->fields.structure[i];
1984
1985      /* Apply implicit conversions (not the scalar constructor rules, see the
1986       * spec quote above!) and attempt to convert the parameter to a constant
1987       * valued expression. After doing so, track whether or not all the
1988       * parameters to the constructor are trivially constant valued
1989       * expressions.
1990       */
1991      all_parameters_are_constant &=
1992         implicitly_convert_component(ir, struct_field->type->base_type,
1993                                      state);
1994
1995      if (ir->type != struct_field->type) {
1996         _mesa_glsl_error(loc, state,
1997                          "parameter type mismatch in constructor for `%s.%s' "
1998                          "(%s vs %s)",
1999                          constructor_type->name,
2000                          struct_field->name,
2001                          ir->type->name,
2002                          struct_field->type->name);
2003         return ir_rvalue::error_value(ctx);
2004      }
2005
2006      i++;
2007   }
2008
2009   if (all_parameters_are_constant) {
2010      return new(ctx) ir_constant(constructor_type, &actual_parameters);
2011   } else {
2012      return emit_inline_record_constructor(constructor_type, instructions,
2013                                            &actual_parameters, state);
2014   }
2015}
2016
2017ir_rvalue *
2018ast_function_expression::handle_method(exec_list *instructions,
2019                                       struct _mesa_glsl_parse_state *state)
2020{
2021   const ast_expression *field = subexpressions[0];
2022   ir_rvalue *op;
2023   ir_rvalue *result;
2024   void *ctx = state;
2025   /* Handle "method calls" in GLSL 1.20 - namely, array.length() */
2026   YYLTYPE loc = get_location();
2027   state->check_version(120, 300, &loc, "methods not supported");
2028
2029   const char *method;
2030   method = field->primary_expression.identifier;
2031
2032   /* This would prevent to raise "uninitialized variable" warnings when
2033    * calling array.length.
2034    */
2035   field->subexpressions[0]->set_is_lhs(true);
2036   op = field->subexpressions[0]->hir(instructions, state);
2037   if (strcmp(method, "length") == 0) {
2038      if (!this->expressions.is_empty()) {
2039         _mesa_glsl_error(&loc, state, "length method takes no arguments");
2040         goto fail;
2041      }
2042
2043      if (op->type->is_array()) {
2044         if (op->type->is_unsized_array()) {
2045            if (!state->has_shader_storage_buffer_objects()) {
2046               _mesa_glsl_error(&loc, state,
2047                                "length called on unsized array"
2048                                " only available with"
2049                                " ARB_shader_storage_buffer_object");
2050               goto fail;
2051            } else if (op->variable_referenced()->is_in_shader_storage_block()) {
2052               /* Calculate length of an unsized array in run-time */
2053               result = new(ctx)
2054                  ir_expression(ir_unop_ssbo_unsized_array_length, op);
2055            } else {
2056               /* When actual size is known at link-time, this will be
2057                * replaced with a constant expression.
2058                */
2059               result = new (ctx)
2060                  ir_expression(ir_unop_implicitly_sized_array_length, op);
2061            }
2062         } else {
2063            result = new(ctx) ir_constant(op->type->array_size());
2064         }
2065      } else if (op->type->is_vector()) {
2066         if (state->has_420pack()) {
2067            /* .length() returns int. */
2068            result = new(ctx) ir_constant((int) op->type->vector_elements);
2069         } else {
2070            _mesa_glsl_error(&loc, state, "length method on matrix only"
2071                             " available with ARB_shading_language_420pack");
2072            goto fail;
2073         }
2074      } else if (op->type->is_matrix()) {
2075         if (state->has_420pack()) {
2076            /* .length() returns int. */
2077            result = new(ctx) ir_constant((int) op->type->matrix_columns);
2078         } else {
2079            _mesa_glsl_error(&loc, state, "length method on matrix only"
2080                             " available with ARB_shading_language_420pack");
2081            goto fail;
2082         }
2083      } else {
2084         _mesa_glsl_error(&loc, state, "length called on scalar.");
2085         goto fail;
2086      }
2087   } else {
2088      _mesa_glsl_error(&loc, state, "unknown method: `%s'", method);
2089      goto fail;
2090   }
2091   return result;
2092 fail:
2093   return ir_rvalue::error_value(ctx);
2094}
2095
2096static inline bool is_valid_constructor(const glsl_type *type,
2097                                        struct _mesa_glsl_parse_state *state)
2098{
2099   return type->is_numeric() || type->is_boolean() ||
2100          (state->has_bindless() && (type->is_sampler() || type->is_image()));
2101}
2102
2103ir_rvalue *
2104ast_function_expression::hir(exec_list *instructions,
2105                             struct _mesa_glsl_parse_state *state)
2106{
2107   void *ctx = state;
2108   /* There are three sorts of function calls.
2109    *
2110    * 1. constructors - The first subexpression is an ast_type_specifier.
2111    * 2. methods - Only the .length() method of array types.
2112    * 3. functions - Calls to regular old functions.
2113    *
2114    */
2115   if (is_constructor()) {
2116      const ast_type_specifier *type =
2117         (ast_type_specifier *) subexpressions[0];
2118      YYLTYPE loc = type->get_location();
2119      const char *name;
2120
2121      const glsl_type *const constructor_type = type->glsl_type(& name, state);
2122
2123      /* constructor_type can be NULL if a variable with the same name as the
2124       * structure has come into scope.
2125       */
2126      if (constructor_type == NULL) {
2127         _mesa_glsl_error(& loc, state, "unknown type `%s' (structure name "
2128                          "may be shadowed by a variable with the same name)",
2129                          type->type_name);
2130         return ir_rvalue::error_value(ctx);
2131      }
2132
2133
2134      /* Constructors for opaque types are illegal.
2135       *
2136       * From section 4.1.7 of the ARB_bindless_texture spec:
2137       *
2138       * "Samplers are represented using 64-bit integer handles, and may be "
2139       *  converted to and from 64-bit integers using constructors."
2140       *
2141       * From section 4.1.X of the ARB_bindless_texture spec:
2142       *
2143       * "Images are represented using 64-bit integer handles, and may be
2144       *  converted to and from 64-bit integers using constructors."
2145       */
2146      if (constructor_type->contains_atomic() ||
2147          (!state->has_bindless() && constructor_type->contains_opaque())) {
2148         _mesa_glsl_error(& loc, state, "cannot construct %s type `%s'",
2149                          state->has_bindless() ? "atomic" : "opaque",
2150                          constructor_type->name);
2151         return ir_rvalue::error_value(ctx);
2152      }
2153
2154      if (constructor_type->is_subroutine()) {
2155         _mesa_glsl_error(& loc, state,
2156                          "subroutine name cannot be a constructor `%s'",
2157                          constructor_type->name);
2158         return ir_rvalue::error_value(ctx);
2159      }
2160
2161      if (constructor_type->is_array()) {
2162         if (!state->check_version(state->allow_glsl_120_subset_in_110 ? 110 : 120,
2163                                   300, &loc, "array constructors forbidden")) {
2164            return ir_rvalue::error_value(ctx);
2165         }
2166
2167         return process_array_constructor(instructions, constructor_type,
2168                                          & loc, &this->expressions, state);
2169      }
2170
2171
2172      /* There are two kinds of constructor calls.  Constructors for arrays and
2173       * structures must have the exact number of arguments with matching types
2174       * in the correct order.  These constructors follow essentially the same
2175       * type matching rules as functions.
2176       *
2177       * Constructors for built-in language types, such as mat4 and vec2, are
2178       * free form.  The only requirements are that the parameters must provide
2179       * enough values of the correct scalar type and that no arguments are
2180       * given past the last used argument.
2181       *
2182       * When using the C-style initializer syntax from GLSL 4.20, constructors
2183       * must have the exact number of arguments with matching types in the
2184       * correct order.
2185       */
2186      if (constructor_type->is_struct()) {
2187         return process_record_constructor(instructions, constructor_type,
2188                                           &loc, &this->expressions,
2189                                           state);
2190      }
2191
2192      if (!is_valid_constructor(constructor_type, state))
2193         return ir_rvalue::error_value(ctx);
2194
2195      /* Total number of components of the type being constructed. */
2196      const unsigned type_components = constructor_type->components();
2197
2198      /* Number of components from parameters that have actually been
2199       * consumed.  This is used to perform several kinds of error checking.
2200       */
2201      unsigned components_used = 0;
2202
2203      unsigned matrix_parameters = 0;
2204      unsigned nonmatrix_parameters = 0;
2205      exec_list actual_parameters;
2206
2207      foreach_list_typed(ast_node, ast, link, &this->expressions) {
2208         ir_rvalue *result = ast->hir(instructions, state);
2209
2210         /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec:
2211          *
2212          *    "It is an error to provide extra arguments beyond this
2213          *    last used argument."
2214          */
2215         if (components_used >= type_components) {
2216            _mesa_glsl_error(& loc, state, "too many parameters to `%s' "
2217                             "constructor",
2218                             constructor_type->name);
2219            return ir_rvalue::error_value(ctx);
2220         }
2221
2222         if (!is_valid_constructor(result->type, state)) {
2223            _mesa_glsl_error(& loc, state, "cannot construct `%s' from a "
2224                             "non-numeric data type",
2225                             constructor_type->name);
2226            return ir_rvalue::error_value(ctx);
2227         }
2228
2229         /* Count the number of matrix and nonmatrix parameters.  This
2230          * is used below to enforce some of the constructor rules.
2231          */
2232         if (result->type->is_matrix())
2233            matrix_parameters++;
2234         else
2235            nonmatrix_parameters++;
2236
2237         actual_parameters.push_tail(result);
2238         components_used += result->type->components();
2239      }
2240
2241      /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec:
2242       *
2243       *    "It is an error to construct matrices from other matrices. This
2244       *    is reserved for future use."
2245       */
2246      if (matrix_parameters > 0
2247          && constructor_type->is_matrix()
2248          && !state->check_version(120, 100, &loc,
2249                                   "cannot construct `%s' from a matrix",
2250                                   constructor_type->name)) {
2251         return ir_rvalue::error_value(ctx);
2252      }
2253
2254      /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec:
2255       *
2256       *    "If a matrix argument is given to a matrix constructor, it is
2257       *    an error to have any other arguments."
2258       */
2259      if ((matrix_parameters > 0)
2260          && ((matrix_parameters + nonmatrix_parameters) > 1)
2261          && constructor_type->is_matrix()) {
2262         _mesa_glsl_error(& loc, state, "for matrix `%s' constructor, "
2263                          "matrix must be only parameter",
2264                          constructor_type->name);
2265         return ir_rvalue::error_value(ctx);
2266      }
2267
2268      /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec:
2269       *
2270       *    "In these cases, there must be enough components provided in the
2271       *    arguments to provide an initializer for every component in the
2272       *    constructed value."
2273       */
2274      if (components_used < type_components && components_used != 1
2275          && matrix_parameters == 0) {
2276         _mesa_glsl_error(& loc, state, "too few components to construct "
2277                          "`%s'",
2278                          constructor_type->name);
2279         return ir_rvalue::error_value(ctx);
2280      }
2281
2282      /* Matrices can never be consumed as is by any constructor but matrix
2283       * constructors. If the constructor type is not matrix, always break the
2284       * matrix up into a series of column vectors.
2285       */
2286      if (!constructor_type->is_matrix()) {
2287         foreach_in_list_safe(ir_rvalue, matrix, &actual_parameters) {
2288            if (!matrix->type->is_matrix())
2289               continue;
2290
2291            /* Create a temporary containing the matrix. */
2292            ir_variable *var = new(ctx) ir_variable(matrix->type, "matrix_tmp",
2293                                                    ir_var_temporary);
2294            instructions->push_tail(var);
2295            instructions->push_tail(
2296               new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var),
2297                                      matrix));
2298            var->constant_value = matrix->constant_expression_value(ctx);
2299
2300            /* Replace the matrix with dereferences of its columns. */
2301            for (int i = 0; i < matrix->type->matrix_columns; i++) {
2302               matrix->insert_before(
2303                  new (ctx) ir_dereference_array(var,
2304                                                 new(ctx) ir_constant(i)));
2305            }
2306            matrix->remove();
2307         }
2308      }
2309
2310      bool all_parameters_are_constant = true;
2311
2312      /* Type cast each parameter and, if possible, fold constants.*/
2313      foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) {
2314         const glsl_type *desired_type;
2315
2316         /* From section 5.4.1 of the ARB_bindless_texture spec:
2317          *
2318          * "In the following four constructors, the low 32 bits of the sampler
2319          *  type correspond to the .x component of the uvec2 and the high 32
2320          *  bits correspond to the .y component."
2321          *
2322          *  uvec2(any sampler type)     // Converts a sampler type to a
2323          *                              //   pair of 32-bit unsigned integers
2324          *  any sampler type(uvec2)     // Converts a pair of 32-bit unsigned integers to
2325          *                              //   a sampler type
2326          *  uvec2(any image type)       // Converts an image type to a
2327          *                              //   pair of 32-bit unsigned integers
2328          *  any image type(uvec2)       // Converts a pair of 32-bit unsigned integers to
2329          *                              //   an image type
2330          */
2331         if (ir->type->is_sampler() || ir->type->is_image()) {
2332            /* Convert a sampler/image type to a pair of 32-bit unsigned
2333             * integers as defined by ARB_bindless_texture.
2334             */
2335            if (constructor_type != glsl_type::uvec2_type) {
2336               _mesa_glsl_error(&loc, state, "sampler and image types can only "
2337                                "be converted to a pair of 32-bit unsigned "
2338                                "integers");
2339            }
2340            desired_type = glsl_type::uvec2_type;
2341         } else if (constructor_type->is_sampler() ||
2342                    constructor_type->is_image()) {
2343            /* Convert a pair of 32-bit unsigned integers to a sampler or image
2344             * type as defined by ARB_bindless_texture.
2345             */
2346            if (ir->type != glsl_type::uvec2_type) {
2347               _mesa_glsl_error(&loc, state, "sampler and image types can only "
2348                                "be converted from a pair of 32-bit unsigned "
2349                                "integers");
2350            }
2351            desired_type = constructor_type;
2352         } else {
2353            desired_type =
2354               glsl_type::get_instance(constructor_type->base_type,
2355                                       ir->type->vector_elements,
2356                                       ir->type->matrix_columns);
2357         }
2358
2359         ir_rvalue *result = convert_component(ir, desired_type);
2360
2361         /* Attempt to convert the parameter to a constant valued expression.
2362          * After doing so, track whether or not all the parameters to the
2363          * constructor are trivially constant valued expressions.
2364          */
2365         ir_rvalue *const constant = result->constant_expression_value(ctx);
2366
2367         if (constant != NULL)
2368            result = constant;
2369         else
2370            all_parameters_are_constant = false;
2371
2372         if (result != ir) {
2373            ir->replace_with(result);
2374         }
2375      }
2376
2377      /* If all of the parameters are trivially constant, create a
2378       * constant representing the complete collection of parameters.
2379       */
2380      if (all_parameters_are_constant) {
2381         return new(ctx) ir_constant(constructor_type, &actual_parameters);
2382      } else if (constructor_type->is_scalar()) {
2383         return dereference_component((ir_rvalue *)
2384                                      actual_parameters.get_head_raw(),
2385                                      0);
2386      } else if (constructor_type->is_vector()) {
2387         return emit_inline_vector_constructor(constructor_type,
2388                                               instructions,
2389                                               &actual_parameters,
2390                                               ctx);
2391      } else {
2392         assert(constructor_type->is_matrix());
2393         return emit_inline_matrix_constructor(constructor_type,
2394                                               instructions,
2395                                               &actual_parameters,
2396                                               ctx);
2397      }
2398   } else if (subexpressions[0]->oper == ast_field_selection) {
2399      return handle_method(instructions, state);
2400   } else {
2401      const ast_expression *id = subexpressions[0];
2402      const char *func_name = NULL;
2403      YYLTYPE loc = get_location();
2404      exec_list actual_parameters;
2405      ir_variable *sub_var = NULL;
2406      ir_rvalue *array_idx = NULL;
2407
2408      process_parameters(instructions, &actual_parameters, &this->expressions,
2409                         state);
2410
2411      if (id->oper == ast_array_index) {
2412         array_idx = generate_array_index(ctx, instructions, state, loc,
2413                                          id->subexpressions[0],
2414                                          id->subexpressions[1], &func_name,
2415                                          &actual_parameters);
2416      } else if (id->oper == ast_identifier) {
2417         func_name = id->primary_expression.identifier;
2418      } else {
2419         _mesa_glsl_error(&loc, state, "function name is not an identifier");
2420      }
2421
2422      /* an error was emitted earlier */
2423      if (!func_name)
2424         return ir_rvalue::error_value(ctx);
2425
2426      ir_function_signature *sig =
2427         match_function_by_name(func_name, &actual_parameters, state);
2428
2429      ir_rvalue *value = NULL;
2430      if (sig == NULL) {
2431         sig = match_subroutine_by_name(func_name, &actual_parameters,
2432                                        state, &sub_var);
2433      }
2434
2435      if (sig == NULL) {
2436         no_matching_function_error(func_name, &loc,
2437                                    &actual_parameters, state);
2438         value = ir_rvalue::error_value(ctx);
2439      } else if (!verify_parameter_modes(state, sig,
2440                                         actual_parameters,
2441                                         this->expressions)) {
2442         /* an error has already been emitted */
2443         value = ir_rvalue::error_value(ctx);
2444      } else if (sig->is_builtin() && strcmp(func_name, "ftransform") == 0) {
2445         /* ftransform refers to global variables, and we don't have any code
2446          * for remapping the variable references in the built-in shader.
2447          */
2448         ir_variable *mvp =
2449            state->symbols->get_variable("gl_ModelViewProjectionMatrix");
2450         ir_variable *vtx = state->symbols->get_variable("gl_Vertex");
2451         value = new(ctx) ir_expression(ir_binop_mul, glsl_type::vec4_type,
2452                                        new(ctx) ir_dereference_variable(mvp),
2453                                        new(ctx) ir_dereference_variable(vtx));
2454      } else {
2455         bool is_begin_interlock = false;
2456         bool is_end_interlock = false;
2457         if (sig->is_builtin() &&
2458             state->stage == MESA_SHADER_FRAGMENT &&
2459             state->ARB_fragment_shader_interlock_enable) {
2460            is_begin_interlock = strcmp(func_name, "beginInvocationInterlockARB") == 0;
2461            is_end_interlock = strcmp(func_name, "endInvocationInterlockARB") == 0;
2462         }
2463
2464         if (sig->is_builtin() &&
2465             ((state->stage == MESA_SHADER_TESS_CTRL &&
2466               strcmp(func_name, "barrier") == 0) ||
2467              is_begin_interlock || is_end_interlock)) {
2468            if (state->current_function == NULL ||
2469                strcmp(state->current_function->function_name(), "main") != 0) {
2470               _mesa_glsl_error(&loc, state,
2471                                "%s() may only be used in main()", func_name);
2472            }
2473
2474            if (state->found_return) {
2475               _mesa_glsl_error(&loc, state,
2476                                "%s() may not be used after return", func_name);
2477            }
2478
2479            if (instructions != &state->current_function->body) {
2480               _mesa_glsl_error(&loc, state,
2481                                "%s() may not be used in control flow", func_name);
2482            }
2483         }
2484
2485         /* There can be only one begin/end interlock pair in the function. */
2486         if (is_begin_interlock) {
2487            if (state->found_begin_interlock)
2488               _mesa_glsl_error(&loc, state,
2489                                "beginInvocationInterlockARB may not be used twice");
2490            state->found_begin_interlock = true;
2491         } else if (is_end_interlock) {
2492            if (!state->found_begin_interlock)
2493               _mesa_glsl_error(&loc, state,
2494                                "endInvocationInterlockARB may not be used "
2495                                "before beginInvocationInterlockARB");
2496            if (state->found_end_interlock)
2497               _mesa_glsl_error(&loc, state,
2498                                "endInvocationInterlockARB may not be used twice");
2499            state->found_end_interlock = true;
2500         }
2501
2502         value = generate_call(instructions, sig, &actual_parameters, sub_var,
2503                               array_idx, state);
2504         if (!value) {
2505            ir_variable *const tmp = new(ctx) ir_variable(glsl_type::void_type,
2506                                                          "void_var",
2507                                                          ir_var_temporary);
2508            instructions->push_tail(tmp);
2509            value = new(ctx) ir_dereference_variable(tmp);
2510         }
2511      }
2512
2513      return value;
2514   }
2515
2516   unreachable("not reached");
2517}
2518
2519bool
2520ast_function_expression::has_sequence_subexpression() const
2521{
2522   foreach_list_typed(const ast_node, ast, link, &this->expressions) {
2523      if (ast->has_sequence_subexpression())
2524         return true;
2525   }
2526
2527   return false;
2528}
2529
2530ir_rvalue *
2531ast_aggregate_initializer::hir(exec_list *instructions,
2532                               struct _mesa_glsl_parse_state *state)
2533{
2534   void *ctx = state;
2535   YYLTYPE loc = this->get_location();
2536
2537   if (!this->constructor_type) {
2538      _mesa_glsl_error(&loc, state, "type of C-style initializer unknown");
2539      return ir_rvalue::error_value(ctx);
2540   }
2541   const glsl_type *const constructor_type = this->constructor_type;
2542
2543   if (!state->has_420pack()) {
2544      _mesa_glsl_error(&loc, state, "C-style initialization requires the "
2545                       "GL_ARB_shading_language_420pack extension");
2546      return ir_rvalue::error_value(ctx);
2547   }
2548
2549   if (constructor_type->is_array()) {
2550      return process_array_constructor(instructions, constructor_type, &loc,
2551                                       &this->expressions, state);
2552   }
2553
2554   if (constructor_type->is_struct()) {
2555      return process_record_constructor(instructions, constructor_type, &loc,
2556                                        &this->expressions, state);
2557   }
2558
2559   return process_vec_mat_constructor(instructions, constructor_type, &loc,
2560                                      &this->expressions, state);
2561}
2562