glsl: Put `sample`-qualified varyings in their own packing classes
[mesa.git] / src / glsl / loop_controls.cpp
index 2ef3d305254d0985d5ccb51c5a6b2f41e74b5268..0eb103f49b86bcd4af55d1f0105b88cb8dfa135c 100644 (file)
@@ -21,7 +21,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
-#include <climits>
+#include <limits.h>
 #include "main/compiler.h"
 #include "glsl_types.h"
 #include "loop_analysis.h"
@@ -85,7 +85,10 @@ int
 calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
                     enum ir_expression_operation op)
 {
-   void *mem_ctx = talloc_init("%s", __func__);
+   if (from == NULL || to == NULL || increment == NULL)
+      return -1;
+
+   void *mem_ctx = ralloc_context(NULL);
 
    ir_expression *const sub =
       new(mem_ctx) ir_expression(ir_binop_sub, from->type, to, from);
@@ -144,10 +147,11 @@ calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
       }
    }
 
-   talloc_free(mem_ctx);
+   ralloc_free(mem_ctx);
    return (valid_loop) ? iter_value : -1;
 }
 
+namespace {
 
 class loop_control_visitor : public ir_hierarchical_visitor {
 public:
@@ -164,6 +168,7 @@ public:
    bool progress;
 };
 
+} /* anonymous namespace */
 
 ir_visitor_status
 loop_control_visitor::visit_leave(ir_loop *ir)
@@ -219,10 +224,10 @@ loop_control_visitor::visit_leave(ir_loop *ir)
            limit = cond->operands[0]->as_constant();
 
            switch (cmp) {
-           case ir_binop_less:    cmp = ir_binop_gequal;  break;
-           case ir_binop_greater: cmp = ir_binop_lequal;  break;
-           case ir_binop_lequal:  cmp = ir_binop_greater; break;
-           case ir_binop_gequal:  cmp = ir_binop_less;    break;
+           case ir_binop_less:    cmp = ir_binop_greater; break;
+           case ir_binop_greater: cmp = ir_binop_less;    break;
+           case ir_binop_lequal:  cmp = ir_binop_gequal;  break;
+           case ir_binop_gequal:  cmp = ir_binop_lequal;  break;
            default: assert(!"Should not get here.");
            }
         }
@@ -249,7 +254,7 @@ loop_control_visitor::visit_leave(ir_loop *ir)
                     ir->from = init->clone(ir, NULL);
                     ir->to = limit->clone(ir, NULL);
                     ir->increment = lv->increment->clone(ir, NULL);
-                    ir->counter = lv->var;
+                    ir->counter = lv->var->clone(ir, NULL);
                     ir->cmp = cmp;
 
                     max_iterations = iterations;