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