<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 26, 2018 at 6:19 AM, Pohjolainen, Topi <span dir="ltr"><<a href="mailto:topi.pohjolainen@gmail.com" target="_blank">topi.pohjolainen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Fri, Jan 26, 2018 at 05:59:34PM -0800, Jason Ekstrand wrote:<br>
> ---<br>
>  src/intel/isl/isl.c | 30 ++++++++++++++++++++++++++++++<br>
>  src/intel/isl/isl.h |  2 ++<br>
>  2 files changed, 32 insertions(+)<br>
><br>
> diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c<br>
> index a2d3ae6..420d387 100644<br>
> --- a/src/intel/isl/isl.c<br>
> +++ b/src/intel/isl/isl.c<br>
> @@ -2379,3 +2379,33 @@ isl_swizzle_compose(struct isl_swizzle first, struct isl_swizzle second)<br>
>        .a = swizzle_select(first.a, second),<br>
>     };<br>
>  }<br>
> +<br>
> +/**<br>
> + * Returns a swizzle that is the pseudo-inverse of this swizzle.<br>
> + */<br>
> +struct isl_swizzle<br>
> +isl_swizzle_invert(struct isl_swizzle swizzle)<br>
> +{<br>
> +   /* Default to zero for channels which do not show up in the swizzle */<br>
> +   enum isl_channel_select chans[4] = {<br>
> +      ISL_CHANNEL_SELECT_ZERO,<br>
> +      ISL_CHANNEL_SELECT_ZERO,<br>
> +      ISL_CHANNEL_SELECT_ZERO,<br>
> +      ISL_CHANNEL_SELECT_ZERO,<br>
> +   };<br>
> +<br>
> +   /* We go in ABGR order so that, if there are any duplicates, the first one<br>
> +    * is taken if you look at it in RGBA order.  This is what Haswell hardware<br>
> +    * does for render target swizzles.<br>
> +    */<br>
> +   if ((unsigned)(swizzle.a - ISL_CHANNEL_SELECT_RED) < 4)<br>
> +      chans[swizzle.a - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_ALPHA;<br>
> +   if ((unsigned)(swizzle.b - ISL_CHANNEL_SELECT_RED) < 4)<br>
> +      chans[swizzle.b - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_BLUE;<br>
> +   if ((unsigned)(swizzle.g - ISL_CHANNEL_SELECT_RED) < 4)<br>
> +      chans[swizzle.g - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_GREEN;<br>
> +   if ((unsigned)(swizzle.r - ISL_CHANNEL_SELECT_RED) < 4)<br>
> +      chans[swizzle.r - ISL_CHANNEL_SELECT_RED] = ISL_CHANNEL_SELECT_RED;<br>
> +<br>
> +   return (struct isl_swizzle) { chans[0], chans[1], chans[2], chans[3] };<br>
<br>
</div></div>If given<br>
<br>
    swizzle == { ISL_CHANNEL_SELECT_RED,<br>
                 ISL_CHANNEL_SELECT_GREEN,<br>
                 ISL_CHANNEL_SELECT_BLUE,<br>
                 ISL_CHANNEL_SELECT_ALPHA },<br>
<br>
then<br>
    chans[ISL_CHANNEL_SELECT_ALPHA - ISL_CHANNEL_SELECT_RED] == chans[3] ==<br>
    ISL_CHANNEL_SELECT_ALPHA<br>
<br>
and so on, and the function returns the same swizzle as given?</blockquote><div><br></div><div>Yes, that is how the subtraction works.<br><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> +}<br>
> diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h<br>
> index da29baa..16412fc 100644<br>
> --- a/src/intel/isl/isl.h<br>
> +++ b/src/intel/isl/isl.h<br>
> @@ -1686,6 +1686,8 @@ isl_swizzle_supports_<wbr>rendering(const struct gen_device_info *devinfo,<br>
><br>
>  struct isl_swizzle<br>
>  isl_swizzle_compose(struct isl_swizzle first, struct isl_swizzle second);<br>
> +struct isl_swizzle<br>
> +isl_swizzle_invert(struct isl_swizzle swizzle);<br>
><br>
>  #define isl_surf_init(dev, surf, ...) \<br>
>     isl_surf_init_s((dev), (surf), \<br>
> --<br>
> 2.5.0.400.gff86faf<br>
><br>
</span>> ______________________________<wbr>_________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div></div>