[Mesa-dev] [PATCH 1/8] glsl: Group all of the constant_referenced functions together

Connor Abbott cwabbott0 at gmail.com
Wed Mar 12 16:11:45 PDT 2014


On Wed, Mar 12, 2014 at 6:49 PM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/ir_clone.cpp               |  10 +-
>  src/glsl/ir_constant_expression.cpp | 195 +++++++++++++++++++-----------------
>  2 files changed, 109 insertions(+), 96 deletions(-)
>
> diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
> index 311c992..167b80c 100644
> --- a/src/glsl/ir_clone.cpp
> +++ b/src/glsl/ir_clone.cpp
> @@ -265,10 +265,12 @@ ir_assignment::clone(void *mem_ctx, struct hash_table *ht) const
>     if (this->condition)
>        new_condition = this->condition->clone(mem_ctx, ht);
>
> -   return new(mem_ctx) ir_assignment(this->lhs->clone(mem_ctx, ht),
> -                                    this->rhs->clone(mem_ctx, ht),
> -                                    new_condition,
> -                                    this->write_mask);
> +   ir_assignment *cloned =
> +      new(mem_ctx) ir_assignment(this->lhs->clone(mem_ctx, ht),
> +                                 this->rhs->clone(mem_ctx, ht),
> +                                 new_condition);
> +   cloned->write_mask = this->write_mask;
> +   return cloned;

Looks like this is leftover from something else...

>  }
>
>  ir_function *
> diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
> index 7fa5a09..a31e579 100644
> --- a/src/glsl/ir_constant_expression.cpp
> +++ b/src/glsl/ir_constant_expression.cpp
> @@ -386,6 +386,109 @@ unpack_half_1x16(uint16_t u)
>     return _mesa_half_to_float(u);
>  }
>
> +/**
> + * \name Functions to get the constant referenced by an r-value
> + *
> + * Get the constant that is ultimately referenced by an r-value, in a constant
> + * expression evaluation context.
> + *
> + * The offset is used when the reference is to a specific column of a matrix.
> + */
> +/*@{*/
> +void
> +ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
> +                                            ir_constant *&store, int &offset) const
> +{
> +   if (variable_context) {
> +      store = (ir_constant *)hash_table_find(variable_context, var);
> +      offset = 0;
> +   } else {
> +      store = NULL;
> +      offset = 0;
> +   }
> +}
> +
> +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;
> +   }
> +
> +   deref->constant_referenced(variable_context, substore, suboffset);
> +
> +   if (!substore) {
> +      store = 0;
> +      offset = 0;
> +      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;
> +}
> +
> +void
> +ir_dereference_record::constant_referenced(struct hash_table *variable_context,
> +                                          ir_constant *&store, int &offset) const
> +{
> +   ir_constant *substore;
> +   int suboffset;
> +   const ir_dereference *deref = record->as_dereference();
> +   if (!deref) {
> +      store = 0;
> +      offset = 0;
> +      return;
> +   }
> +
> +   deref->constant_referenced(variable_context, substore, suboffset);
> +
> +   if (!substore) {
> +      store = 0;
> +      offset = 0;
> +      return;
> +   }
> +
> +   store = substore->get_record_field(field);
> +   offset = 0;
> +}
> +/*@}*/
> +
> +
>  ir_constant *
>  ir_rvalue::constant_expression_value(struct hash_table *variable_context)
>  {
> @@ -1570,19 +1673,6 @@ ir_swizzle::constant_expression_value(struct hash_table *variable_context)
>  }
>
>
> -void
> -ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
> -                                            ir_constant *&store, int &offset) const
> -{
> -   if (variable_context) {
> -      store = (ir_constant *)hash_table_find(variable_context, var);
> -      offset = 0;
> -   } else {
> -      store = NULL;
> -      offset = 0;
> -   }
> -}
> -
>  ir_constant *
>  ir_dereference_variable::constant_expression_value(struct hash_table *variable_context)
>  {
> @@ -1610,60 +1700,6 @@ ir_dereference_variable::constant_expression_value(struct hash_table *variable_c
>  }
>
>
> -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;
> -   }
> -
> -   deref->constant_referenced(variable_context, substore, suboffset);
> -
> -   if (!substore) {
> -      store = 0;
> -      offset = 0;
> -      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;
> -}
> -
>  ir_constant *
>  ir_dereference_array::constant_expression_value(struct hash_table *variable_context)
>  {
> @@ -1719,31 +1755,6 @@ ir_dereference_array::constant_expression_value(struct hash_table *variable_cont
>  }
>
>
> -void
> -ir_dereference_record::constant_referenced(struct hash_table *variable_context,
> -                                          ir_constant *&store, int &offset) const
> -{
> -   ir_constant *substore;
> -   int suboffset;
> -   const ir_dereference *deref = record->as_dereference();
> -   if (!deref) {
> -      store = 0;
> -      offset = 0;
> -      return;
> -   }
> -
> -   deref->constant_referenced(variable_context, substore, suboffset);
> -
> -   if (!substore) {
> -      store = 0;
> -      offset = 0;
> -      return;
> -   }
> -
> -   store = substore->get_record_field(field);
> -   offset = 0;
> -}
> -
>  ir_constant *
>  ir_dereference_record::constant_expression_value(struct hash_table *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