glsl: Apply implicit conversions to structure constructor parameters.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 2 Sep 2010 03:03:17 +0000 (20:03 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 2 Sep 2010 03:39:09 +0000 (20:39 -0700)
The code for handling implicit conversions should probably get
refactored, but for now, this is easy.

Fixes piglit test constructor-26.vert.

src/glsl/ast_function.cpp
src/glsl/ast_to_hir.cpp

index 1a5a193..61012b8 100644 (file)
 static ir_rvalue *
 convert_component(ir_rvalue *src, const glsl_type *desired_type);
 
+bool
+apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
+                          struct _mesa_glsl_parse_state *state);
+
 static unsigned
 process_parameters(exec_list *instructions, exec_list *actual_parameters,
                   exec_list *parameters,
@@ -1185,7 +1189,7 @@ ast_function_expression::hir(exec_list *instructions,
       if ((type != NULL) && type->is_record()) {
         exec_node *node = actual_parameters.head;
         for (unsigned i = 0; i < type->length; i++) {
-           ir_instruction *ir = (ir_instruction *) node;
+           ir_rvalue *ir = (ir_rvalue *) node;
 
            if (node->is_tail_sentinel()) {
               _mesa_glsl_error(&loc, state,
@@ -1195,7 +1199,10 @@ ast_function_expression::hir(exec_list *instructions,
               return ir_call::get_error_instruction(ctx);
            }
 
-           if (ir->type != type->fields.structure[i].type) {
+           if (apply_implicit_conversion(type->fields.structure[i].type, ir,
+                                         state)) {
+              node->replace_with(ir);
+           } else {
               _mesa_glsl_error(&loc, state,
                                "parameter type mismatch in constructor "
                                "for `%s.%s' (%s vs %s)",
index 5bdf3da..762f802 100644 (file)
@@ -97,7 +97,7 @@ _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
  * If a conversion is possible (or unnecessary), \c true is returned.
  * Otherwise \c false is returned.
  */
-static bool
+bool
 apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
                          struct _mesa_glsl_parse_state *state)
 {