[Mesa-dev] [PATCH 1/2] glsl: Fix varying struct locations when varying packing is disabled.
Ilia Mirkin
imirkin at alum.mit.edu
Wed Dec 30 05:49:41 PST 2015
On Wed, Dec 30, 2015 at 6:26 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> 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 at whitecape.org>
> Cc: mesa-stable at lists.freedesktop.org
> Cc: Timothy Arceri <timothy.arceri at collabora.com>
> Cc: Ilia Mirkin <imirkin at alum.mit.edu>
That seems right... but 11.0/11.1 didn't have the
count_attribute_slots(true/false) thing -- only true :(
I'd be fine with nominating commit 5dc22cadb for 11.0/11.1 stable
though and then including this patch as well. Either way, this one is
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> src/glsl/link_varyings.cpp | 15 ++-------------
> 1 file 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();
> --
> 2.6.4
>
More information about the mesa-dev
mailing list