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: 84006587d7e5 ("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>
(cherry picked from commit
8cfb46e27dfb12acdb1a00f7687a43899d770cca)
"description": "ntt: lower indirect tesslevels in ntt",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "84006587d7e5b87526a9b83135393251afeef777",
"notes": 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,
type_size, (nir_lower_io_options)0);