[Mesa-dev] [PATCH 1/5] glsl: Move get_error_instruction() from ir_call to ir_constant.

Kenneth Graunke kenneth at whitecape.org
Tue Sep 20 18:28:15 PDT 2011


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 <kenneth at 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



More information about the mesa-dev mailing list