Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  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 ralloced 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 = ralloc_asprintf(NULL, "%s ", return_type->name);
  79.  
  80.    ralloc_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.       ralloc_asprintf_append(&str, "%s%s", comma, param->type->name);
  87.       comma = ", ";
  88.    }
  89.  
  90.    ralloc_strcat(&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.                                     ralloc_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.       ralloc_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.             ralloc_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 = ralloc_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 = ralloc_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.       /* constructor_type can be NULL if a variable with the same name as the
  997.        * structure has come into scope.
  998.        */
  999.       if (constructor_type == NULL) {
  1000.          _mesa_glsl_error(& loc, state, "unknown type `%s' (structure name "
  1001.                           "may be shadowed by a variable with the same name)",
  1002.                           type->type_name);
  1003.          return ir_call::get_error_instruction(ctx);
  1004.       }
  1005.  
  1006.  
  1007.       /* Constructors for samplers are illegal.
  1008.        */
  1009.       if (constructor_type->is_sampler()) {
  1010.          _mesa_glsl_error(& loc, state, "cannot construct sampler type `%s'",
  1011.                           constructor_type->name);
  1012.          return ir_call::get_error_instruction(ctx);
  1013.       }
  1014.  
  1015.       if (constructor_type->is_array()) {
  1016.          if (state->language_version <= 110) {
  1017.             _mesa_glsl_error(& loc, state,
  1018.                              "array constructors forbidden in GLSL 1.10");
  1019.             return ir_call::get_error_instruction(ctx);
  1020.          }
  1021.  
  1022.          return process_array_constructor(instructions, constructor_type,
  1023.                                           & loc, &this->expressions, state);
  1024.       }
  1025.  
  1026.  
  1027.       /* There are two kinds of constructor call.  Constructors for built-in
  1028.        * language types, such as mat4 and vec2, are free form.  The only
  1029.        * requirement is that the parameters must provide enough values of the
  1030.        * correct scalar type.  Constructors for arrays and structures must
  1031.        * have the exact number of parameters with matching types in the
  1032.        * correct order.  These constructors follow essentially the same type
  1033.        * matching rules as functions.
  1034.        */
  1035.       if (constructor_type->is_record()) {
  1036.          exec_list actual_parameters;
  1037.  
  1038.          process_parameters(instructions, &actual_parameters,
  1039.                             &this->expressions, state);
  1040.  
  1041.          exec_node *node = actual_parameters.head;
  1042.          for (unsigned i = 0; i < constructor_type->length; i++) {
  1043.             ir_rvalue *ir = (ir_rvalue *) node;
  1044.  
  1045.             if (node->is_tail_sentinel()) {
  1046.                _mesa_glsl_error(&loc, state,
  1047.                                 "insufficient parameters to constructor "
  1048.                                 "for `%s'",
  1049.                                 constructor_type->name);
  1050.                return ir_call::get_error_instruction(ctx);
  1051.             }
  1052.  
  1053.             if (apply_implicit_conversion(constructor_type->fields.structure[i].type,
  1054.                                           ir, state)) {
  1055.                node->replace_with(ir);
  1056.             } else {
  1057.                _mesa_glsl_error(&loc, state,
  1058.                                 "parameter type mismatch in constructor "
  1059.                                 "for `%s.%s' (%s vs %s)",
  1060.                                 constructor_type->name,
  1061.                                 constructor_type->fields.structure[i].name,
  1062.                                 ir->type->name,
  1063.                                 constructor_type->fields.structure[i].type->name);
  1064.                return ir_call::get_error_instruction(ctx);;
  1065.             }
  1066.  
  1067.             node = node->next;
  1068.          }
  1069.  
  1070.          if (!node->is_tail_sentinel()) {
  1071.             _mesa_glsl_error(&loc, state, "too many parameters in constructor "
  1072.                              "for `%s'", constructor_type->name);
  1073.             return ir_call::get_error_instruction(ctx);
  1074.          }
  1075.  
  1076.          ir_rvalue *const constant =
  1077.             constant_record_constructor(constructor_type, &actual_parameters,
  1078.                                         state);
  1079.  
  1080.          return (constant != NULL)
  1081.             ? constant
  1082.             : emit_inline_record_constructor(constructor_type, instructions,
  1083.                                              &actual_parameters, state);
  1084.       }
  1085.  
  1086.       if (!constructor_type->is_numeric() && !constructor_type->is_boolean())
  1087.          return ir_call::get_error_instruction(ctx);
  1088.  
  1089.       /* Total number of components of the type being constructed. */
  1090.       const unsigned type_components = constructor_type->components();
  1091.  
  1092.       /* Number of components from parameters that have actually been
  1093.        * consumed.  This is used to perform several kinds of error checking.
  1094.        */
  1095.       unsigned components_used = 0;
  1096.  
  1097.       unsigned matrix_parameters = 0;
  1098.       unsigned nonmatrix_parameters = 0;
  1099.       exec_list actual_parameters;
  1100.  
  1101.       foreach_list (n, &this->expressions) {
  1102.          ast_node *ast = exec_node_data(ast_node, n, link);
  1103.          ir_rvalue *result = ast->hir(instructions, state)->as_rvalue();
  1104.  
  1105.          /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec:
  1106.           *
  1107.           *    "It is an error to provide extra arguments beyond this
  1108.           *    last used argument."
  1109.           */
  1110.          if (components_used >= type_components) {
  1111.             _mesa_glsl_error(& loc, state, "too many parameters to `%s' "
  1112.                              "constructor",
  1113.                              constructor_type->name);
  1114.             return ir_call::get_error_instruction(ctx);
  1115.          }
  1116.  
  1117.          if (!result->type->is_numeric() && !result->type->is_boolean()) {
  1118.             _mesa_glsl_error(& loc, state, "cannot construct `%s' from a "
  1119.                              "non-numeric data type",
  1120.                              constructor_type->name);
  1121.             return ir_call::get_error_instruction(ctx);
  1122.          }
  1123.  
  1124.          /* Count the number of matrix and nonmatrix parameters.  This
  1125.           * is used below to enforce some of the constructor rules.
  1126.           */
  1127.          if (result->type->is_matrix())
  1128.             matrix_parameters++;
  1129.          else
  1130.             nonmatrix_parameters++;
  1131.  
  1132.          actual_parameters.push_tail(result);
  1133.          components_used += result->type->components();
  1134.       }
  1135.  
  1136.       /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec:
  1137.        *
  1138.        *    "It is an error to construct matrices from other matrices. This
  1139.        *    is reserved for future use."
  1140.        */
  1141.       if (state->language_version == 110 && matrix_parameters > 0
  1142.           && constructor_type->is_matrix()) {
  1143.          _mesa_glsl_error(& loc, state, "cannot construct `%s' from a "
  1144.                           "matrix in GLSL 1.10",
  1145.                           constructor_type->name);
  1146.          return ir_call::get_error_instruction(ctx);
  1147.       }
  1148.  
  1149.       /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec:
  1150.        *
  1151.        *    "If a matrix argument is given to a matrix constructor, it is
  1152.        *    an error to have any other arguments."
  1153.        */
  1154.       if ((matrix_parameters > 0)
  1155.           && ((matrix_parameters + nonmatrix_parameters) > 1)
  1156.           && constructor_type->is_matrix()) {
  1157.          _mesa_glsl_error(& loc, state, "for matrix `%s' constructor, "
  1158.                           "matrix must be only parameter",
  1159.                           constructor_type->name);
  1160.          return ir_call::get_error_instruction(ctx);
  1161.       }
  1162.  
  1163.       /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec:
  1164.        *
  1165.        *    "In these cases, there must be enough components provided in the
  1166.        *    arguments to provide an initializer for every component in the
  1167.        *    constructed value."
  1168.        */
  1169.       if (components_used < type_components && components_used != 1
  1170.           && matrix_parameters == 0) {
  1171.          _mesa_glsl_error(& loc, state, "too few components to construct "
  1172.                           "`%s'",
  1173.                           constructor_type->name);
  1174.          return ir_call::get_error_instruction(ctx);
  1175.       }
  1176.  
  1177.       /* Later, we cast each parameter to the same base type as the
  1178.        * constructor.  Since there are no non-floating point matrices, we
  1179.        * need to break them up into a series of column vectors.
  1180.        */
  1181.       if (constructor_type->base_type != GLSL_TYPE_FLOAT) {
  1182.          foreach_list_safe(n, &actual_parameters) {
  1183.             ir_rvalue *matrix = (ir_rvalue *) n;
  1184.  
  1185.             if (!matrix->type->is_matrix())
  1186.                continue;
  1187.  
  1188.             /* Create a temporary containing the matrix. */
  1189.             ir_variable *var = new(ctx) ir_variable(matrix->type, "matrix_tmp",
  1190.                                                     ir_var_temporary);
  1191.             instructions->push_tail(var);
  1192.             instructions->push_tail(new(ctx) ir_assignment(new(ctx)
  1193.                ir_dereference_variable(var), matrix, NULL));
  1194.             var->constant_value = matrix->constant_expression_value();
  1195.  
  1196.             /* Replace the matrix with dereferences of its columns. */
  1197.             for (int i = 0; i < matrix->type->matrix_columns; i++) {
  1198.                matrix->insert_before(new (ctx) ir_dereference_array(var,
  1199.                   new(ctx) ir_constant(i)));
  1200.             }
  1201.             matrix->remove();
  1202.          }
  1203.       }
  1204.  
  1205.       bool all_parameters_are_constant = true;
  1206.  
  1207.       /* Type cast each parameter and, if possible, fold constants.*/
  1208.       foreach_list_safe(n, &actual_parameters) {
  1209.          ir_rvalue *ir = (ir_rvalue *) n;
  1210.  
  1211.          const glsl_type *desired_type =
  1212.             glsl_type::get_instance(constructor_type->base_type,
  1213.                                     ir->type->vector_elements,
  1214.                                     ir->type->matrix_columns);
  1215.          ir_rvalue *result = convert_component(ir, desired_type);
  1216.  
  1217.          /* Attempt to convert the parameter to a constant valued expression.
  1218.           * After doing so, track whether or not all the parameters to the
  1219.           * constructor are trivially constant valued expressions.
  1220.           */
  1221.          ir_rvalue *const constant = result->constant_expression_value();
  1222.  
  1223.          if (constant != NULL)
  1224.             result = constant;
  1225.          else
  1226.             all_parameters_are_constant = false;
  1227.  
  1228.          if (result != ir) {
  1229.             ir->replace_with(result);
  1230.          }
  1231.       }
  1232.  
  1233.       /* If all of the parameters are trivially constant, create a
  1234.        * constant representing the complete collection of parameters.
  1235.        */
  1236.       if (all_parameters_are_constant) {
  1237.          return new(ctx) ir_constant(constructor_type, &actual_parameters);
  1238.       } else if (constructor_type->is_scalar()) {
  1239.          return dereference_component((ir_rvalue *) actual_parameters.head,
  1240.                                       0);
  1241.       } else if (constructor_type->is_vector()) {
  1242.          return emit_inline_vector_constructor(constructor_type,
  1243.                                                instructions,
  1244.                                                &actual_parameters,
  1245.                                                ctx);
  1246.       } else {
  1247.          assert(constructor_type->is_matrix());
  1248.          return emit_inline_matrix_constructor(constructor_type,
  1249.                                                instructions,
  1250.                                                &actual_parameters,
  1251.                                                ctx);
  1252.       }
  1253.    } else {
  1254.       const ast_expression *id = subexpressions[0];
  1255.       YYLTYPE loc = id->get_location();
  1256.       exec_list actual_parameters;
  1257.  
  1258.       process_parameters(instructions, &actual_parameters, &this->expressions,
  1259.                          state);
  1260.  
  1261.       return match_function_by_name(instructions,
  1262.                                     id->primary_expression.identifier, & loc,
  1263.                                     &actual_parameters, state);
  1264.    }
  1265.  
  1266.    return ir_call::get_error_instruction(ctx);
  1267. }
  1268.