mesa: Switch memcpy fast-path of glGetTexImage() to using MapTextureImage().
[mesa.git] / src / glsl / opt_discard_simplification.cpp
index 0e577c478a91598df8c4de5c373d6feeb6199e50..ba4981bae53e5be185cbf178d7d915c214c1a255 100644 (file)
@@ -95,6 +95,7 @@ public:
 
    ir_visitor_status visit_enter(ir_if *);
    ir_visitor_status visit_enter(ir_loop *);
+   ir_visitor_status visit_enter(ir_assignment *);
 
    bool progress;
 };
@@ -103,9 +104,23 @@ static ir_discard *
 find_unconditional_discard(exec_list &instructions)
 {
    foreach_list(n, &instructions) {
-      ir_discard *ir = ((ir_instruction *) n)->as_discard();
-      if (ir != NULL && ir->condition == NULL)
-        return ir;
+      ir_instruction *ir = (ir_instruction *)n;
+
+      if (ir->ir_type == ir_type_return ||
+         ir->ir_type == ir_type_loop_jump)
+        return NULL;
+
+      /* So far, this code doesn't know how to look inside of flow
+       * control to see if a discard later on at this level is
+       * unconditional.
+       */
+      if (ir->ir_type == ir_type_if ||
+         ir->ir_type == ir_type_loop)
+        return NULL;
+
+      ir_discard *discard = ir->as_discard();
+      if (discard != NULL && discard->condition == NULL)
+        return discard;
    }
    return NULL;
 }
@@ -117,6 +132,16 @@ is_only_instruction(ir_discard *discard)
           discard->next->is_tail_sentinel());
 }
 
+/* We only care about the top level instructions, so don't descend
+ * into expressions.
+ */
+ir_visitor_status
+discard_simplifier::visit_enter(ir_assignment *ir)
+{
+   (void) ir;
+   return visit_continue_with_parent;
+}
+
 ir_visitor_status
 discard_simplifier::visit_enter(ir_if *ir)
 {