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

Jason Ekstrand jason at jlekstrand.net
Mon Feb 26 16:42:42 UTC 2018


On Mon, Feb 26, 2018 at 6:19 AM, Pohjolainen, Topi <
topi.pohjolainen at gmail.com> wrote:

> 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?


Yes, that is how the subtraction works.

--Jason


>
> > +}
> > 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180226/4aadfdba/attachment.html>


More information about the mesa-dev mailing list