nir: Return progress from nir_lower_clip_cull_distance_arrays().
authorMatt Turner <mattst88@gmail.com>
Fri, 24 Feb 2017 23:38:28 +0000 (15:38 -0800)
committerMatt Turner <mattst88@gmail.com>
Thu, 23 Mar 2017 21:34:43 +0000 (14:34 -0700)
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir.h
src/compiler/nir/nir_lower_clip_cull_distance_arrays.c

index 80efa063f31bf8a333c5f70d709704a529694e30..44396bcdc36124bfe2fb3ac0745eeda71922a29e 100644 (file)
@@ -2499,7 +2499,7 @@ bool nir_lower_idiv(nir_shader *shader);
 
 void nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables);
 void nir_lower_clip_fs(nir_shader *shader, unsigned ucp_enables);
-void nir_lower_clip_cull_distance_arrays(nir_shader *nir);
+bool nir_lower_clip_cull_distance_arrays(nir_shader *nir);
 
 void nir_lower_two_sided_color(nir_shader *shader);
 
index 5a89eddc271e6638ed847f2ed34223c9767d6cfe..6705a3c4597d1f8c803427081471ca37ea4f403a 100644 (file)
@@ -121,13 +121,14 @@ rewrite_references(nir_instr *instr,
    /* There's no need to update writemasks; it's a scalar array. */
 }
 
-static void
+static bool
 combine_clip_cull(nir_shader *nir,
                   struct exec_list *vars,
                   bool store_info)
 {
    nir_variable *cull = NULL;
    nir_variable *clip = NULL;
+   bool progress = false;
 
    nir_foreach_variable(var, vars) {
       if (var->data.location == VARYING_SLOT_CLIP_DIST0)
@@ -174,15 +175,30 @@ combine_clip_cull(nir_shader *nir,
          exec_node_remove(&cull->node);
          ralloc_free(cull);
       }
+
+      nir_foreach_function(function, nir) {
+         if (function->impl) {
+            nir_metadata_preserve(function->impl,
+                                  nir_metadata_block_index |
+                                  nir_metadata_dominance);
+         }
+      }
+      progress = true;
    }
+
+   return progress;
 }
 
-void
+bool
 nir_lower_clip_cull_distance_arrays(nir_shader *nir)
 {
+   bool progress = false;
+
    if (nir->stage <= MESA_SHADER_GEOMETRY)
-      combine_clip_cull(nir, &nir->outputs, true);
+      progress |= combine_clip_cull(nir, &nir->outputs, true);
 
    if (nir->stage > MESA_SHADER_VERTEX)
-      combine_clip_cull(nir, &nir->inputs, false);
+      progress |= combine_clip_cull(nir, &nir->inputs, false);
+
+   return progress;
 }