nir/lower_clip: Fix incorrect driver loc for clipdist outputs
authorRob Clark <robdclark@chromium.org>
Wed, 4 Dec 2019 00:28:26 +0000 (16:28 -0800)
committerRob Clark <robdclark@chromium.org>
Wed, 4 Dec 2019 21:08:52 +0000 (13:08 -0800)
Somehow adjusting maxloc based on existing outputs got lost, resulting
in the clipdist varying clobbering the position varying.  Causing a
shader that had no position output in freedreno/ir3, which triggers GPU
hangs in neverball.

Fixes: d0f746b6458 ("nir: Save nir_variable pointers in nir_lower_clip_vs rather than locs.")
Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
src/compiler/nir/nir_lower_clip.c

index cf8a5d93c76450998e17fee26efc88298ff93d3e..0f0d2eb2c73d3e182609285274d487916a0d533a 100644 (file)
@@ -317,6 +317,17 @@ nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables, bool use_vars,
    if (!ucp_enables)
       return false;
 
+   /* find clipvertex/position outputs: */
+   nir_foreach_variable(var, &shader->outputs) {
+      int loc = var->data.driver_location;
+
+      /* keep track of last used driver-location.. we'll be
+       * appending CLIP_DIST0/CLIP_DIST1 after last existing
+       * output:
+       */
+      maxloc = MAX2(maxloc, loc);
+   }
+
    nir_builder_init(&b, impl);
 
    /* NIR should ensure that, even in case of loops/if-else, there