[Mesa-stable] [PATCH v2 1/2] gallivm: correct channel shift logic on big endian

Emil Velikov emil.l.velikov at gmail.com
Tue Aug 29 16:51:35 UTC 2017


On 23 August 2017 at 21:32, Ben Crocker <bcrocker at redhat.com> wrote:
> From: Ray Strode <rstrode at redhat.com>
>
> lp_build_fetch_rgba_soa fetches a texel from a texture.
> Part of that process involves first gathering the element
> together from memory into a packed format, and then breaking
> out the individual color channels into separate, parallel
> arrays.
>
> The code fails to account for endianess when reading the packed
> values.
>
> This commit attempts to correct the problem by reversing the order
> the packed values are read on big endian systems.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100613
> Cc: "17.2" "17.1" <mesa-stable at lists.freedesktop.org>
>
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_format_soa.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
> index 98eb694..22c19b1 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
> @@ -650,7 +650,13 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>           for (i = 0; i < format_desc->nr_channels; i++) {
>              struct util_format_channel_description chan_desc = format_desc->channel[i];
>              unsigned blockbits = type.width;
> -            unsigned vec_nr = chan_desc.shift / type.width;
> +            unsigned vec_nr;
> +
> +#ifdef PIPE_ARCH_BIG_ENDIAN
> +            vec_nr = (format_desc->block.bits - (chan_desc.shift + chan_desc.size)) / type.width;
> +#else
> +            vec_nr = chan_desc.shift / type.width;
> +#endif
>              chan_desc.shift %= type.width;
>
Roland, I think you're one of the more knowledgeable people for things gallivm.
Can you please review this patch?

-Emil


More information about the mesa-stable mailing list