ntt: lower indirect tesslevels in ntt

Tessellation shader which are using indirect
addressing for tesslevels e.g
  gl_TessLevelOuter[gl_InvocationID] = tessLevelOuter;
are crashing because gl_TessLevelOuter is now a
compact array variable and nir expects a constant
array index into the compact array variable.

This patch handles such cases.

This fixes MR 21940
Fixes: 84006587d7 ("glsl: Delete the lower_tess_level pass.")

Tested with glretrace

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25773>
This commit is contained in:
Neha Bhende
2023-10-17 15:58:23 -07:00
committed by Marge Bot
parent 6505f5aade
commit 8cfb46e27d

View File

@@ -3898,6 +3898,15 @@ const void *nir_to_tgsi_options(struct nir_shader *s,
NIR_PASS_V(s, nir_remove_dead_variables, nir_var_shader_in, NULL); NIR_PASS_V(s, nir_remove_dead_variables, nir_var_shader_in, NULL);
} }
/* Lower tesslevel indirect derefs for tessellation shader.
* tesslevels are now a compact array variable and nir expects a constant
* array index into the compact array variable.
*/
if (s->info.stage == MESA_SHADER_TESS_CTRL ||
s->info.stage == MESA_SHADER_TESS_EVAL) {
NIR_PASS_V(s, nir_lower_indirect_derefs, 0 , UINT32_MAX);
}
NIR_PASS_V(s, nir_lower_io, nir_var_shader_in | nir_var_shader_out, NIR_PASS_V(s, nir_lower_io, nir_var_shader_in | nir_var_shader_out,
type_size, (nir_lower_io_options)0); type_size, (nir_lower_io_options)0);