[Mesa-dev] [PATCH v2] glsl: Fold implementation of ir_dereference_array::constant_referenced into wrapper

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


On Wed, Mar 12, 2014 at 04:11:17PM -0700, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> v2: Don't shadow the variable 'deref' from a higher scope.
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/ir_constant_expression.cpp | 90 ++++++++++++++++++-------------------
>  1 file changed, 44 insertions(+), 46 deletions(-)
> 
> diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
> index 2e60363..f7174ad 100644
> --- a/src/glsl/ir_constant_expression.cpp
> +++ b/src/glsl/ir_constant_expression.cpp
> @@ -407,10 +407,50 @@ constant_referenced(const ir_dereference *deref,
>        return false;
>  
>     switch (deref->ir_type) {
> -   case ir_type_dereference_array:
> -      ((ir_dereference_array *) deref)->constant_referenced(variable_context,
> -                                                            store, offset);
> +   case ir_type_dereference_array: {
> +      const ir_dereference_array *const da =
> +         (const ir_dereference_array *) deref;
> +
> +      ir_constant *index_c =
> +         da->array_index->constant_expression_value(variable_context);
> +
> +      if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer())
> +         break;
> +
> +      int index = index_c->type->base_type == GLSL_TYPE_INT ?
> +         index_c->get_int_component(0) :
> +         index_c->get_uint_component(0);
> +
> +      ir_constant *substore;
> +      int suboffset;
> +
> +      const ir_dereference *array_deref = da->array->as_dereference();
> +      if (!array_deref)
> +         break;
> +
> +      if (!constant_referenced(array_deref, variable_context, substore,
> +                               suboffset))
> +         break;
> +
> +      const glsl_type *vt = da->array->type;
> +      if (vt->is_array()) {
> +         store = substore->get_array_element(index);
> +         offset = 0;

This is already zero, but having it here explicitly tells that it isn't just
forgotten. Either way:

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

> +         break;
> +      }
> +      if (vt->is_matrix()) {
> +         store = substore;
> +         offset = index * vt->vector_elements;
> +         break;
> +      }
> +      if (vt->is_vector()) {
> +         store = substore;
> +         offset = suboffset + index;
> +         break;
> +      }
> +
>        break;
> +   }
>  
>     case ir_type_dereference_record: {
>        const ir_dereference_record *const dr =
> @@ -462,49 +502,7 @@ void
>  ir_dereference_array::constant_referenced(struct hash_table *variable_context,
>  					  ir_constant *&store, int &offset) const
>  {
> -   ir_constant *index_c = array_index->constant_expression_value(variable_context);
> -
> -   if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) {
> -      store = 0;
> -      offset = 0;
> -      return;
> -   }
> -
> -   int index = index_c->type->base_type == GLSL_TYPE_INT ?
> -      index_c->get_int_component(0) :
> -      index_c->get_uint_component(0);
> -
> -   ir_constant *substore;
> -   int suboffset;
> -   const ir_dereference *deref = array->as_dereference();
> -   if (!deref) {
> -      store = 0;
> -      offset = 0;
> -      return;
> -   }
> -
> -   if (!::constant_referenced(deref, variable_context, substore, suboffset))
> -      return;
> -
> -   const glsl_type *vt = array->type;
> -   if (vt->is_array()) {
> -      store = substore->get_array_element(index);
> -      offset = 0;
> -      return;
> -   }
> -   if (vt->is_matrix()) {
> -      store = substore;
> -      offset = index * vt->vector_elements;
> -      return;
> -   }
> -   if (vt->is_vector()) {
> -      store = substore;
> -      offset = suboffset + index;
> -      return;
> -   }
> -
> -   store = 0;
> -   offset = 0;
> +   ::constant_referenced(this, variable_context, store, offset);
>  }
>  
>  void
> -- 
> 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