glsl: Split code to generate an ir_call out from match_function_by_name.
[mesa.git] / src / glsl / ast_function.cpp
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 "glsl_types.h"
27 #include "ir.h"
28 #include "main/core.h" /* for MIN2 */
29
30 static ir_rvalue *
31 convert_component(ir_rvalue *src, const glsl_type *desired_type);
32
33 bool
34 apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
35 struct _mesa_glsl_parse_state *state);
36
37 static unsigned
38 process_parameters(exec_list *instructions, exec_list *actual_parameters,
39 exec_list *parameters,
40 struct _mesa_glsl_parse_state *state)
41 {
42 unsigned count = 0;
43
44 foreach_list (n, parameters) {
45 ast_node *const ast = exec_node_data(ast_node, n, link);
46 ir_rvalue *result = ast->hir(instructions, state);
47
48 ir_constant *const constant = result->constant_expression_value();
49 if (constant != NULL)
50 result = constant;
51
52 actual_parameters->push_tail(result);
53 count++;
54 }
55
56 return count;
57 }
58
59
60 /**
61 * Generate a source prototype for a function signature
62 *
63 * \param return_type Return type of the function. May be \c NULL.
64 * \param name Name of the function.
65 * \param parameters List of \c ir_instruction nodes representing the
66 * parameter list for the function. This may be either a
67 * formal (\c ir_variable) or actual (\c ir_rvalue)
68 * parameter list. Only the type is used.
69 *
70 * \return
71 * A ralloced string representing the prototype of the function.
72 */
73 char *
74 prototype_string(const glsl_type *return_type, const char *name,
75 exec_list *parameters)
76 {
77 char *str = NULL;
78
79 if (return_type != NULL)
80 str = ralloc_asprintf(NULL, "%s ", return_type->name);
81
82 ralloc_asprintf_append(&str, "%s(", name);
83
84 const char *comma = "";
85 foreach_list(node, parameters) {
86 const ir_instruction *const param = (ir_instruction *) node;
87
88 ralloc_asprintf_append(&str, "%s%s", comma, param->type->name);
89 comma = ", ";
90 }
91
92 ralloc_strcat(&str, ")");
93 return str;
94 }
95
96 static ir_rvalue *
97 generate_call(exec_list *instructions, ir_function_signature *sig,
98 YYLTYPE *loc, exec_list *actual_parameters,
99 struct _mesa_glsl_parse_state *state)
100 {
101 void *ctx = state;
102 exec_list post_call_conversions;
103
104 /* Verify that 'out' and 'inout' actual parameters are lvalues. This
105 * isn't done in ir_function::matching_signature because that function
106 * cannot generate the necessary diagnostics.
107 *
108 * Also, validate that 'const_in' formal parameters (an extension of our
109 * IR) correspond to ir_constant actual parameters.
110 *
111 * Also, perform implicit conversion of arguments. Note: to implicitly
112 * convert out parameters, we need to place them in a temporary
113 * variable, and do the conversion after the call takes place. Since we
114 * haven't emitted the call yet, we'll place the post-call conversions
115 * in a temporary exec_list, and emit them later.
116 */
117 exec_list_iterator actual_iter = actual_parameters->iterator();
118 exec_list_iterator formal_iter = sig->parameters.iterator();
119
120 while (actual_iter.has_next()) {
121 ir_rvalue *actual = (ir_rvalue *) actual_iter.get();
122 ir_variable *formal = (ir_variable *) formal_iter.get();
123
124 assert(actual != NULL);
125 assert(formal != NULL);
126
127 if (formal->mode == ir_var_const_in && !actual->as_constant()) {
128 _mesa_glsl_error(loc, state,
129 "parameter `%s' must be a constant expression",
130 formal->name);
131 return ir_call::get_error_instruction(ctx);
132 }
133
134 if ((formal->mode == ir_var_out)
135 || (formal->mode == ir_var_inout)) {
136 const char *mode = NULL;
137 switch (formal->mode) {
138 case ir_var_out: mode = "out"; break;
139 case ir_var_inout: mode = "inout"; break;
140 default: assert(false); break;
141 }
142 /* FIXME: 'loc' is incorrect (as of 2011-01-21). It is always
143 * FIXME: 0:0(0).
144 */
145 if (actual->variable_referenced()
146 && actual->variable_referenced()->read_only) {
147 _mesa_glsl_error(loc, state,
148 "function parameter '%s %s' references the "
149 "read-only variable '%s'",
150 mode, formal->name,
151 actual->variable_referenced()->name);
152
153 } else if (!actual->is_lvalue()) {
154 _mesa_glsl_error(loc, state,
155 "function parameter '%s %s' is not an lvalue",
156 mode, formal->name);
157 }
158 }
159
160 if (formal->type->is_numeric() || formal->type->is_boolean()) {
161 switch (formal->mode) {
162 case ir_var_const_in:
163 case ir_var_in: {
164 ir_rvalue *converted
165 = convert_component(actual, formal->type);
166 actual->replace_with(converted);
167 break;
168 }
169 case ir_var_out:
170 if (actual->type != formal->type) {
171 /* To convert an out parameter, we need to create a
172 * temporary variable to hold the value before conversion,
173 * and then perform the conversion after the function call
174 * returns.
175 *
176 * This has the effect of transforming code like this:
177 *
178 * void f(out int x);
179 * float value;
180 * f(value);
181 *
182 * Into IR that's equivalent to this:
183 *
184 * void f(out int x);
185 * float value;
186 * int out_parameter_conversion;
187 * f(out_parameter_conversion);
188 * value = float(out_parameter_conversion);
189 */
190 ir_variable *tmp =
191 new(ctx) ir_variable(formal->type,
192 "out_parameter_conversion",
193 ir_var_temporary);
194 instructions->push_tail(tmp);
195 ir_dereference_variable *deref_tmp_1
196 = new(ctx) ir_dereference_variable(tmp);
197 ir_dereference_variable *deref_tmp_2
198 = new(ctx) ir_dereference_variable(tmp);
199 ir_rvalue *converted_tmp
200 = convert_component(deref_tmp_1, actual->type);
201 ir_assignment *assignment
202 = new(ctx) ir_assignment(actual, converted_tmp);
203 post_call_conversions.push_tail(assignment);
204 actual->replace_with(deref_tmp_2);
205 }
206 break;
207 case ir_var_inout:
208 /* Inout parameters should never require conversion, since that
209 * would require an implicit conversion to exist both to and
210 * from the formal parameter type, and there are no
211 * bidirectional implicit conversions.
212 */
213 assert (actual->type == formal->type);
214 break;
215 default:
216 assert (!"Illegal formal parameter mode");
217 break;
218 }
219 }
220
221 actual_iter.next();
222 formal_iter.next();
223 }
224
225 /* Always insert the call in the instruction stream, and return a deref
226 * of its return val if it returns a value, since we don't know if
227 * the rvalue is going to be assigned to anything or not.
228 *
229 * Also insert any out parameter conversions after the call.
230 */
231 ir_call *call = new(ctx) ir_call(sig, actual_parameters);
232 ir_dereference_variable *deref;
233 if (!sig->return_type->is_void()) {
234 /* If the function call is a constant expression, don't
235 * generate the instructions to call it; just generate an
236 * ir_constant representing the constant value.
237 *
238 * Function calls can only be constant expressions starting
239 * in GLSL 1.20.
240 */
241 if (state->language_version >= 120) {
242 ir_constant *const_val = call->constant_expression_value();
243 if (const_val) {
244 return const_val;
245 }
246 }
247
248 ir_variable *var;
249
250 var = new(ctx) ir_variable(sig->return_type,
251 ralloc_asprintf(ctx, "%s_retval",
252 sig->function_name()),
253 ir_var_temporary);
254 instructions->push_tail(var);
255
256 deref = new(ctx) ir_dereference_variable(var);
257 ir_assignment *assign = new(ctx) ir_assignment(deref, call, NULL);
258 instructions->push_tail(assign);
259
260 deref = new(ctx) ir_dereference_variable(var);
261 } else {
262 instructions->push_tail(call);
263 deref = NULL;
264 }
265 instructions->append_list(&post_call_conversions);
266 return deref;
267 }
268
269 static ir_rvalue *
270 match_function_by_name(exec_list *instructions, const char *name,
271 YYLTYPE *loc, exec_list *actual_parameters,
272 struct _mesa_glsl_parse_state *state)
273 {
274 void *ctx = state;
275 ir_function *f = state->symbols->get_function(name);
276 ir_function_signature *sig;
277
278 sig = f ? f->matching_signature(actual_parameters) : NULL;
279
280 /* FINISHME: This doesn't handle the case where shader X contains a
281 * FINISHME: matching signature but shader X + N contains an _exact_
282 * FINISHME: matching signature.
283 */
284 if (sig == NULL
285 && (f == NULL || state->es_shader || !f->has_user_signature())
286 && state->symbols->get_type(name) == NULL
287 && (state->language_version == 110
288 || state->symbols->get_variable(name) == NULL)) {
289 /* The current shader doesn't contain a matching function or signature.
290 * Before giving up, look for the prototype in the built-in functions.
291 */
292 _mesa_glsl_initialize_functions(state);
293 for (unsigned i = 0; i < state->num_builtins_to_link; i++) {
294 ir_function *builtin;
295 builtin = state->builtins_to_link[i]->symbols->get_function(name);
296 sig = builtin ? builtin->matching_signature(actual_parameters) : NULL;
297 if (sig != NULL) {
298 if (f == NULL) {
299 f = new(ctx) ir_function(name);
300 state->symbols->add_global_function(f);
301 emit_function(state, f);
302 }
303
304 f->add_signature(sig->clone_prototype(f, NULL));
305 break;
306 }
307 }
308 }
309
310 if (sig != NULL) {
311 return generate_call(instructions, sig, loc, actual_parameters, state);
312 } else {
313 char *str = prototype_string(NULL, name, actual_parameters);
314
315 _mesa_glsl_error(loc, state, "no matching function for call to `%s'",
316 str);
317 ralloc_free(str);
318
319 const char *prefix = "candidates are: ";
320
321 for (int i = -1; i < (int) state->num_builtins_to_link; i++) {
322 glsl_symbol_table *syms = i >= 0 ? state->builtins_to_link[i]->symbols
323 : state->symbols;
324 f = syms->get_function(name);
325 if (f == NULL)
326 continue;
327
328 foreach_list (node, &f->signatures) {
329 ir_function_signature *sig = (ir_function_signature *) node;
330
331 str = prototype_string(sig->return_type, f->name, &sig->parameters);
332 _mesa_glsl_error(loc, state, "%s%s", prefix, str);
333 ralloc_free(str);
334
335 prefix = " ";
336 }
337
338 }
339
340 return ir_call::get_error_instruction(ctx);
341 }
342 }
343
344
345 /**
346 * Perform automatic type conversion of constructor parameters
347 *
348 * This implements the rules in the "Conversion and Scalar Constructors"
349 * section (GLSL 1.10 section 5.4.1), not the "Implicit Conversions" rules.
350 */
351 static ir_rvalue *
352 convert_component(ir_rvalue *src, const glsl_type *desired_type)
353 {
354 void *ctx = ralloc_parent(src);
355 const unsigned a = desired_type->base_type;
356 const unsigned b = src->type->base_type;
357 ir_expression *result = NULL;
358
359 if (src->type->is_error())
360 return src;
361
362 assert(a <= GLSL_TYPE_BOOL);
363 assert(b <= GLSL_TYPE_BOOL);
364
365 if (a == b)
366 return src;
367
368 switch (a) {
369 case GLSL_TYPE_UINT:
370 switch (b) {
371 case GLSL_TYPE_INT:
372 result = new(ctx) ir_expression(ir_unop_i2u, src);
373 break;
374 case GLSL_TYPE_FLOAT:
375 result = new(ctx) ir_expression(ir_unop_i2u,
376 new(ctx) ir_expression(ir_unop_f2i, src));
377 break;
378 case GLSL_TYPE_BOOL:
379 result = new(ctx) ir_expression(ir_unop_i2u,
380 new(ctx) ir_expression(ir_unop_b2i, src));
381 break;
382 }
383 break;
384 case GLSL_TYPE_INT:
385 switch (b) {
386 case GLSL_TYPE_UINT:
387 result = new(ctx) ir_expression(ir_unop_u2i, src);
388 break;
389 case GLSL_TYPE_FLOAT:
390 result = new(ctx) ir_expression(ir_unop_f2i, src);
391 break;
392 case GLSL_TYPE_BOOL:
393 result = new(ctx) ir_expression(ir_unop_b2i, src);
394 break;
395 }
396 break;
397 case GLSL_TYPE_FLOAT:
398 switch (b) {
399 case GLSL_TYPE_UINT:
400 result = new(ctx) ir_expression(ir_unop_u2f, desired_type, src, NULL);
401 break;
402 case GLSL_TYPE_INT:
403 result = new(ctx) ir_expression(ir_unop_i2f, desired_type, src, NULL);
404 break;
405 case GLSL_TYPE_BOOL:
406 result = new(ctx) ir_expression(ir_unop_b2f, desired_type, src, NULL);
407 break;
408 }
409 break;
410 case GLSL_TYPE_BOOL:
411 switch (b) {
412 case GLSL_TYPE_UINT:
413 result = new(ctx) ir_expression(ir_unop_i2b,
414 new(ctx) ir_expression(ir_unop_u2i, src));
415 break;
416 case GLSL_TYPE_INT:
417 result = new(ctx) ir_expression(ir_unop_i2b, desired_type, src, NULL);
418 break;
419 case GLSL_TYPE_FLOAT:
420 result = new(ctx) ir_expression(ir_unop_f2b, desired_type, src, NULL);
421 break;
422 }
423 break;
424 }
425
426 assert(result != NULL);
427 assert(result->type == desired_type);
428
429 /* Try constant folding; it may fold in the conversion we just added. */
430 ir_constant *const constant = result->constant_expression_value();
431 return (constant != NULL) ? (ir_rvalue *) constant : (ir_rvalue *) result;
432 }
433
434 /**
435 * Dereference a specific component from a scalar, vector, or matrix
436 */
437 static ir_rvalue *
438 dereference_component(ir_rvalue *src, unsigned component)
439 {
440 void *ctx = ralloc_parent(src);
441 assert(component < src->type->components());
442
443 /* If the source is a constant, just create a new constant instead of a
444 * dereference of the existing constant.
445 */
446 ir_constant *constant = src->as_constant();
447 if (constant)
448 return new(ctx) ir_constant(constant, component);
449
450 if (src->type->is_scalar()) {
451 return src;
452 } else if (src->type->is_vector()) {
453 return new(ctx) ir_swizzle(src, component, 0, 0, 0, 1);
454 } else {
455 assert(src->type->is_matrix());
456
457 /* Dereference a row of the matrix, then call this function again to get
458 * a specific element from that row.
459 */
460 const int c = component / src->type->column_type()->vector_elements;
461 const int r = component % src->type->column_type()->vector_elements;
462 ir_constant *const col_index = new(ctx) ir_constant(c);
463 ir_dereference *const col = new(ctx) ir_dereference_array(src, col_index);
464
465 col->type = src->type->column_type();
466
467 return dereference_component(col, r);
468 }
469
470 assert(!"Should not get here.");
471 return NULL;
472 }
473
474
475 static ir_rvalue *
476 process_array_constructor(exec_list *instructions,
477 const glsl_type *constructor_type,
478 YYLTYPE *loc, exec_list *parameters,
479 struct _mesa_glsl_parse_state *state)
480 {
481 void *ctx = state;
482 /* Array constructors come in two forms: sized and unsized. Sized array
483 * constructors look like 'vec4[2](a, b)', where 'a' and 'b' are vec4
484 * variables. In this case the number of parameters must exactly match the
485 * specified size of the array.
486 *
487 * Unsized array constructors look like 'vec4[](a, b)', where 'a' and 'b'
488 * are vec4 variables. In this case the size of the array being constructed
489 * is determined by the number of parameters.
490 *
491 * From page 52 (page 58 of the PDF) of the GLSL 1.50 spec:
492 *
493 * "There must be exactly the same number of arguments as the size of
494 * the array being constructed. If no size is present in the
495 * constructor, then the array is explicitly sized to the number of
496 * arguments provided. The arguments are assigned in order, starting at
497 * element 0, to the elements of the constructed array. Each argument
498 * must be the same type as the element type of the array, or be a type
499 * that can be converted to the element type of the array according to
500 * Section 4.1.10 "Implicit Conversions.""
501 */
502 exec_list actual_parameters;
503 const unsigned parameter_count =
504 process_parameters(instructions, &actual_parameters, parameters, state);
505
506 if ((parameter_count == 0)
507 || ((constructor_type->length != 0)
508 && (constructor_type->length != parameter_count))) {
509 const unsigned min_param = (constructor_type->length == 0)
510 ? 1 : constructor_type->length;
511
512 _mesa_glsl_error(loc, state, "array constructor must have %s %u "
513 "parameter%s",
514 (constructor_type->length != 0) ? "at least" : "exactly",
515 min_param, (min_param <= 1) ? "" : "s");
516 return ir_call::get_error_instruction(ctx);
517 }
518
519 if (constructor_type->length == 0) {
520 constructor_type =
521 glsl_type::get_array_instance(constructor_type->element_type(),
522 parameter_count);
523 assert(constructor_type != NULL);
524 assert(constructor_type->length == parameter_count);
525 }
526
527 bool all_parameters_are_constant = true;
528
529 /* Type cast each parameter and, if possible, fold constants. */
530 foreach_list_safe(n, &actual_parameters) {
531 ir_rvalue *ir = (ir_rvalue *) n;
532 ir_rvalue *result = ir;
533
534 /* Apply implicit conversions (not the scalar constructor rules!). See
535 * the spec quote above. */
536 if (constructor_type->element_type()->is_float()) {
537 const glsl_type *desired_type =
538 glsl_type::get_instance(GLSL_TYPE_FLOAT,
539 ir->type->vector_elements,
540 ir->type->matrix_columns);
541 if (result->type->can_implicitly_convert_to(desired_type)) {
542 /* Even though convert_component() implements the constructor
543 * conversion rules (not the implicit conversion rules), its safe
544 * to use it here because we already checked that the implicit
545 * conversion is legal.
546 */
547 result = convert_component(ir, desired_type);
548 }
549 }
550
551 if (result->type != constructor_type->element_type()) {
552 _mesa_glsl_error(loc, state, "type error in array constructor: "
553 "expected: %s, found %s",
554 constructor_type->element_type()->name,
555 result->type->name);
556 }
557
558 /* Attempt to convert the parameter to a constant valued expression.
559 * After doing so, track whether or not all the parameters to the
560 * constructor are trivially constant valued expressions.
561 */
562 ir_rvalue *const constant = result->constant_expression_value();
563
564 if (constant != NULL)
565 result = constant;
566 else
567 all_parameters_are_constant = false;
568
569 ir->replace_with(result);
570 }
571
572 if (all_parameters_are_constant)
573 return new(ctx) ir_constant(constructor_type, &actual_parameters);
574
575 ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor",
576 ir_var_temporary);
577 instructions->push_tail(var);
578
579 int i = 0;
580 foreach_list(node, &actual_parameters) {
581 ir_rvalue *rhs = (ir_rvalue *) node;
582 ir_rvalue *lhs = new(ctx) ir_dereference_array(var,
583 new(ctx) ir_constant(i));
584
585 ir_instruction *assignment = new(ctx) ir_assignment(lhs, rhs, NULL);
586 instructions->push_tail(assignment);
587
588 i++;
589 }
590
591 return new(ctx) ir_dereference_variable(var);
592 }
593
594
595 /**
596 * Try to convert a record constructor to a constant expression
597 */
598 static ir_constant *
599 constant_record_constructor(const glsl_type *constructor_type,
600 exec_list *parameters, void *mem_ctx)
601 {
602 foreach_list(node, parameters) {
603 ir_constant *constant = ((ir_instruction *) node)->as_constant();
604 if (constant == NULL)
605 return NULL;
606 node->replace_with(constant);
607 }
608
609 return new(mem_ctx) ir_constant(constructor_type, parameters);
610 }
611
612
613 /**
614 * Determine if a list consists of a single scalar r-value
615 */
616 bool
617 single_scalar_parameter(exec_list *parameters)
618 {
619 const ir_rvalue *const p = (ir_rvalue *) parameters->head;
620 assert(((ir_rvalue *)p)->as_rvalue() != NULL);
621
622 return (p->type->is_scalar() && p->next->is_tail_sentinel());
623 }
624
625
626 /**
627 * Generate inline code for a vector constructor
628 *
629 * The generated constructor code will consist of a temporary variable
630 * declaration of the same type as the constructor. A sequence of assignments
631 * from constructor parameters to the temporary will follow.
632 *
633 * \return
634 * An \c ir_dereference_variable of the temprorary generated in the constructor
635 * body.
636 */
637 ir_rvalue *
638 emit_inline_vector_constructor(const glsl_type *type,
639 exec_list *instructions,
640 exec_list *parameters,
641 void *ctx)
642 {
643 assert(!parameters->is_empty());
644
645 ir_variable *var = new(ctx) ir_variable(type, "vec_ctor", ir_var_temporary);
646 instructions->push_tail(var);
647
648 /* There are two kinds of vector constructors.
649 *
650 * - Construct a vector from a single scalar by replicating that scalar to
651 * all components of the vector.
652 *
653 * - Construct a vector from an arbirary combination of vectors and
654 * scalars. The components of the constructor parameters are assigned
655 * to the vector in order until the vector is full.
656 */
657 const unsigned lhs_components = type->components();
658 if (single_scalar_parameter(parameters)) {
659 ir_rvalue *first_param = (ir_rvalue *)parameters->head;
660 ir_rvalue *rhs = new(ctx) ir_swizzle(first_param, 0, 0, 0, 0,
661 lhs_components);
662 ir_dereference_variable *lhs = new(ctx) ir_dereference_variable(var);
663 const unsigned mask = (1U << lhs_components) - 1;
664
665 assert(rhs->type == lhs->type);
666
667 ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, NULL, mask);
668 instructions->push_tail(inst);
669 } else {
670 unsigned base_component = 0;
671 unsigned base_lhs_component = 0;
672 ir_constant_data data;
673 unsigned constant_mask = 0, constant_components = 0;
674
675 memset(&data, 0, sizeof(data));
676
677 foreach_list(node, parameters) {
678 ir_rvalue *param = (ir_rvalue *) node;
679 unsigned rhs_components = param->type->components();
680
681 /* Do not try to assign more components to the vector than it has!
682 */
683 if ((rhs_components + base_lhs_component) > lhs_components) {
684 rhs_components = lhs_components - base_lhs_component;
685 }
686
687 const ir_constant *const c = param->as_constant();
688 if (c != NULL) {
689 for (unsigned i = 0; i < rhs_components; i++) {
690 switch (c->type->base_type) {
691 case GLSL_TYPE_UINT:
692 data.u[i + base_component] = c->get_uint_component(i);
693 break;
694 case GLSL_TYPE_INT:
695 data.i[i + base_component] = c->get_int_component(i);
696 break;
697 case GLSL_TYPE_FLOAT:
698 data.f[i + base_component] = c->get_float_component(i);
699 break;
700 case GLSL_TYPE_BOOL:
701 data.b[i + base_component] = c->get_bool_component(i);
702 break;
703 default:
704 assert(!"Should not get here.");
705 break;
706 }
707 }
708
709 /* Mask of fields to be written in the assignment.
710 */
711 constant_mask |= ((1U << rhs_components) - 1) << base_lhs_component;
712 constant_components += rhs_components;
713
714 base_component += rhs_components;
715 }
716 /* Advance the component index by the number of components
717 * that were just assigned.
718 */
719 base_lhs_component += rhs_components;
720 }
721
722 if (constant_mask != 0) {
723 ir_dereference *lhs = new(ctx) ir_dereference_variable(var);
724 const glsl_type *rhs_type = glsl_type::get_instance(var->type->base_type,
725 constant_components,
726 1);
727 ir_rvalue *rhs = new(ctx) ir_constant(rhs_type, &data);
728
729 ir_instruction *inst =
730 new(ctx) ir_assignment(lhs, rhs, NULL, constant_mask);
731 instructions->push_tail(inst);
732 }
733
734 base_component = 0;
735 foreach_list(node, parameters) {
736 ir_rvalue *param = (ir_rvalue *) node;
737 unsigned rhs_components = param->type->components();
738
739 /* Do not try to assign more components to the vector than it has!
740 */
741 if ((rhs_components + base_component) > lhs_components) {
742 rhs_components = lhs_components - base_component;
743 }
744
745 const ir_constant *const c = param->as_constant();
746 if (c == NULL) {
747 /* Mask of fields to be written in the assignment.
748 */
749 const unsigned write_mask = ((1U << rhs_components) - 1)
750 << base_component;
751
752 ir_dereference *lhs = new(ctx) ir_dereference_variable(var);
753
754 /* Generate a swizzle so that LHS and RHS sizes match.
755 */
756 ir_rvalue *rhs =
757 new(ctx) ir_swizzle(param, 0, 1, 2, 3, rhs_components);
758
759 ir_instruction *inst =
760 new(ctx) ir_assignment(lhs, rhs, NULL, write_mask);
761 instructions->push_tail(inst);
762 }
763
764 /* Advance the component index by the number of components that were
765 * just assigned.
766 */
767 base_component += rhs_components;
768 }
769 }
770 return new(ctx) ir_dereference_variable(var);
771 }
772
773
774 /**
775 * Generate assignment of a portion of a vector to a portion of a matrix column
776 *
777 * \param src_base First component of the source to be used in assignment
778 * \param column Column of destination to be assiged
779 * \param row_base First component of the destination column to be assigned
780 * \param count Number of components to be assigned
781 *
782 * \note
783 * \c src_base + \c count must be less than or equal to the number of components
784 * in the source vector.
785 */
786 ir_instruction *
787 assign_to_matrix_column(ir_variable *var, unsigned column, unsigned row_base,
788 ir_rvalue *src, unsigned src_base, unsigned count,
789 void *mem_ctx)
790 {
791 ir_constant *col_idx = new(mem_ctx) ir_constant(column);
792 ir_dereference *column_ref = new(mem_ctx) ir_dereference_array(var, col_idx);
793
794 assert(column_ref->type->components() >= (row_base + count));
795 assert(src->type->components() >= (src_base + count));
796
797 /* Generate a swizzle that extracts the number of components from the source
798 * that are to be assigned to the column of the matrix.
799 */
800 if (count < src->type->vector_elements) {
801 src = new(mem_ctx) ir_swizzle(src,
802 src_base + 0, src_base + 1,
803 src_base + 2, src_base + 3,
804 count);
805 }
806
807 /* Mask of fields to be written in the assignment.
808 */
809 const unsigned write_mask = ((1U << count) - 1) << row_base;
810
811 return new(mem_ctx) ir_assignment(column_ref, src, NULL, write_mask);
812 }
813
814
815 /**
816 * Generate inline code for a matrix constructor
817 *
818 * The generated constructor code will consist of a temporary variable
819 * declaration of the same type as the constructor. A sequence of assignments
820 * from constructor parameters to the temporary will follow.
821 *
822 * \return
823 * An \c ir_dereference_variable of the temprorary generated in the constructor
824 * body.
825 */
826 ir_rvalue *
827 emit_inline_matrix_constructor(const glsl_type *type,
828 exec_list *instructions,
829 exec_list *parameters,
830 void *ctx)
831 {
832 assert(!parameters->is_empty());
833
834 ir_variable *var = new(ctx) ir_variable(type, "mat_ctor", ir_var_temporary);
835 instructions->push_tail(var);
836
837 /* There are three kinds of matrix constructors.
838 *
839 * - Construct a matrix from a single scalar by replicating that scalar to
840 * along the diagonal of the matrix and setting all other components to
841 * zero.
842 *
843 * - Construct a matrix from an arbirary combination of vectors and
844 * scalars. The components of the constructor parameters are assigned
845 * to the matrix in colum-major order until the matrix is full.
846 *
847 * - Construct a matrix from a single matrix. The source matrix is copied
848 * to the upper left portion of the constructed matrix, and the remaining
849 * elements take values from the identity matrix.
850 */
851 ir_rvalue *const first_param = (ir_rvalue *) parameters->head;
852 if (single_scalar_parameter(parameters)) {
853 /* Assign the scalar to the X component of a vec4, and fill the remaining
854 * components with zero.
855 */
856 ir_variable *rhs_var =
857 new(ctx) ir_variable(glsl_type::vec4_type, "mat_ctor_vec",
858 ir_var_temporary);
859 instructions->push_tail(rhs_var);
860
861 ir_constant_data zero;
862 zero.f[0] = 0.0;
863 zero.f[1] = 0.0;
864 zero.f[2] = 0.0;
865 zero.f[3] = 0.0;
866
867 ir_instruction *inst =
868 new(ctx) ir_assignment(new(ctx) ir_dereference_variable(rhs_var),
869 new(ctx) ir_constant(rhs_var->type, &zero),
870 NULL);
871 instructions->push_tail(inst);
872
873 ir_dereference *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var);
874
875 inst = new(ctx) ir_assignment(rhs_ref, first_param, NULL, 0x01);
876 instructions->push_tail(inst);
877
878 /* Assign the temporary vector to each column of the destination matrix
879 * with a swizzle that puts the X component on the diagonal of the
880 * matrix. In some cases this may mean that the X component does not
881 * get assigned into the column at all (i.e., when the matrix has more
882 * columns than rows).
883 */
884 static const unsigned rhs_swiz[4][4] = {
885 { 0, 1, 1, 1 },
886 { 1, 0, 1, 1 },
887 { 1, 1, 0, 1 },
888 { 1, 1, 1, 0 }
889 };
890
891 const unsigned cols_to_init = MIN2(type->matrix_columns,
892 type->vector_elements);
893 for (unsigned i = 0; i < cols_to_init; i++) {
894 ir_constant *const col_idx = new(ctx) ir_constant(i);
895 ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, col_idx);
896
897 ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var);
898 ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, rhs_swiz[i],
899 type->vector_elements);
900
901 inst = new(ctx) ir_assignment(col_ref, rhs, NULL);
902 instructions->push_tail(inst);
903 }
904
905 for (unsigned i = cols_to_init; i < type->matrix_columns; i++) {
906 ir_constant *const col_idx = new(ctx) ir_constant(i);
907 ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, col_idx);
908
909 ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var);
910 ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, 1, 1, 1, 1,
911 type->vector_elements);
912
913 inst = new(ctx) ir_assignment(col_ref, rhs, NULL);
914 instructions->push_tail(inst);
915 }
916 } else if (first_param->type->is_matrix()) {
917 /* From page 50 (56 of the PDF) of the GLSL 1.50 spec:
918 *
919 * "If a matrix is constructed from a matrix, then each component
920 * (column i, row j) in the result that has a corresponding
921 * component (column i, row j) in the argument will be initialized
922 * from there. All other components will be initialized to the
923 * identity matrix. If a matrix argument is given to a matrix
924 * constructor, it is an error to have any other arguments."
925 */
926 assert(first_param->next->is_tail_sentinel());
927 ir_rvalue *const src_matrix = first_param;
928
929 /* If the source matrix is smaller, pre-initialize the relavent parts of
930 * the destination matrix to the identity matrix.
931 */
932 if ((src_matrix->type->matrix_columns < var->type->matrix_columns)
933 || (src_matrix->type->vector_elements < var->type->vector_elements)) {
934
935 /* If the source matrix has fewer rows, every column of the destination
936 * must be initialized. Otherwise only the columns in the destination
937 * that do not exist in the source must be initialized.
938 */
939 unsigned col =
940 (src_matrix->type->vector_elements < var->type->vector_elements)
941 ? 0 : src_matrix->type->matrix_columns;
942
943 const glsl_type *const col_type = var->type->column_type();
944 for (/* empty */; col < var->type->matrix_columns; col++) {
945 ir_constant_data ident;
946
947 ident.f[0] = 0.0;
948 ident.f[1] = 0.0;
949 ident.f[2] = 0.0;
950 ident.f[3] = 0.0;
951
952 ident.f[col] = 1.0;
953
954 ir_rvalue *const rhs = new(ctx) ir_constant(col_type, &ident);
955
956 ir_rvalue *const lhs =
957 new(ctx) ir_dereference_array(var, new(ctx) ir_constant(col));
958
959 ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, NULL);
960 instructions->push_tail(inst);
961 }
962 }
963
964 /* Assign columns from the source matrix to the destination matrix.
965 *
966 * Since the parameter will be used in the RHS of multiple assignments,
967 * generate a temporary and copy the paramter there.
968 */
969 ir_variable *const rhs_var =
970 new(ctx) ir_variable(first_param->type, "mat_ctor_mat",
971 ir_var_temporary);
972 instructions->push_tail(rhs_var);
973
974 ir_dereference *const rhs_var_ref =
975 new(ctx) ir_dereference_variable(rhs_var);
976 ir_instruction *const inst =
977 new(ctx) ir_assignment(rhs_var_ref, first_param, NULL);
978 instructions->push_tail(inst);
979
980 const unsigned last_row = MIN2(src_matrix->type->vector_elements,
981 var->type->vector_elements);
982 const unsigned last_col = MIN2(src_matrix->type->matrix_columns,
983 var->type->matrix_columns);
984
985 unsigned swiz[4] = { 0, 0, 0, 0 };
986 for (unsigned i = 1; i < last_row; i++)
987 swiz[i] = i;
988
989 const unsigned write_mask = (1U << last_row) - 1;
990
991 for (unsigned i = 0; i < last_col; i++) {
992 ir_dereference *const lhs =
993 new(ctx) ir_dereference_array(var, new(ctx) ir_constant(i));
994 ir_rvalue *const rhs_col =
995 new(ctx) ir_dereference_array(rhs_var, new(ctx) ir_constant(i));
996
997 /* If one matrix has columns that are smaller than the columns of the
998 * other matrix, wrap the column access of the larger with a swizzle
999 * so that the LHS and RHS of the assignment have the same size (and
1000 * therefore have the same type).
1001 *
1002 * It would be perfectly valid to unconditionally generate the
1003 * swizzles, this this will typically result in a more compact IR tree.
1004 */
1005 ir_rvalue *rhs;
1006 if (lhs->type->vector_elements != rhs_col->type->vector_elements) {
1007 rhs = new(ctx) ir_swizzle(rhs_col, swiz, last_row);
1008 } else {
1009 rhs = rhs_col;
1010 }
1011
1012 ir_instruction *inst =
1013 new(ctx) ir_assignment(lhs, rhs, NULL, write_mask);
1014 instructions->push_tail(inst);
1015 }
1016 } else {
1017 const unsigned cols = type->matrix_columns;
1018 const unsigned rows = type->vector_elements;
1019 unsigned col_idx = 0;
1020 unsigned row_idx = 0;
1021
1022 foreach_list (node, parameters) {
1023 ir_rvalue *const rhs = (ir_rvalue *) node;
1024 const unsigned components_remaining_this_column = rows - row_idx;
1025 unsigned rhs_components = rhs->type->components();
1026 unsigned rhs_base = 0;
1027
1028 /* Since the parameter might be used in the RHS of two assignments,
1029 * generate a temporary and copy the paramter there.
1030 */
1031 ir_variable *rhs_var =
1032 new(ctx) ir_variable(rhs->type, "mat_ctor_vec", ir_var_temporary);
1033 instructions->push_tail(rhs_var);
1034
1035 ir_dereference *rhs_var_ref =
1036 new(ctx) ir_dereference_variable(rhs_var);
1037 ir_instruction *inst = new(ctx) ir_assignment(rhs_var_ref, rhs, NULL);
1038 instructions->push_tail(inst);
1039
1040 /* Assign the current parameter to as many components of the matrix
1041 * as it will fill.
1042 *
1043 * NOTE: A single vector parameter can span two matrix columns. A
1044 * single vec4, for example, can completely fill a mat2.
1045 */
1046 if (rhs_components >= components_remaining_this_column) {
1047 const unsigned count = MIN2(rhs_components,
1048 components_remaining_this_column);
1049
1050 rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var);
1051
1052 ir_instruction *inst = assign_to_matrix_column(var, col_idx,
1053 row_idx,
1054 rhs_var_ref, 0,
1055 count, ctx);
1056 instructions->push_tail(inst);
1057
1058 rhs_base = count;
1059
1060 col_idx++;
1061 row_idx = 0;
1062 }
1063
1064 /* If there is data left in the parameter and components left to be
1065 * set in the destination, emit another assignment. It is possible
1066 * that the assignment could be of a vec4 to the last element of the
1067 * matrix. In this case col_idx==cols, but there is still data
1068 * left in the source parameter. Obviously, don't emit an assignment
1069 * to data outside the destination matrix.
1070 */
1071 if ((col_idx < cols) && (rhs_base < rhs_components)) {
1072 const unsigned count = rhs_components - rhs_base;
1073
1074 rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var);
1075
1076 ir_instruction *inst = assign_to_matrix_column(var, col_idx,
1077 row_idx,
1078 rhs_var_ref,
1079 rhs_base,
1080 count, ctx);
1081 instructions->push_tail(inst);
1082
1083 row_idx += count;
1084 }
1085 }
1086 }
1087
1088 return new(ctx) ir_dereference_variable(var);
1089 }
1090
1091
1092 ir_rvalue *
1093 emit_inline_record_constructor(const glsl_type *type,
1094 exec_list *instructions,
1095 exec_list *parameters,
1096 void *mem_ctx)
1097 {
1098 ir_variable *const var =
1099 new(mem_ctx) ir_variable(type, "record_ctor", ir_var_temporary);
1100 ir_dereference_variable *const d = new(mem_ctx) ir_dereference_variable(var);
1101
1102 instructions->push_tail(var);
1103
1104 exec_node *node = parameters->head;
1105 for (unsigned i = 0; i < type->length; i++) {
1106 assert(!node->is_tail_sentinel());
1107
1108 ir_dereference *const lhs =
1109 new(mem_ctx) ir_dereference_record(d->clone(mem_ctx, NULL),
1110 type->fields.structure[i].name);
1111
1112 ir_rvalue *const rhs = ((ir_instruction *) node)->as_rvalue();
1113 assert(rhs != NULL);
1114
1115 ir_instruction *const assign = new(mem_ctx) ir_assignment(lhs, rhs, NULL);
1116
1117 instructions->push_tail(assign);
1118 node = node->next;
1119 }
1120
1121 return d;
1122 }
1123
1124
1125 ir_rvalue *
1126 ast_function_expression::hir(exec_list *instructions,
1127 struct _mesa_glsl_parse_state *state)
1128 {
1129 void *ctx = state;
1130 /* There are three sorts of function calls.
1131 *
1132 * 1. constructors - The first subexpression is an ast_type_specifier.
1133 * 2. methods - Only the .length() method of array types.
1134 * 3. functions - Calls to regular old functions.
1135 *
1136 * Method calls are actually detected when the ast_field_selection
1137 * expression is handled.
1138 */
1139 if (is_constructor()) {
1140 const ast_type_specifier *type = (ast_type_specifier *) subexpressions[0];
1141 YYLTYPE loc = type->get_location();
1142 const char *name;
1143
1144 const glsl_type *const constructor_type = type->glsl_type(& name, state);
1145
1146 /* constructor_type can be NULL if a variable with the same name as the
1147 * structure has come into scope.
1148 */
1149 if (constructor_type == NULL) {
1150 _mesa_glsl_error(& loc, state, "unknown type `%s' (structure name "
1151 "may be shadowed by a variable with the same name)",
1152 type->type_name);
1153 return ir_call::get_error_instruction(ctx);
1154 }
1155
1156
1157 /* Constructors for samplers are illegal.
1158 */
1159 if (constructor_type->is_sampler()) {
1160 _mesa_glsl_error(& loc, state, "cannot construct sampler type `%s'",
1161 constructor_type->name);
1162 return ir_call::get_error_instruction(ctx);
1163 }
1164
1165 if (constructor_type->is_array()) {
1166 if (state->language_version <= 110) {
1167 _mesa_glsl_error(& loc, state,
1168 "array constructors forbidden in GLSL 1.10");
1169 return ir_call::get_error_instruction(ctx);
1170 }
1171
1172 return process_array_constructor(instructions, constructor_type,
1173 & loc, &this->expressions, state);
1174 }
1175
1176
1177 /* There are two kinds of constructor call. Constructors for built-in
1178 * language types, such as mat4 and vec2, are free form. The only
1179 * requirement is that the parameters must provide enough values of the
1180 * correct scalar type. Constructors for arrays and structures must
1181 * have the exact number of parameters with matching types in the
1182 * correct order. These constructors follow essentially the same type
1183 * matching rules as functions.
1184 */
1185 if (constructor_type->is_record()) {
1186 exec_list actual_parameters;
1187
1188 process_parameters(instructions, &actual_parameters,
1189 &this->expressions, state);
1190
1191 exec_node *node = actual_parameters.head;
1192 for (unsigned i = 0; i < constructor_type->length; i++) {
1193 ir_rvalue *ir = (ir_rvalue *) node;
1194
1195 if (node->is_tail_sentinel()) {
1196 _mesa_glsl_error(&loc, state,
1197 "insufficient parameters to constructor "
1198 "for `%s'",
1199 constructor_type->name);
1200 return ir_call::get_error_instruction(ctx);
1201 }
1202
1203 if (apply_implicit_conversion(constructor_type->fields.structure[i].type,
1204 ir, state)) {
1205 node->replace_with(ir);
1206 } else {
1207 _mesa_glsl_error(&loc, state,
1208 "parameter type mismatch in constructor "
1209 "for `%s.%s' (%s vs %s)",
1210 constructor_type->name,
1211 constructor_type->fields.structure[i].name,
1212 ir->type->name,
1213 constructor_type->fields.structure[i].type->name);
1214 return ir_call::get_error_instruction(ctx);;
1215 }
1216
1217 node = node->next;
1218 }
1219
1220 if (!node->is_tail_sentinel()) {
1221 _mesa_glsl_error(&loc, state, "too many parameters in constructor "
1222 "for `%s'", constructor_type->name);
1223 return ir_call::get_error_instruction(ctx);
1224 }
1225
1226 ir_rvalue *const constant =
1227 constant_record_constructor(constructor_type, &actual_parameters,
1228 state);
1229
1230 return (constant != NULL)
1231 ? constant
1232 : emit_inline_record_constructor(constructor_type, instructions,
1233 &actual_parameters, state);
1234 }
1235
1236 if (!constructor_type->is_numeric() && !constructor_type->is_boolean())
1237 return ir_call::get_error_instruction(ctx);
1238
1239 /* Total number of components of the type being constructed. */
1240 const unsigned type_components = constructor_type->components();
1241
1242 /* Number of components from parameters that have actually been
1243 * consumed. This is used to perform several kinds of error checking.
1244 */
1245 unsigned components_used = 0;
1246
1247 unsigned matrix_parameters = 0;
1248 unsigned nonmatrix_parameters = 0;
1249 exec_list actual_parameters;
1250
1251 foreach_list (n, &this->expressions) {
1252 ast_node *ast = exec_node_data(ast_node, n, link);
1253 ir_rvalue *result = ast->hir(instructions, state)->as_rvalue();
1254
1255 /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec:
1256 *
1257 * "It is an error to provide extra arguments beyond this
1258 * last used argument."
1259 */
1260 if (components_used >= type_components) {
1261 _mesa_glsl_error(& loc, state, "too many parameters to `%s' "
1262 "constructor",
1263 constructor_type->name);
1264 return ir_call::get_error_instruction(ctx);
1265 }
1266
1267 if (!result->type->is_numeric() && !result->type->is_boolean()) {
1268 _mesa_glsl_error(& loc, state, "cannot construct `%s' from a "
1269 "non-numeric data type",
1270 constructor_type->name);
1271 return ir_call::get_error_instruction(ctx);
1272 }
1273
1274 /* Count the number of matrix and nonmatrix parameters. This
1275 * is used below to enforce some of the constructor rules.
1276 */
1277 if (result->type->is_matrix())
1278 matrix_parameters++;
1279 else
1280 nonmatrix_parameters++;
1281
1282 actual_parameters.push_tail(result);
1283 components_used += result->type->components();
1284 }
1285
1286 /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec:
1287 *
1288 * "It is an error to construct matrices from other matrices. This
1289 * is reserved for future use."
1290 */
1291 if (state->language_version == 110 && matrix_parameters > 0
1292 && constructor_type->is_matrix()) {
1293 _mesa_glsl_error(& loc, state, "cannot construct `%s' from a "
1294 "matrix in GLSL 1.10",
1295 constructor_type->name);
1296 return ir_call::get_error_instruction(ctx);
1297 }
1298
1299 /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec:
1300 *
1301 * "If a matrix argument is given to a matrix constructor, it is
1302 * an error to have any other arguments."
1303 */
1304 if ((matrix_parameters > 0)
1305 && ((matrix_parameters + nonmatrix_parameters) > 1)
1306 && constructor_type->is_matrix()) {
1307 _mesa_glsl_error(& loc, state, "for matrix `%s' constructor, "
1308 "matrix must be only parameter",
1309 constructor_type->name);
1310 return ir_call::get_error_instruction(ctx);
1311 }
1312
1313 /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec:
1314 *
1315 * "In these cases, there must be enough components provided in the
1316 * arguments to provide an initializer for every component in the
1317 * constructed value."
1318 */
1319 if (components_used < type_components && components_used != 1
1320 && matrix_parameters == 0) {
1321 _mesa_glsl_error(& loc, state, "too few components to construct "
1322 "`%s'",
1323 constructor_type->name);
1324 return ir_call::get_error_instruction(ctx);
1325 }
1326
1327 /* Later, we cast each parameter to the same base type as the
1328 * constructor. Since there are no non-floating point matrices, we
1329 * need to break them up into a series of column vectors.
1330 */
1331 if (constructor_type->base_type != GLSL_TYPE_FLOAT) {
1332 foreach_list_safe(n, &actual_parameters) {
1333 ir_rvalue *matrix = (ir_rvalue *) n;
1334
1335 if (!matrix->type->is_matrix())
1336 continue;
1337
1338 /* Create a temporary containing the matrix. */
1339 ir_variable *var = new(ctx) ir_variable(matrix->type, "matrix_tmp",
1340 ir_var_temporary);
1341 instructions->push_tail(var);
1342 instructions->push_tail(new(ctx) ir_assignment(new(ctx)
1343 ir_dereference_variable(var), matrix, NULL));
1344 var->constant_value = matrix->constant_expression_value();
1345
1346 /* Replace the matrix with dereferences of its columns. */
1347 for (int i = 0; i < matrix->type->matrix_columns; i++) {
1348 matrix->insert_before(new (ctx) ir_dereference_array(var,
1349 new(ctx) ir_constant(i)));
1350 }
1351 matrix->remove();
1352 }
1353 }
1354
1355 bool all_parameters_are_constant = true;
1356
1357 /* Type cast each parameter and, if possible, fold constants.*/
1358 foreach_list_safe(n, &actual_parameters) {
1359 ir_rvalue *ir = (ir_rvalue *) n;
1360
1361 const glsl_type *desired_type =
1362 glsl_type::get_instance(constructor_type->base_type,
1363 ir->type->vector_elements,
1364 ir->type->matrix_columns);
1365 ir_rvalue *result = convert_component(ir, desired_type);
1366
1367 /* Attempt to convert the parameter to a constant valued expression.
1368 * After doing so, track whether or not all the parameters to the
1369 * constructor are trivially constant valued expressions.
1370 */
1371 ir_rvalue *const constant = result->constant_expression_value();
1372
1373 if (constant != NULL)
1374 result = constant;
1375 else
1376 all_parameters_are_constant = false;
1377
1378 if (result != ir) {
1379 ir->replace_with(result);
1380 }
1381 }
1382
1383 /* If all of the parameters are trivially constant, create a
1384 * constant representing the complete collection of parameters.
1385 */
1386 if (all_parameters_are_constant) {
1387 return new(ctx) ir_constant(constructor_type, &actual_parameters);
1388 } else if (constructor_type->is_scalar()) {
1389 return dereference_component((ir_rvalue *) actual_parameters.head,
1390 0);
1391 } else if (constructor_type->is_vector()) {
1392 return emit_inline_vector_constructor(constructor_type,
1393 instructions,
1394 &actual_parameters,
1395 ctx);
1396 } else {
1397 assert(constructor_type->is_matrix());
1398 return emit_inline_matrix_constructor(constructor_type,
1399 instructions,
1400 &actual_parameters,
1401 ctx);
1402 }
1403 } else {
1404 const ast_expression *id = subexpressions[0];
1405 YYLTYPE loc = id->get_location();
1406 exec_list actual_parameters;
1407
1408 process_parameters(instructions, &actual_parameters, &this->expressions,
1409 state);
1410
1411 return match_function_by_name(instructions,
1412 id->primary_expression.identifier, & loc,
1413 &actual_parameters, state);
1414 }
1415
1416 return ir_call::get_error_instruction(ctx);
1417 }