On Mon, Feb 26, 2018 at 6:19 AM, Pohjolainen, Topi <
topi.pohjolai...@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@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to