[Mesa-dev] [PATCH 04/12] glsl: Lower ir_binop_vector_extract to swizzle

Ian Romanick idr at freedesktop.org
Mon May 6 09:56:38 PDT 2013


On 05/05/2013 04:50 PM, Kenneth Graunke wrote:
> On 05/03/2013 04:07 PM, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> Lower ir_binop_vector_extract with a constant index to a swizzle.  This
>> is exactly like ir_dereference_array of a vector with a constant index.
>>
>> v2: Convert tabs to spaces.  Suggested by Eric.
>>
>> v3: Correctly call convert_vector_extract_to_swizzle in
>> ir_vec_index_to_swizzle_visitor::visit_enter(ir_call *ir).  Suggested by
>> Ken.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> Reviewed-by: Eric Anholt <eric at anholt.net>
>> ---
>>   src/glsl/lower_vec_index_to_swizzle.cpp | 47
>> ++++++++++++++++++++++++++++++++-
>>   1 file changed, 46 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/glsl/lower_vec_index_to_swizzle.cpp
>> b/src/glsl/lower_vec_index_to_swizzle.cpp
>> index 264d6dc..9d0d696 100644
>> --- a/src/glsl/lower_vec_index_to_swizzle.cpp
>> +++ b/src/glsl/lower_vec_index_to_swizzle.cpp
>> @@ -47,6 +47,7 @@ public:
>>      }
>>
>>      ir_rvalue *convert_vec_index_to_swizzle(ir_rvalue *val);
>> +   ir_rvalue *convert_vector_extract_to_swizzle(ir_rvalue *val);
>>
>>      virtual ir_visitor_status visit_enter(ir_expression *);
>>      virtual ir_visitor_status visit_enter(ir_swizzle *);
>> @@ -93,11 +94,45 @@
>> ir_vec_index_to_swizzle_visitor::convert_vec_index_to_swizzle(ir_rvalue *ir)
>>
>>       * large.  For simplicity sake, just clamp the index to [0, size-1].
>>       */
>>      const int i = MIN2(MAX2(ir_constant->value.i[0], 0),
>> -              ((int) deref->array->type->vector_elements - 1));
>> +                      ((int) deref->array->type->vector_elements - 1));
>
> Looks like a spurious hunk (not a big deal though).
>
>>
>>      return new(ctx) ir_swizzle(deref->array, i, 0, 0, 0, 1);
>>   }
>>
>> +ir_rvalue *
>> +ir_vec_index_to_swizzle_visitor::convert_vector_extract_to_swizzle(ir_rvalue
>> *ir)
>> +{
>> +   ir_expression *const expr = ir->as_expression();
>> +   if (expr == NULL || expr->operation != ir_binop_vector_extract)
>> +      return ir;
>> +
>> +   ir_constant *const idx =
>> expr->operands[1]->constant_expression_value();
>> +   if (idx == NULL)
>> +      return ir;
>> +
>> +   void *ctx = ralloc_parent(ir);
>> +   this->progress = true;
>> +
>> +   /* Page 40 of the GLSL 1.20 spec says:
>> +    *
>> +    *     "When indexing with non-constant expressions, behavior is
>> undefined
>> +    *     if the index is negative, or greater than or equal to the
>> size of
>> +    *     the vector."
>> +    *
>> +    * The quoted spec text mentions non-constant expressions, but
>> this code
>> +    * operates on constants.  These constants are the result of
>> non-constant
>> +    * expressions that have been optimized to constants.  The common
>> case here
>> +    * is a loop counter from an unrolled loop that is used to index a
>> vector.
>> +    *
>> +    * The ir_swizzle constructor gets angry if the index is negative
>> or too
>> +    * large.  For simplicity sake, just clamp the index to [0, size-1].
>> +    */
>> +   const int i = MIN2(MAX2(idx->value.i[0], 0),
>> +                      ((int) expr->operands[0]->type->vector_elements
>> - 1));
>
> Would be easier to read with CLAMP:
>
> const int i = CLAMP(idx->value.i[0], 0,
> int(expr->operands[0]->type->vector_elements - 1));

I always forget about CLAMP.  I'll make that change here and in patch 1.

> Either way, this patch is:
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
>
>> +   return new(ctx) ir_swizzle(expr->operands[0], i, 0, 0, 0, 1);
>> +}
>> +
>>   ir_visitor_status
>>   ir_vec_index_to_swizzle_visitor::visit_enter(ir_expression *ir)
>>   {
>> @@ -105,6 +140,7 @@
>> ir_vec_index_to_swizzle_visitor::visit_enter(ir_expression *ir)
>>
>>      for (i = 0; i < ir->get_num_operands(); i++) {
>>         ir->operands[i] = convert_vec_index_to_swizzle(ir->operands[i]);
>> +      ir->operands[i] =
>> convert_vector_extract_to_swizzle(ir->operands[i]);
>>      }
>>
>>      return visit_continue;
>> @@ -127,6 +163,7 @@
>> ir_vec_index_to_swizzle_visitor::visit_enter(ir_assignment *ir)
>>   {
>>      ir->set_lhs(convert_vec_index_to_swizzle(ir->lhs));
>>      ir->rhs = convert_vec_index_to_swizzle(ir->rhs);
>> +   ir->rhs = convert_vector_extract_to_swizzle(ir->rhs);
>>
>>      return visit_continue;
>>   }
>> @@ -140,6 +177,12 @@
>> ir_vec_index_to_swizzle_visitor::visit_enter(ir_call *ir)
>>
>>         if (new_param != param) {
>>        param->replace_with(new_param);
>> +      } else {
>> +         new_param = convert_vector_extract_to_swizzle(param);
>> +
>> +         if (new_param != param) {
>> +            param->replace_with(new_param);
>> +         }
>>         }
>>      }
>>
>> @@ -151,6 +194,7 @@
>> ir_vec_index_to_swizzle_visitor::visit_enter(ir_return *ir)
>>   {
>>      if (ir->value) {
>>         ir->value = convert_vec_index_to_swizzle(ir->value);
>> +      ir->value = convert_vector_extract_to_swizzle(ir->value);
>>      }
>>
>>      return visit_continue;
>> @@ -160,6 +204,7 @@ ir_visitor_status
>>   ir_vec_index_to_swizzle_visitor::visit_enter(ir_if *ir)
>>   {
>>      ir->condition = convert_vec_index_to_swizzle(ir->condition);
>> +   ir->condition = convert_vector_extract_to_swizzle(ir->condition);
>>
>>      return visit_continue;
>>   }
>>
>



More information about the mesa-dev mailing list