[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