radeon: reverse DBG_NO_HYPERZ logic
[mesa.git] / src / glsl / opt_dead_code_local.cpp
index 8c31802a6ac1ac090e42e27c41a3d1794222dbfc..e7d46edbe3e9c68e8320b223a6242687a43c6437 100644 (file)
@@ -70,8 +70,8 @@ public:
 
    void kill_channels(ir_variable *const var, int used)
    {
-      foreach_iter(exec_list_iterator, iter, *this->assignments) {
-        assignment_entry *entry = (assignment_entry *)iter.get();
+      foreach_list_safe(n, this->assignments) {
+        assignment_entry *entry = (assignment_entry *) n;
 
         if (entry->lhs == var) {
            if (var->type->is_scalar() || var->type->is_vector()) {
@@ -114,6 +114,23 @@ public:
       return visit_continue_with_parent;
    }
 
+   virtual ir_visitor_status visit(ir_emit_vertex *ir)
+   {
+      /* For the purpose of dead code elimination, emitting a vertex counts as
+       * "reading" all of the currently assigned output variables.
+       */
+      foreach_list_safe(n, this->assignments) {
+         assignment_entry *entry = (assignment_entry *) n;
+         if (entry->lhs->data.mode == ir_var_shader_out) {
+            if (debug)
+               printf("kill %s\n", entry->lhs->name);
+            entry->remove();
+         }
+      }
+
+      return visit_continue;
+   }
+
 private:
    exec_list *assignments;
 };
@@ -179,8 +196,8 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
            printf("looking for %s.0x%01x to remove\n", var->name,
                   ir->write_mask);
 
-        foreach_iter(exec_list_iterator, iter, *assignments) {
-           assignment_entry *entry = (assignment_entry *)iter.get();
+        foreach_list_safe(n, assignments) {
+           assignment_entry *entry = (assignment_entry *) n;
 
            if (entry->lhs != var)
               continue;
@@ -241,8 +258,8 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
          */
         if (debug)
            printf("looking for %s to remove\n", var->name);
-        foreach_iter(exec_list_iterator, iter, *assignments) {
-           assignment_entry *entry = (assignment_entry *)iter.get();
+        foreach_list_safe(n, assignments) {
+           assignment_entry *entry = (assignment_entry *) n;
 
            if (entry->lhs == var) {
               if (debug)
@@ -263,8 +280,8 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
       printf("add %s\n", var->name);
 
       printf("current entries\n");
-      foreach_iter(exec_list_iterator, iter, *assignments) {
-        assignment_entry *entry = (assignment_entry *)iter.get();
+      foreach_list(n, assignments) {
+        assignment_entry *entry = (assignment_entry *) n;
 
         printf("    %s (0x%01x)\n", entry->lhs->name, entry->available);
       }