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