[Mesa-dev] [Freedreno] [PATCH 1/2] nir: allow texture offsets with cube maps

Jason Ekstrand jason at jlekstrand.net
Tue Nov 21 01:04:21 UTC 2017


On Mon, Nov 20, 2017 at 4:10 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:

> On Mon, Nov 20, 2017 at 7:08 PM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> > On Mon, Nov 20, 2017 at 3:11 PM, Ilia Mirkin <imirkin at alum.mit.edu>
> wrote:
> >>
> >> On Mon, Nov 20, 2017 at 5:16 PM, Jason Ekstrand <jason at jlekstrand.net>
> >> wrote:
> >> > On Sun, Nov 19, 2017 at 11:54 AM, Ilia Mirkin <imirkin at alum.mit.edu>
> >> > wrote:
> >> >>
> >> >> GL doesn't have this, but some hardware supports it. This is
> convenient
> >> >> for lowering tg4 to plain texture calls, which is necessary on Adreno
> >> >> A4xx hardware.
> >> >>
> >> >> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> >> >> ---
> >> >>  src/compiler/nir/nir.h | 15 +++++++++++++--
> >> >>  1 file changed, 13 insertions(+), 2 deletions(-)
> >> >>
> >> >> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> >> >> index f46f6147110..64965ae16d6 100644
> >> >> --- a/src/compiler/nir/nir.h
> >> >> +++ b/src/compiler/nir/nir.h
> >> >> @@ -1364,8 +1364,7 @@ nir_tex_instr_src_size(const nir_tex_instr
> >> >> *instr,
> >> >> unsigned src)
> >> >>     if (instr->src[src].src_type == nir_tex_src_ms_mcs)
> >> >>        return 4;
> >> >>
> >> >> -   if (instr->src[src].src_type == nir_tex_src_offset ||
> >> >> -       instr->src[src].src_type == nir_tex_src_ddx ||
> >> >> +   if (instr->src[src].src_type == nir_tex_src_ddx ||
> >> >>         instr->src[src].src_type == nir_tex_src_ddy) {
> >> >>        if (instr->is_array)
> >> >>           return instr->coord_components - 1;
> >> >> @@ -1373,6 +1372,18 @@ nir_tex_instr_src_size(const nir_tex_instr
> >> >> *instr,
> >> >> unsigned src)
> >> >>           return instr->coord_components;
> >> >>     }
> >> >>
> >> >> +   /* Usual APIs don't allow cube + offset, but we allow it, with 2
> >> >> coords for
> >> >> +    * the offset, since a cube maps to a single face.
> >> >> +    */
> >> >> +   if (instr->src[src].src_type == nir_tex_src_offset) {
> >> >> +      unsigned ret = instr->coord_components;
> >> >> +      if (instr->is_array)
> >> >> +         ret--;
> >> >> +      if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE)
> >> >> +         ret--;
> >> >> +      return ret;
> >> >
> >> >
> >> > I think I'd rather this look more like the one above:
> >> >
> >> > if (instr->is_array)
> >> >    return instr->coord_components;
> >> > else if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE)
> >> >    return 2;
> >> > else
> >> >    return instr->coord_components - 1;
> >> >
> >> > It seems a bit cleaner and/or more explicit to me.
> >>
> >> OK. Although your version is slightly wrong, but I get the idea. Will
> >> do that in a v2. (array should get -1, and cube should always get 2
> >> even if it's an array)
> >
> >
> > I'd forgotten about cube arrays, yes, those would naturally be -2.  In
> that
> > case, maybe -- for each subtraction is a good idea...
>
> Well, rearranging it, we get
>
> if (instr->sampler_dim == CUBE)
>   return 2;
> else if (instr->is_array)
>   return comp - 1;
> else
>   return comp;
>

Right.  With that if-ladder,

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171120/8050ce8f/attachment-0001.html>


More information about the mesa-dev mailing list