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