From 2a5ae739eab6c397ec96e553f63588b99bee2a02 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 25 Mar 2024 17:10:11 +1100 Subject: [PATCH] glsl: move link_assign_subroutine_types() to the nir linker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Acked-by: Marek Olšák Part-of: --- src/compiler/glsl/gl_nir_linker.c | 75 +++++++++++++++++++++++++++++++ src/compiler/glsl/linker.cpp | 65 --------------------------- 2 files changed, 75 insertions(+), 65 deletions(-) diff --git a/src/compiler/glsl/gl_nir_linker.c b/src/compiler/glsl/gl_nir_linker.c index 48390b7da11..dbc98a4531e 100644 --- a/src/compiler/glsl/gl_nir_linker.c +++ b/src/compiler/glsl/gl_nir_linker.c @@ -1466,6 +1466,80 @@ gl_nir_link_spirv(const struct gl_constants *consts, return true; } +static void +link_assign_subroutine_types(struct gl_shader_program *prog) +{ + unsigned mask = prog->data->linked_stages; + while (mask) { + const int i = u_bit_scan(&mask); + struct gl_program *p = prog->_LinkedShaders[i]->Program; + + struct set *fn_decl_set = + _mesa_set_create(NULL, _mesa_hash_string, _mesa_key_string_equal); + + p->sh.MaxSubroutineFunctionIndex = 0; + nir_foreach_function(fn, p->nir) { + /* A function might be decalred multiple times but we should only + * process it once + */ + struct set_entry *entry = _mesa_set_search(fn_decl_set, fn->name); + if (entry) + continue; + + _mesa_set_add(fn_decl_set, fn->name); + + if (fn->is_subroutine) + p->sh.NumSubroutineUniformTypes++; + + if (!fn->num_subroutine_types) + continue; + + /* these should have been calculated earlier. */ + assert(fn->subroutine_index != -1); + if (p->sh.NumSubroutineFunctions + 1 > MAX_SUBROUTINES) { + linker_error(prog, "Too many subroutine functions declared.\n"); + return; + } + p->sh.SubroutineFunctions = reralloc(p, p->sh.SubroutineFunctions, + struct gl_subroutine_function, + p->sh.NumSubroutineFunctions + 1); + p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].name.string = ralloc_strdup(p, fn->name); + resource_name_updated(&p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].name); + p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].num_compat_types = fn->num_subroutine_types; + p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].types = + ralloc_array(p, const struct glsl_type *, + fn->num_subroutine_types); + + /* From Section 4.4.4(Subroutine Function Layout Qualifiers) of the + * GLSL 4.5 spec: + * + * "Each subroutine with an index qualifier in the shader must be + * given a unique index, otherwise a compile or link error will be + * generated." + */ + for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) { + if (p->sh.SubroutineFunctions[j].index != -1 && + p->sh.SubroutineFunctions[j].index == fn->subroutine_index) { + linker_error(prog, "each subroutine index qualifier in the " + "shader must be unique\n"); + return; + } + } + p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].index = + fn->subroutine_index; + + if (fn->subroutine_index > (int)p->sh.MaxSubroutineFunctionIndex) + p->sh.MaxSubroutineFunctionIndex = fn->subroutine_index; + + for (int j = 0; j < fn->num_subroutine_types; j++) + p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].types[j] = fn->subroutine_types[j]; + p->sh.NumSubroutineFunctions++; + } + + _mesa_set_destroy(fn_decl_set, NULL); + } +} + static void verify_subroutine_associated_funcs(struct gl_shader_program *prog) { @@ -1716,6 +1790,7 @@ gl_nir_link_glsl(const struct gl_constants *consts, MESA_TRACE_FUNC(); + link_assign_subroutine_types(prog); verify_subroutine_associated_funcs(prog); if (!prog->data->LinkStatus) return false; diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index b4afec18873..1cc6d83505d 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -2375,70 +2375,6 @@ check_explicit_uniform_locations(const struct gl_extensions *exts, prog->NumExplicitUniformLocations = entries_total; } -static void -link_assign_subroutine_types(struct gl_shader_program *prog) -{ - unsigned mask = prog->data->linked_stages; - while (mask) { - const int i = u_bit_scan(&mask); - gl_program *p = prog->_LinkedShaders[i]->Program; - - p->sh.MaxSubroutineFunctionIndex = 0; - foreach_in_list(ir_instruction, node, prog->_LinkedShaders[i]->ir) { - ir_function *fn = node->as_function(); - if (!fn) - continue; - - if (fn->is_subroutine) - p->sh.NumSubroutineUniformTypes++; - - if (!fn->num_subroutine_types) - continue; - - /* these should have been calculated earlier. */ - assert(fn->subroutine_index != -1); - if (p->sh.NumSubroutineFunctions + 1 > MAX_SUBROUTINES) { - linker_error(prog, "Too many subroutine functions declared.\n"); - return; - } - p->sh.SubroutineFunctions = reralloc(p, p->sh.SubroutineFunctions, - struct gl_subroutine_function, - p->sh.NumSubroutineFunctions + 1); - p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].name.string = ralloc_strdup(p, fn->name); - resource_name_updated(&p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].name); - p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].num_compat_types = fn->num_subroutine_types; - p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].types = - ralloc_array(p, const struct glsl_type *, - fn->num_subroutine_types); - - /* From Section 4.4.4(Subroutine Function Layout Qualifiers) of the - * GLSL 4.5 spec: - * - * "Each subroutine with an index qualifier in the shader must be - * given a unique index, otherwise a compile or link error will be - * generated." - */ - for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) { - if (p->sh.SubroutineFunctions[j].index != -1 && - p->sh.SubroutineFunctions[j].index == fn->subroutine_index) { - linker_error(prog, "each subroutine index qualifier in the " - "shader must be unique\n"); - return; - } - } - p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].index = - fn->subroutine_index; - - if (fn->subroutine_index > (int)p->sh.MaxSubroutineFunctionIndex) - p->sh.MaxSubroutineFunctionIndex = fn->subroutine_index; - - for (int j = 0; j < fn->num_subroutine_types; j++) - p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].types[j] = fn->subroutine_types[j]; - p->sh.NumSubroutineFunctions++; - } - } -} - void link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) { @@ -2636,7 +2572,6 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) goto done; check_explicit_uniform_locations(&ctx->Extensions, prog); - link_assign_subroutine_types(prog); done: for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {