nir/lower_clip: add a find_clipvertex_and_position_outputs() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 28 Jun 2019 00:10:28 +0000 (10:10 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 18 Jul 2019 23:25:47 +0000 (09:25 +1000)
This will allow code sharing in a following patch that adds support
for lowering in geometry shaders. It also allows us to exit early
if there is no lowering to do which allows a small code tidy up.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/nir/nir_lower_clip.c

index 474854d047b0ddd38daaacf37aadb59014dc80fc..1536f0a3451bd3debd335146f3a5cc7e0c00283d 100644 (file)
@@ -146,6 +146,35 @@ find_output(nir_shader *shader, unsigned drvloc)
    return def;
 }
 
+static bool
+find_clipvertex_and_position_outputs(nir_shader *shader,
+                                     nir_variable **clipvertex,
+                                     nir_variable **position)
+{
+   nir_foreach_variable(var, &shader->outputs) {
+      switch (var->data.location) {
+      case VARYING_SLOT_POS:
+         *position = var;
+         break;
+      case VARYING_SLOT_CLIP_VERTEX:
+         *clipvertex = var;
+         break;
+      case VARYING_SLOT_CLIP_DIST0:
+      case VARYING_SLOT_CLIP_DIST1:
+         /* if shader is already writing CLIPDIST, then
+          * there should be no user-clip-planes to deal
+          * with.
+          *
+          * We assume nir_remove_dead_variables has removed the clipdist
+          * variables if they're not written.
+          */
+         return false;
+      }
+   }
+
+   return *clipvertex || *position;
+}
+
 /*
  * VS lowering
  */
@@ -185,27 +214,9 @@ nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables, bool use_vars)
    assert(impl->end_block->predecessors->entries == 1);
    b.cursor = nir_after_cf_list(&impl->body);
 
-   /* find clipvertex/position outputs: */
-   nir_foreach_variable(var, &shader->outputs) {
-      switch (var->data.location) {
-      case VARYING_SLOT_POS:
-         position = var;
-         break;
-      case VARYING_SLOT_CLIP_VERTEX:
-         clipvertex = var;
-         break;
-      case VARYING_SLOT_CLIP_DIST0:
-      case VARYING_SLOT_CLIP_DIST1:
-         /* if shader is already writing CLIPDIST, then
-          * there should be no user-clip-planes to deal
-          * with.
-          *
-          * We assume nir_remove_dead_variables has removed the clipdist
-          * variables if they're not written.
-          */
-         return false;
-      }
-   }
+   /* find clipvertex/position outputs */
+   if (!find_clipvertex_and_position_outputs(shader, &clipvertex, &position))
+      return false;
 
    if (use_vars) {
       cv = nir_load_var(&b, clipvertex ? clipvertex : position);
@@ -218,10 +229,10 @@ nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables, bool use_vars)
    } else {
       if (clipvertex)
          cv = find_output(shader, clipvertex->data.driver_location);
-      else if (position)
+      else {
+         assert(position);
          cv = find_output(shader, position->data.driver_location);
-      else
-         return false;
+      }
    }
 
    /* insert CLIPDIST outputs: */