diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2015-12-30 02:33:00 -0800 |
---|---|---|
committer | Kenneth Graunke <kenneth@whitecape.org> | 2015-12-30 16:04:12 -0800 |
commit | 7cdc2b9ca0ab60b282416b975a2ac6d7abcd42ad (patch) | |
tree | debe7beedbc1ebc6534f127cbe1b29d19e0c12d4 /src/glsl/link_varyings.cpp | |
parent | 4acf71c89b5ef5e2fe8c1a3d7ecf6031e191463c (diff) | |
download | external_mesa3d-7cdc2b9ca0ab60b282416b975a2ac6d7abcd42ad.zip external_mesa3d-7cdc2b9ca0ab60b282416b975a2ac6d7abcd42ad.tar.gz external_mesa3d-7cdc2b9ca0ab60b282416b975a2ac6d7abcd42ad.tar.bz2 |
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>
Diffstat (limited to 'src/glsl/link_varyings.cpp')
-rw-r--r-- | src/glsl/link_varyings.cpp | 15 |
1 files changed, 2 insertions, 13 deletions
diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index 9cc77fe..1ff25b8 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -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(); |