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

Ian Romanick idr at freedesktop.org
Wed Mar 12 16:15:21 PDT 2014


On 03/12/2014 04:11 PM, Connor Abbott wrote:
> 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...

Aye, that it is.  Good catch.  I'll remove it.

>>  }
>>
>>  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