nir: do not try to merge xfb-outputs
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Thu, 4 Jun 2020 10:38:08 +0000 (12:38 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 15 Jun 2020 16:13:58 +0000 (16:13 +0000)
It's tricky to merge XFB-outputs correctly, because we need there to not
be any overlaps when we get to `nir_gather_xfb_info_with_varyings` later
on. We currently trigger an assert there if we end up merging here.

So let's not even try. This is an optimization, and we can optimize this
in safe cases later if needed. For now, let's play it safe.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5329>

src/compiler/nir/nir_lower_io_to_vector.c

index f85e53ac75839053470c58a33898e3869cea9a75..b1ea871a402a794a48a3455b7f620fe02c99e536 100644 (file)
@@ -135,6 +135,18 @@ variables_can_merge(const nir_shader *shader,
        a->data.index != b->data.index)
       return false;
 
+   /* It's tricky to merge XFB-outputs correctly, because we need there
+    * to not be any overlaps when we get to
+    * nir_gather_xfb_info_with_varyings later on. We'll end up
+    * triggering an assert there if we merge here.
+    */
+   if ((shader->info.stage == MESA_SHADER_VERTEX ||
+        shader->info.stage == MESA_SHADER_TESS_EVAL ||
+        shader->info.stage == MESA_SHADER_GEOMETRY) &&
+       a->data.mode == nir_var_shader_out &&
+       (a->data.explicit_xfb_buffer || b->data.explicit_xfb_buffer))
+      return false;
+
    return true;
 }