From 42351c21bbb9ed5e067737ac72e1da510832ddd7 Mon Sep 17 00:00:00 2001 From: Andres Gomez Date: Fri, 8 Mar 2019 23:21:58 +0200 Subject: [PATCH] glsl/linker: always validate explicit locations for first and last interfaces Until now, we were only doing this when linking a SSO program. However, nothing avoids linking a non SSO program which doesn't have both a VS and FS. In those cases, we also need to report the usual linking errors, if happening. v2: Use a better name for the renamed function (Timothy). Signed-off-by: Andres Gomez Reviewed-by: Timothy Arceri --- src/compiler/glsl/link_varyings.cpp | 14 ++++++-------- src/compiler/glsl/link_varyings.h | 8 ++++---- src/compiler/glsl/linker.cpp | 15 +++++++-------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 89a1463..22ec411 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -678,17 +678,15 @@ validate_explicit_variable_location(struct gl_context *ctx, /** * Validate explicit locations for the inputs to the first stage and the - * outputs of the last stage in an SSO program (everything in between is - * validated in cross_validate_outputs_to_inputs). + * outputs of the last stage in a program, if those are not the VS and FS + * shaders. */ void -validate_sso_explicit_locations(struct gl_context *ctx, - struct gl_shader_program *prog, - gl_shader_stage first_stage, - gl_shader_stage last_stage) +validate_first_and_last_interface_explicit_locations(struct gl_context *ctx, + struct gl_shader_program *prog, + gl_shader_stage first_stage, + gl_shader_stage last_stage) { - assert(prog->SeparateShader); - /* VS inputs and FS outputs are validated in * assign_attribute_or_color_locations() */ diff --git a/src/compiler/glsl/link_varyings.h b/src/compiler/glsl/link_varyings.h index 16bf166..d0f7ca3 100644 --- a/src/compiler/glsl/link_varyings.h +++ b/src/compiler/glsl/link_varyings.h @@ -276,10 +276,10 @@ link_varyings(struct gl_shader_program *prog, unsigned first, unsigned last, struct gl_context *ctx, void *mem_ctx); void -validate_sso_explicit_locations(struct gl_context *ctx, - struct gl_shader_program *prog, - gl_shader_stage first, - gl_shader_stage last); +validate_first_and_last_interface_explicit_locations(struct gl_context *ctx, + struct gl_shader_program *prog, + gl_shader_stage first, + gl_shader_stage last); void cross_validate_outputs_to_inputs(struct gl_context *ctx, diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 5667fb7..efcef9f 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -5141,15 +5141,14 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) prev = i; } - /* The cross validation of outputs/inputs above validates explicit locations - * but for SSO programs we need to do this also for the inputs in the - * first stage and outputs of the last stage included in the program, since - * there is no cross validation for these. + /* The cross validation of outputs/inputs above validates interstage + * explicit locations. We need to do this also for the inputs in the first + * stage and outputs of the last stage included in the program, since there + * is no cross validation for these. */ - if (prog->SeparateShader) - validate_sso_explicit_locations(ctx, prog, - (gl_shader_stage) first, - (gl_shader_stage) last); + validate_first_and_last_interface_explicit_locations(ctx, prog, + (gl_shader_stage) first, + (gl_shader_stage) last); /* Cross-validate uniform blocks between shader stages */ validate_interstage_uniform_blocks(prog, prog->_LinkedShaders); -- 2.7.4