[Mesa-dev] [PATCH v2 1/2] nir/lower_io: Return has_indirect flag from get_io_offset().

Jason Ekstrand jason at jlekstrand.net
Fri Oct 2 12:08:07 PDT 2015


On Thu, Oct 1, 2015 at 11:13 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> get_io_offset() already walks the dereference chain and discovers
> whether or not we have an indirect; we can just return that rather than
> computing it a second time.  This means moving the call a bit earlier.
>
> More importantly, I'm about to introduce special handling for the
> outermost array index, which would require changing the dereference
> we pass to deref_has_indirect().  Or we can just eliminate that.

I think I actually like what we did in nir_lower_samplers a bit
better.  There we just made indirect a nir_ssa_def* and NULL means no
indirect.  Since these passes all happen while we're in SSA form, that
works pretty well.  Thoughts?

> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/glsl/nir/nir_lower_io.c | 41 ++++++++++++++---------------------------
>  1 file changed, 14 insertions(+), 27 deletions(-)
>
> This replaces patches 3-5 of my recent 23 patch series:
>
> [PATCH 03/23] nir/lower_io: Switch on shader stage for inputs in load_op().
> [PATCH 04/23] nir/lower_io: Make get_io_offset take a nir_deref, not a nir_deref_var.
> [PATCH 05/23] nir: Introduce new nir_intrinsic_load_per_vertex_input intrinsics.
>
> diff --git a/src/glsl/nir/nir_lower_io.c b/src/glsl/nir/nir_lower_io.c
> index f32c09d..80967fc 100644
> --- a/src/glsl/nir/nir_lower_io.c
> +++ b/src/glsl/nir/nir_lower_io.c
> @@ -63,22 +63,9 @@ nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
>     *size = location;
>  }
>
> -static bool
> -deref_has_indirect(nir_deref_var *deref)
> -{
> -   for (nir_deref *tail = deref->deref.child; tail; tail = tail->child) {
> -      if (tail->deref_type == nir_deref_type_array) {
> -         nir_deref_array *arr = nir_deref_as_array(tail);
> -         if (arr->deref_array_type == nir_deref_array_type_indirect)
> -            return true;
> -      }
> -   }
> -
> -   return false;
> -}
> -
>  static unsigned
> -get_io_offset(nir_deref_var *deref, nir_instr *instr, nir_src *indirect,
> +get_io_offset(nir_deref_var *deref, nir_instr *instr,
> +              nir_src *indirect, bool *has_indirect,
>                struct lower_io_state *state)
>  {
>     bool found_indirect = false;
> @@ -122,6 +109,7 @@ get_io_offset(nir_deref_var *deref, nir_instr *instr, nir_src *indirect,
>        }
>     }
>
> +   *has_indirect = found_indirect;
>     return base_offset;
>  }
>
> @@ -169,17 +157,17 @@ nir_lower_io_block(nir_block *block, void *void_state)
>           if (mode != nir_var_shader_in && mode != nir_var_uniform)
>              continue;
>
> -         bool has_indirect = deref_has_indirect(intrin->variables[0]);
> +         nir_src indirect;
> +         bool has_indirect;
> +
> +         unsigned offset = get_io_offset(intrin->variables[0], &intrin->instr,
> +                                         &indirect, &has_indirect, state);
>
>           nir_intrinsic_instr *load =
>              nir_intrinsic_instr_create(state->mem_ctx,
>                                         load_op(mode, has_indirect));
>           load->num_components = intrin->num_components;
>
> -         nir_src indirect;
> -         unsigned offset = get_io_offset(intrin->variables[0],
> -                                         &intrin->instr, &indirect, state);
> -
>           unsigned location = intrin->variables[0]->var->data.driver_location;
>           if (mode == nir_var_uniform) {
>              load->const_index[0] = location;
> @@ -209,7 +197,12 @@ nir_lower_io_block(nir_block *block, void *void_state)
>           if (intrin->variables[0]->var->data.mode != nir_var_shader_out)
>              continue;
>
> -         bool has_indirect = deref_has_indirect(intrin->variables[0]);
> +         nir_src indirect;
> +         bool has_indirect;
> +
> +         unsigned offset = get_io_offset(intrin->variables[0], &intrin->instr,
> +                                         &indirect, &has_indirect, state);
> +         offset += intrin->variables[0]->var->data.driver_location;
>
>           nir_intrinsic_op store_op;
>           if (has_indirect) {
> @@ -221,12 +214,6 @@ nir_lower_io_block(nir_block *block, void *void_state)
>           nir_intrinsic_instr *store = nir_intrinsic_instr_create(state->mem_ctx,
>                                                                   store_op);
>           store->num_components = intrin->num_components;
> -
> -         nir_src indirect;
> -         unsigned offset = get_io_offset(intrin->variables[0],
> -                                         &intrin->instr, &indirect, state);
> -         offset += intrin->variables[0]->var->data.driver_location;
> -
>           store->const_index[0] = offset;
>
>           nir_src_copy(&store->src[0], &intrin->src[0], store);
> --
> 2.5.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list