nir/spirv: Add a missing break statement
[mesa.git] / src / glsl / lower_vec_index_to_swizzle.cpp
index 5349e58bb5ec51036226e9f33795bebdfc88d28f..4d4d2f17ef69ed4eb08664f93b95ed8257e70fa7 100644 (file)
@@ -39,6 +39,8 @@
  * Visitor class for replacing expressions with ir_constant values.
  */
 
+namespace {
+
 class ir_vec_index_to_swizzle_visitor : public ir_hierarchical_visitor {
 public:
    ir_vec_index_to_swizzle_visitor()
@@ -46,7 +48,6 @@ public:
       progress = false;
    }
 
-   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 *);
@@ -59,45 +60,7 @@ public:
    bool progress;
 };
 
-ir_rvalue *
-ir_vec_index_to_swizzle_visitor::convert_vec_index_to_swizzle(ir_rvalue *ir)
-{
-   ir_dereference_array *deref = ir->as_dereference_array();
-   ir_constant *ir_constant;
-
-   if (!deref)
-      return ir;
-
-   if (deref->array->type->is_matrix() || deref->array->type->is_array())
-      return ir;
-
-   assert(deref->array_index->type->base_type == GLSL_TYPE_INT);
-   ir_constant = deref->array_index->constant_expression_value();
-   if (!ir_constant)
-      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(ir_constant->value.i[0], 0),
-                     ((int) deref->array->type->vector_elements - 1));
-
-   return new(ctx) ir_swizzle(deref->array, i, 0, 0, 0, 1);
-}
+} /* anonymous namespace */
 
 ir_rvalue *
 ir_vec_index_to_swizzle_visitor::convert_vector_extract_to_swizzle(ir_rvalue *ir)
@@ -139,7 +102,6 @@ ir_vec_index_to_swizzle_visitor::visit_enter(ir_expression *ir)
    unsigned int i;
 
    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]);
    }
 
@@ -153,7 +115,7 @@ ir_vec_index_to_swizzle_visitor::visit_enter(ir_swizzle *ir)
     * the result of indexing a vector is.  But maybe at some point we'll end up
     * using swizzling of scalars for vector construction.
     */
-   ir->val = convert_vec_index_to_swizzle(ir->val);
+   ir->val = convert_vector_extract_to_swizzle(ir->val);
 
    return visit_continue;
 }
@@ -161,8 +123,6 @@ ir_vec_index_to_swizzle_visitor::visit_enter(ir_swizzle *ir)
 ir_visitor_status
 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;
@@ -171,18 +131,11 @@ ir_vec_index_to_swizzle_visitor::visit_enter(ir_assignment *ir)
 ir_visitor_status
 ir_vec_index_to_swizzle_visitor::visit_enter(ir_call *ir)
 {
-   foreach_iter(exec_list_iterator, iter, *ir) {
-      ir_rvalue *param = (ir_rvalue *)iter.get();
-      ir_rvalue *new_param = convert_vec_index_to_swizzle(param);
+   foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) {
+      ir_rvalue *new_param = convert_vector_extract_to_swizzle(param);
 
       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);
-         }
       }
    }
 
@@ -193,7 +146,6 @@ ir_visitor_status
 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);
    }
 
@@ -203,7 +155,6 @@ ir_vec_index_to_swizzle_visitor::visit_enter(ir_return *ir)
 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;