[Mesa-dev] [PATCH 05/29] intel/isl: Add a helper for inverting swizzles

Pohjolainen, Topi topi.pohjolainen at gmail.com
Mon Feb 26 14:19:52 UTC 2018


On Fri, Jan 26, 2018 at 05:59:34PM -0800, Jason Ekstrand wrote:
> ---
>  src/intel/isl/isl.c | 30 ++++++++++++++++++++++++++++++
>  src/intel/isl/isl.h |  2 ++
>  2 files changed, 32 insertions(+)
> 
> diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
> index a2d3ae6..420d387 100644
> --- a/src/intel/isl/isl.c
> +++ b/src/intel/isl/isl.c
> @@ -2379,3 +2379,33 @@ isl_swizzle_compose(struct isl_swizzle first, struct isl_swizzle second)
>        .a = swizzle_select(first.a, second),
>     };
>  }
> +
> +/**
> + * Returns a swizzle that is the pseudo-inverse of this swizzle.
> + */
> +struct isl_swizzle
> +isl_swizzle_invert(struct isl_swizzle swizzle)
> +{
> +   /* Default to zero for channels which do not show up in the swizzle */
> +   enum isl_channel_select chans[4] = {
> +      ISL_CHANNEL_SELECT_ZERO,
> +      ISL_CHANNEL_SELECT_ZERO,
> +      ISL_CHANNEL_SELECT_ZERO,
> +      ISL_CHANNEL_SELECT_ZERO,
> +   };
> +
> +   /* We go in ABGR order so that, if there are any duplicates, the first one
> +    * is taken if you look at it in RGBA order.  This is what Haswell hardware
> +    * does for render target swizzles.
> +    */
> +   if ((unsigned)(swizzle.a - ISL_CHANNEL_SELECT_RED) < 4)
> +      chans[swizzle.a - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_ALPHA;
> +   if ((unsigned)(swizzle.b - ISL_CHANNEL_SELECT_RED) < 4)
> +      chans[swizzle.b - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_BLUE;
> +   if ((unsigned)(swizzle.g - ISL_CHANNEL_SELECT_RED) < 4)
> +      chans[swizzle.g - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_GREEN;
> +   if ((unsigned)(swizzle.r - ISL_CHANNEL_SELECT_RED) < 4)
> +      chans[swizzle.r - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_RED;
> +
> +   return (struct isl_swizzle) { chans[0], chans[1], chans[2], chans[3] };

If given

    swizzle == { ISL_CHANNEL_SELECT_RED,
                 ISL_CHANNEL_SELECT_GREEN,
                 ISL_CHANNEL_SELECT_BLUE,
                 ISL_CHANNEL_SELECT_ALPHA },

then
    chans[ISL_CHANNEL_SELECT_ALPHA - ISL_CHANNEL_SELECT_RED] == chans[3] ==
    ISL_CHANNEL_SELECT_ALPHA

and so on, and the function returns the same swizzle as given?

> +}
> diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
> index da29baa..16412fc 100644
> --- a/src/intel/isl/isl.h
> +++ b/src/intel/isl/isl.h
> @@ -1686,6 +1686,8 @@ isl_swizzle_supports_rendering(const struct gen_device_info *devinfo,
>  
>  struct isl_swizzle
>  isl_swizzle_compose(struct isl_swizzle first, struct isl_swizzle second);
> +struct isl_swizzle
> +isl_swizzle_invert(struct isl_swizzle swizzle);
>  
>  #define isl_surf_init(dev, surf, ...) \
>     isl_surf_init_s((dev), (surf), \
> -- 
> 2.5.0.400.gff86faf
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list