From dac2964f3ebd96d5ac227984ab0cd79c2c3b2a1a Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Thu, 21 Jan 2016 07:17:06 -0500 Subject: glsl: always compute proper varying type, irrespective of varying packing Normally there's a producer and consumer, and the producer var gets picked. In both the vertex->gs and tes->gs cases, that's the un-arrayed version. In the SSO case, however, there is no producer. So we picked the arrayed GS variable, and as a result, used more slots than we should. More critically, these slots would also no longer line up with the producer's calculation. To fix this, we need to fix up the type of the variable based on stage no matter what. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93650 Signed-off-by: Ilia Mirkin Reviewed-by: Timothy Arceri Cc: "11.0 11.1" --- src/glsl/link_varyings.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index 09f80d0f39d..264b69ca619 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -1001,23 +1001,20 @@ varying_matches::record(ir_variable *producer_var, ir_variable *consumer_var) const ir_variable *const var = (producer_var != NULL) ? producer_var : consumer_var; + const gl_shader_stage stage = (producer_var != NULL) + ? producer_stage : consumer_stage; + const glsl_type *type = get_varying_type(var, stage); this->matches[this->num_matches].packing_class = this->compute_packing_class(var); this->matches[this->num_matches].packing_order = this->compute_packing_order(var); if (this->disable_varying_packing) { - unsigned slots; - gl_shader_stage stage = - (producer_var != NULL) ? producer_stage : consumer_stage; - - const glsl_type *type = get_varying_type(var, stage); - - slots = type->count_attribute_slots(false); + unsigned slots = type->count_attribute_slots(false); this->matches[this->num_matches].num_components = slots * 4; } else { this->matches[this->num_matches].num_components - = var->type->component_slots(); + = type->component_slots(); } this->matches[this->num_matches].producer_var = producer_var; this->matches[this->num_matches].consumer_var = consumer_var; -- cgit v1.2.3