glsl: Fix varying struct locations when varying packing is disabled.
varying_matches::record tries to compute the number of components in each varying, which varying_matches::assign_locations uses to assign locations. With varying packing, it uses glsl_type::component_slots() to come up with a reasonable value. Without varying packing, it fell back to an open-coded computation that didn't bother to handle structs at all. I believe we can simply use 4 * glsl_type::count_attribute_slots(false), which already handles these cases correctly. Partially fixes rendering in GFXBench 4.0's tessellation benchmark. (NVE0 is almost right after this, but i965 is still mostly garbage.) Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-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:
@@ -959,19 +959,8 @@ varying_matches::record(ir_variable *producer_var, ir_variable *consumer_var)
|
||||
type = type->fields.array;
|
||||
}
|
||||
|
||||
if (type->is_array()) {
|
||||
slots = 1;
|
||||
while (type->is_array()) {
|
||||
slots *= type->length;
|
||||
type = type->fields.array;
|
||||
}
|
||||
slots *= type->matrix_columns;
|
||||
} else {
|
||||
slots = type->matrix_columns;
|
||||
}
|
||||
if (type->without_array()->is_dual_slot_double())
|
||||
slots *= 2;
|
||||
this->matches[this->num_matches].num_components = 4 * slots;
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user