All this does is generate a bogus value with error type; the fact that it was in ir_call was rather arbitrary to begin with. ir_constant is an equally arbitrary place. The rationale is that a future commit will change ir_calls from rvalues to statements, and all uses of this function expect an rvalue.
Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> --- src/glsl/ast_function.cpp | 32 ++++++++++++++++---------------- src/glsl/hir_field_selection.cpp | 2 +- src/glsl/ir.cpp | 19 +++++++++---------- src/glsl/ir.h | 14 +++++++------- src/glsl/ir_clone.cpp | 5 ++--- 5 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp index ca45934..392b7f9 100644 --- a/src/glsl/ast_function.cpp +++ b/src/glsl/ast_function.cpp @@ -164,7 +164,7 @@ match_function_by_name(exec_list *instructions, const char *name, _mesa_glsl_error(loc, state, "parameter `%s' must be a constant expression", formal->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } if ((formal->mode == ir_var_out) @@ -328,7 +328,7 @@ match_function_by_name(exec_list *instructions, const char *name, } - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } } @@ -504,7 +504,7 @@ process_array_constructor(exec_list *instructions, "parameter%s", (constructor_type->length != 0) ? "at least" : "exactly", min_param, (min_param <= 1) ? "" : "s"); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } if (constructor_type->length == 0) { @@ -1141,7 +1141,7 @@ ast_function_expression::hir(exec_list *instructions, _mesa_glsl_error(& loc, state, "unknown type `%s' (structure name " "may be shadowed by a variable with the same name)", type->type_name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } @@ -1150,14 +1150,14 @@ ast_function_expression::hir(exec_list *instructions, if (constructor_type->is_sampler()) { _mesa_glsl_error(& loc, state, "cannot construct sampler type `%s'", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } if (constructor_type->is_array()) { if (state->language_version <= 110) { _mesa_glsl_error(& loc, state, "array constructors forbidden in GLSL 1.10"); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } return process_array_constructor(instructions, constructor_type, @@ -1188,7 +1188,7 @@ ast_function_expression::hir(exec_list *instructions, "insufficient parameters to constructor " "for `%s'", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } if (apply_implicit_conversion(constructor_type->fields.structure[i].type, @@ -1202,7 +1202,7 @@ ast_function_expression::hir(exec_list *instructions, constructor_type->fields.structure[i].name, ir->type->name, constructor_type->fields.structure[i].type->name); - return ir_call::get_error_instruction(ctx);; + return ir_constant::error_value(ctx);; } node = node->next; @@ -1211,7 +1211,7 @@ ast_function_expression::hir(exec_list *instructions, if (!node->is_tail_sentinel()) { _mesa_glsl_error(&loc, state, "too many parameters in constructor " "for `%s'", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } ir_rvalue *const constant = @@ -1225,7 +1225,7 @@ ast_function_expression::hir(exec_list *instructions, } if (!constructor_type->is_numeric() && !constructor_type->is_boolean()) - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); /* Total number of components of the type being constructed. */ const unsigned type_components = constructor_type->components(); @@ -1252,14 +1252,14 @@ ast_function_expression::hir(exec_list *instructions, _mesa_glsl_error(& loc, state, "too many parameters to `%s' " "constructor", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } if (!result->type->is_numeric() && !result->type->is_boolean()) { _mesa_glsl_error(& loc, state, "cannot construct `%s' from a " "non-numeric data type", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } /* Count the number of matrix and nonmatrix parameters. This @@ -1284,7 +1284,7 @@ ast_function_expression::hir(exec_list *instructions, _mesa_glsl_error(& loc, state, "cannot construct `%s' from a " "matrix in GLSL 1.10", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec: @@ -1298,7 +1298,7 @@ ast_function_expression::hir(exec_list *instructions, _mesa_glsl_error(& loc, state, "for matrix `%s' constructor, " "matrix must be only parameter", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec: @@ -1312,7 +1312,7 @@ ast_function_expression::hir(exec_list *instructions, _mesa_glsl_error(& loc, state, "too few components to construct " "`%s'", constructor_type->name); - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } /* Later, we cast each parameter to the same base type as the @@ -1404,5 +1404,5 @@ ast_function_expression::hir(exec_list *instructions, &actual_parameters, state); } - return ir_call::get_error_instruction(ctx); + return ir_constant::error_value(ctx); } diff --git a/src/glsl/hir_field_selection.cpp b/src/glsl/hir_field_selection.cpp index 3c33127..8258ee8 100644 --- a/src/glsl/hir_field_selection.cpp +++ b/src/glsl/hir_field_selection.cpp @@ -98,5 +98,5 @@ _mesa_ast_field_selection_to_hir(const ast_expression *expr, expr->primary_expression.identifier); } - return result ? result : ir_call::get_error_instruction(ctx); + return result ? result : ir_constant::error_value(ctx); } diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index d6594cd..70d0ae2 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -725,6 +725,15 @@ ir_constant::zero(void *mem_ctx, const glsl_type *type) return c; } +ir_constant * +ir_constant::error_value(void *ctx) +{ + ir_constant *ir = new(ctx) ir_constant; + + ir->type = glsl_type::error_type; + return ir; +} + bool ir_constant::get_bool_component(unsigned i) const { @@ -1446,16 +1455,6 @@ ir_function::has_user_signature() return false; } - -ir_call * -ir_call::get_error_instruction(void *ctx) -{ - ir_call *call = new(ctx) ir_call; - - call->type = glsl_type::error_type; - return call; -} - void ir_call::set_callee(ir_function_signature *sig) { diff --git a/src/glsl/ir.h b/src/glsl/ir.h index cc4e680..f809867 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -1003,13 +1003,6 @@ public: virtual ir_visitor_status accept(ir_hierarchical_visitor *); /** - * Get a generic ir_call object when an error occurs - * - * Any allocation will be performed with 'ctx' as ralloc owner. - */ - static ir_call *get_error_instruction(void *ctx); - - /** * Get an iterator for the set of acutal parameters */ exec_list_iterator iterator() @@ -1548,6 +1541,13 @@ public: */ static ir_constant *zero(void *mem_ctx, const glsl_type *type); + /** + * Return a generic ir_constant object of error_type + * + * Allocation will be performed with 'mem_ctx' as talloc owner. + */ + static ir_constant *error_value(void *mem_ctx); + virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; virtual ir_constant *constant_expression_value(); diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp index c1befa9..e8b946a 100644 --- a/src/glsl/ir_clone.cpp +++ b/src/glsl/ir_clone.cpp @@ -156,9 +156,6 @@ ir_loop::clone(void *mem_ctx, struct hash_table *ht) const ir_call * ir_call::clone(void *mem_ctx, struct hash_table *ht) const { - if (this->type == glsl_type::error_type) - return ir_call::get_error_instruction(mem_ctx); - exec_list new_parameters; foreach_iter(exec_list_iterator, iter, this->actual_parameters) { @@ -334,6 +331,8 @@ ir_constant::clone(void *mem_ctx, struct hash_table *ht) const (void)ht; switch (this->type->base_type) { + case GLSL_TYPE_ERROR: + return ir_constant::error_value(mem_ctx); case GLSL_TYPE_UINT: case GLSL_TYPE_INT: case GLSL_TYPE_FLOAT: -- 1.7.6.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev