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