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 <imirkin@alum.mit.edu> Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com> Cc: "11.0 11.1" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user