[Mesa-dev] [PATCH] glsl/linker: Check the subroutine associated functions names
Tapani Pälli
tapani.palli at intel.com
Tue Oct 2 07:01:53 UTC 2018
On 10/1/18 5:03 PM, Vadym Shovkoplias wrote:
> From Section 6.1.2 (Subroutines) of the GLSL 4.00 specification
>
> "A program will fail to compile or link if any shader
> or stage contains two or more functions with the same
> name if the name is associated with a subroutine type."
>
> Fixes:
> * no-overloads.vert
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108109
> Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>
> ---
> src/compiler/glsl/linker.cpp | 40 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 40 insertions(+)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index 3fde7e78d3..d0d017c7ff 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -4639,6 +4639,45 @@ link_assign_subroutine_types(struct gl_shader_program *prog)
> }
> }
>
> +static void
> +verify_subroutine_associated_funcs(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;
> + glsl_symbol_table *symbols = prog->_LinkedShaders[i]->symbols;
> +
> + /*
> + * From OpenGL ES Shading Language 4.00 specification
> + * (6.1.2 Subroutines):
> + * "A program will fail to compile or link if any shader
> + * or stage contains two or more functions with the same
> + * name if the name is associated with a subroutine type."
> + */
> + for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) {
> + unsigned definitions = 0;
> + char *name = p->sh.SubroutineFunctions[j].name;
> + ir_function *fn = symbols->get_function(name);
> +
> + /* Calculate number of function definitions with the same name */
> + foreach_in_list(ir_function_signature, sig, &fn->signatures) {
> + if (sig->is_defined)
> + definitions++;
You can just error out here, no need to calculate further.
I'm wondering a bit though should we fail here even if that function was
not used at all (optimized out)? I can see that the Piglit test does not
have a call to the function defined.
> + }
> +
> + if (definitions > 1) {
> + linker_error(prog, "%s shader contains %u function "
> + "definitions with name `%s', which is associated with"
> + " a subroutine type.\n",
> + _mesa_shader_stage_to_string(i), definitions, fn->name);
> + return;
> + }
> + }
> + }
> +}
> +
> +
> static void
> set_always_active_io(exec_list *ir, ir_variable_mode io_mode)
> {
> @@ -5024,6 +5063,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
>
> check_explicit_uniform_locations(ctx, prog);
> link_assign_subroutine_types(prog);
> + verify_subroutine_associated_funcs(prog);
>
> if (!prog->data->LinkStatus)
> goto done;
>
More information about the mesa-dev
mailing list