[Mesa-dev] [PATCH 2/8] glsl: Add wrapper function that calls ir_dereference::constant_referenced

Pohjolainen, Topi topi.pohjolainen at intel.com
Sat Mar 15 00:47:41 PDT 2014


On Wed, Mar 12, 2014 at 03:49:21PM -0700, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/ir_constant_expression.cpp | 52 +++++++++++++++++++++++++------------
>  1 file changed, 36 insertions(+), 16 deletions(-)
> 
> diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
> index a31e579..4149a0e 100644
> --- a/src/glsl/ir_constant_expression.cpp
> +++ b/src/glsl/ir_constant_expression.cpp
> @@ -395,6 +395,37 @@ unpack_half_1x16(uint16_t u)
>   * The offset is used when the reference is to a specific column of a matrix.
>   */
>  /*@{*/
> +static bool
> +constant_referenced(const ir_dereference *deref,
> +                    struct hash_table *variable_context,
> +                    ir_constant *&store, int &offset)
> +{
> +   switch (deref->ir_type) {
> +   case ir_type_dereference_array:
> +      ((ir_dereference_array *) deref)->constant_referenced(variable_context,
> +                                                            store, offset);
> +      break;
> +
> +   case ir_type_dereference_record:
> +      ((ir_dereference_record *) deref)->constant_referenced(variable_context,
> +                                                             store, offset);
> +      break;
> +
> +   case ir_type_dereference_variable:
> +      ((ir_dereference_variable *) deref)->constant_referenced(variable_context,
> +                                                               store, offset);
> +      break;
> +
> +   default:
> +      assert(!"Should not get here.");
> +      store = NULL;
> +      offset = 0;
> +      break;
> +   }
> +
> +   return store != NULL;
> +}
> +
>  void
>  ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
>  					     ir_constant *&store, int &offset) const
> @@ -433,13 +464,8 @@ ir_dereference_array::constant_referenced(struct hash_table *variable_context,
>        return;
>     }
>  
> -   deref->constant_referenced(variable_context, substore, suboffset);
> -
> -   if (!substore) {
> -      store = 0;
> -      offset = 0;
> +   if (!::constant_referenced(deref, variable_context, substore, suboffset))

In case of failure, "store" and "offset" are not explicitly reset to zero 
anymore here, nor in the newly introduced 'constant_referenced()'. I checked

ir_dereference_variable::constant_referenced()
ir_dereference_array::constant_referenced()
ir_dereference_record::constant_referenced()

and all three in turn do. Utilising the existing logic there instead of
duplicated here makes sense:

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

>        return;
> -   }
>  
>     const glsl_type *vt = array->type;
>     if (vt->is_array()) {
> @@ -475,13 +501,8 @@ ir_dereference_record::constant_referenced(struct hash_table *variable_context,
>        return;
>     }
>  
> -   deref->constant_referenced(variable_context, substore, suboffset);
> -
> -   if (!substore) {
> -      store = 0;
> -      offset = 0;
> +   if (!::constant_referenced(deref, variable_context, substore, suboffset))
>        return;
> -   }
>  
>     store = substore->get_record_field(field);
>     offset = 0;
> @@ -1814,9 +1835,8 @@ bool ir_function_signature::constant_expression_evaluate_expression_list(const s
>  
>  	 ir_constant *store = NULL;
>  	 int offset = 0;
> -	 asg->lhs->constant_referenced(variable_context, store, offset);
>  
> -	 if (!store)
> +	 if (!constant_referenced(asg->lhs, variable_context, store, offset))
>  	    return false;
>  
>  	 ir_constant *value = asg->rhs->constant_expression_value(variable_context);
> @@ -1847,9 +1867,9 @@ bool ir_function_signature::constant_expression_evaluate_expression_list(const s
>  
>  	 ir_constant *store = NULL;
>  	 int offset = 0;
> -	 call->return_deref->constant_referenced(variable_context, store, offset);
>  
> -	 if (!store)
> +	 if (!constant_referenced(call->return_deref, variable_context,
> +                                  store, offset))
>  	    return false;
>  
>  	 ir_constant *value = call->constant_expression_value(variable_context);
> -- 
> 1.8.1.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list