ir3/nir: Lower indirect references of compact variables
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 8 Jul 2021 10:39:22 +0000 (12:39 +0200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 9 Jul 2021 09:48:21 +0000 (09:48 +0000)
Fixes Sascha Willems "tessellation" demo on Turnip (it contains
indirect dereference of tessellation levels).

Fixes: 643f2cb ("ir3, tu: Cleanup indirect i/o lowering")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11781>

src/freedreno/ir3/ir3_nir.c

index bab5d8f..eec8208 100644 (file)
@@ -332,6 +332,18 @@ ir3_nir_lower_io_to_temporaries(nir_shader *s)
                NIR_PASS_V(s, nir_lower_var_copies);
                NIR_PASS_V(s, nir_lower_global_vars_to_local);
        }
+
+       /* Regardless of the above, we need to lower indirect references to
+        * compact variables such as clip/cull distances because due to how
+        * TCS<->TES IO works we cannot handle indirect accesses that "straddle"
+        * vec4 components. nir_lower_indirect_derefs has a special case for
+        * compact variables, so it will actually lower them even though we pass
+        * in 0 modes.
+        *
+        * Using temporaries would be slightly better but
+        * nir_lower_io_to_temporaries currently doesn't support TCS i/o.
+        */
+       NIR_PASS_V(s, nir_lower_indirect_derefs, 0, UINT32_MAX);
 }
 
 void