From d53984ce972658401a64908dc47e8ea8e904f941 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Thu, 8 Jul 2021 12:39:22 +0200 Subject: [PATCH] ir3/nir: Lower indirect references of compact variables 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: --- src/freedreno/ir3/ir3_nir.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c index bab5d8faaee..eec8208ade3 100644 --- a/src/freedreno/ir3/ir3_nir.c +++ b/src/freedreno/ir3/ir3_nir.c @@ -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