summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorAndres Gomez <[email protected]>2018-12-28 12:24:53 +0200
committerAndres Gomez <[email protected]>2019-03-19 17:23:27 +0200
commitde1bc2d19a6e4b9081a79424ffc1cd082d27f6bd (patch)
tree30bf13583eeb07cc21178fb57b926524b107f267 /src/compiler
parenta96093136bddfe17661f1de54228fe4b5618ba8a (diff)
glsl/linker: always validate explicit location among inputs
Outputs are always validated when having explicit locations and we were trusting its outcome to catch similar problems with the inputs since, in case of having undefined outputs for existing inputs, we would be already reporting a linker error. However, consider this case: " Shader stage n: --------------- ... layout(location = 0) out float a; ... Shader stage n+1: ----------------- ... layout(location = 0) in float b; layout(location = 0) in float c; ... " Currently, this won't report a linker error even though location aliasing is happening for the inputs. Therefore, we also need to validate the inputs independently from the outcome of the outputs validation. Cc: Timothy Arceri <[email protected]> Cc: Iago Toral Quiroga <[email protected]> Cc: Ilia Mirkin <[email protected]> Signed-off-by: Andres Gomez <[email protected]> Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/glsl/link_varyings.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
index 2d17e06240d..b0422ef7fca 100644
--- a/src/compiler/glsl/link_varyings.cpp
+++ b/src/compiler/glsl/link_varyings.cpp
@@ -687,7 +687,8 @@ cross_validate_outputs_to_inputs(struct gl_context *ctx,
gl_linked_shader *consumer)
{
glsl_symbol_table parameters;
- struct explicit_location_info explicit_locations[MAX_VARYING][4] = { 0 };
+ struct explicit_location_info output_explicit_locations[MAX_VARYING][4] = { 0 };
+ struct explicit_location_info input_explicit_locations[MAX_VARYING][4] = { 0 };
/* Find all shader outputs in the "producer" stage.
*/
@@ -705,7 +706,7 @@ cross_validate_outputs_to_inputs(struct gl_context *ctx,
* differently because they do not need to have matching names.
*/
if (!validate_explicit_variable_location(ctx,
- explicit_locations,
+ output_explicit_locations,
var, prog, producer)) {
return;
}
@@ -763,6 +764,12 @@ cross_validate_outputs_to_inputs(struct gl_context *ctx,
compute_variable_location_slot(input, consumer->Stage);
unsigned slot_limit = idx + num_elements;
+ if (!validate_explicit_variable_location(ctx,
+ input_explicit_locations,
+ input, prog, consumer)) {
+ return;
+ }
+
while (idx < slot_limit) {
if (idx >= MAX_VARYING) {
linker_error(prog,
@@ -771,7 +778,7 @@ cross_validate_outputs_to_inputs(struct gl_context *ctx,
return;
}
- output = explicit_locations[idx][input->data.location_frac].var;
+ output = output_explicit_locations[idx][input->data.location_frac].var;
if (output == NULL ||
input->data.location != output->data.location) {