diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/link_varyings.cpp | 13 |
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) { |