nir: Avoid clip/cull distance lowering multiple times.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 23 Jan 2019 09:15:05 +0000 (01:15 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 5 Feb 2019 21:58:46 +0000 (13:58 -0800)
A couple places in st/nir assume that cull distances have been lowered
away, so it will need to call this lowering pass for drivers which opt
out of the GLSL IR lowering.  The Intel backend also calls this pass,
for i965 and anv.  We need to only do it once.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir/nir_lower_clip_cull_distance_arrays.c

index 79d61fabea3519925739d6e35b966fae0ac03c9d..05cd6af2195d5d95b0d86d3f07de0c62d515be95 100644 (file)
@@ -148,6 +148,12 @@ combine_clip_cull(nir_shader *nir,
       /* The GLSL IR lowering pass must have converted these to vectors */
       if (!clip->data.compact)
          return false;
+
+      /* If this pass has already run, don't repeat.  We would think that
+       * the combined clip/cull distance array was clip-only and mess up.
+       */
+      if (clip->data.how_declared == nir_var_hidden)
+         return false;
    }
 
    const unsigned clip_array_size = get_unwrapped_array_length(nir, clip);
@@ -158,11 +164,15 @@ combine_clip_cull(nir_shader *nir,
       nir->info.cull_distance_array_size = cull_array_size;
    }
 
-   if (clip)
+   if (clip) {
       clip->data.compact = true;
+      clip->data.how_declared = nir_var_hidden;
+   }
 
-   if (cull)
+   if (cull) {
       cull->data.compact = true;
+      cull->data.how_declared = nir_var_hidden;
+   }
 
    if (cull_array_size > 0) {
       if (clip_array_size == 0) {