From 726e8f24c6eefe5b2d77fe0dbfd9d7c89fc224f4 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Tue, 7 Jan 2020 13:43:05 +1100 Subject: [PATCH] glsl: move calculate_subroutine_compat() to shared linker code MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We will make use of this in the nir linker in the following patch. Reviewed-by: Tapani Pälli --- src/compiler/glsl/linker.cpp | 38 +------------------------------ src/compiler/glsl/linker_util.cpp | 37 ++++++++++++++++++++++++++++++ src/compiler/glsl/linker_util.h | 3 +++ 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index ce0ab7ac322..ef77389add4 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -3321,42 +3321,6 @@ store_fragdepth_layout(struct gl_shader_program *prog) } } -static void -link_calculate_subroutine_compat(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; - - for (unsigned j = 0; j < p->sh.NumSubroutineUniformRemapTable; j++) { - if (p->sh.SubroutineUniformRemapTable[j] == INACTIVE_UNIFORM_EXPLICIT_LOCATION) - continue; - - struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[j]; - - if (!uni) - continue; - - int count = 0; - if (p->sh.NumSubroutineFunctions == 0) { - linker_error(prog, "subroutine uniform %s defined but no valid functions found\n", uni->type->name); - continue; - } - for (unsigned f = 0; f < p->sh.NumSubroutineFunctions; f++) { - struct gl_subroutine_function *fn = &p->sh.SubroutineFunctions[f]; - for (int k = 0; k < fn->num_compat_types; k++) { - if (fn->types[k] == uni->type) { - count++; - break; - } - } - } - uni->num_compatible_subroutines = count; - } - } -} - /** * Validate shader image resources. */ @@ -4440,7 +4404,7 @@ link_and_validate_uniforms(struct gl_context *ctx, if (prog->data->LinkStatus == LINKING_FAILURE) return; - link_calculate_subroutine_compat(prog); + link_util_calculate_subroutine_compat(prog); if (!ctx->Const.UseNIRGLSLLinker) { link_util_check_uniform_resources(ctx, prog); diff --git a/src/compiler/glsl/linker_util.cpp b/src/compiler/glsl/linker_util.cpp index bd4043df2db..80c9f2872f9 100644 --- a/src/compiler/glsl/linker_util.cpp +++ b/src/compiler/glsl/linker_util.cpp @@ -22,6 +22,7 @@ * */ #include "main/mtypes.h" +#include "glsl_types.h" #include "linker_util.h" #include "util/bitscan.h" #include "util/set.h" @@ -250,3 +251,39 @@ link_util_check_uniform_resources(struct gl_context *ctx, } } } + +void +link_util_calculate_subroutine_compat(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; + + for (unsigned j = 0; j < p->sh.NumSubroutineUniformRemapTable; j++) { + if (p->sh.SubroutineUniformRemapTable[j] == INACTIVE_UNIFORM_EXPLICIT_LOCATION) + continue; + + struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[j]; + + if (!uni) + continue; + + int count = 0; + if (p->sh.NumSubroutineFunctions == 0) { + linker_error(prog, "subroutine uniform %s defined but no valid functions found\n", uni->type->name); + continue; + } + for (unsigned f = 0; f < p->sh.NumSubroutineFunctions; f++) { + struct gl_subroutine_function *fn = &p->sh.SubroutineFunctions[f]; + for (int k = 0; k < fn->num_compat_types; k++) { + if (fn->types[k] == uni->type) { + count++; + break; + } + } + } + uni->num_compatible_subroutines = count; + } + } +} diff --git a/src/compiler/glsl/linker_util.h b/src/compiler/glsl/linker_util.h index 7d355d10659..53e0ca315a5 100644 --- a/src/compiler/glsl/linker_util.h +++ b/src/compiler/glsl/linker_util.h @@ -78,6 +78,9 @@ void link_util_check_uniform_resources(struct gl_context *ctx, struct gl_shader_program *prog); +void +link_util_calculate_subroutine_compat(struct gl_shader_program *prog); + #ifdef __cplusplus } #endif -- 2.30.2