summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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) {