diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 384738cb3bf..494ee7ac82f 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -513,8 +513,15 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, * storage don't need to lower builtins. */ if (!shader_program->data->spirv && - !st->ctx->Const.PackedDriverUniformStorage) + !st->ctx->Const.PackedDriverUniformStorage) { + /* at this point, array uniforms have been split into separate + * nir_variable structs where possible. this codepath can't handle dynamic + * array indexing, however, so all indirect uniform derefs + * must be eliminated beforehand to avoid trying to lower one of those builtins + */ + NIR_PASS_V(nir, nir_lower_indirect_builtin_uniform_derefs); NIR_PASS_V(nir, st_nir_lower_builtin); + } if (!screen->get_param(screen, PIPE_CAP_NIR_ATOMICS_AS_DEREF)) NIR_PASS_V(nir, gl_nir_lower_atomics, shader_program, true);