[Mesa-dev] [PATCH 01/23] nir: Allow nir_lower_io() to only lower one type of variable.

Matt Turner mattst88 at gmail.com
Wed Sep 30 10:13:25 PDT 2015


On Wed, Sep 30, 2015 at 12:58 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> We may want to use different type_size functions for (e.g.) inputs
> vs. uniforms.  Passing in -1 for mode ignores this, handling all
> modes as before.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/glsl/nir/nir.h                  |  1 +
>  src/glsl/nir/nir_lower_io.c         | 21 +++++++++++++++++----
>  src/mesa/drivers/dri/i965/brw_nir.c |  4 ++--
>  3 files changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
> index d0c7b04..bf5d41d 100644
> --- a/src/glsl/nir/nir.h
> +++ b/src/glsl/nir/nir.h
> @@ -1822,6 +1822,7 @@ void nir_assign_var_locations(struct exec_list *var_list,
>                                int (*type_size)(const struct glsl_type *));
>
>  void nir_lower_io(nir_shader *shader,
> +                  nir_variable_mode mode,
>                    int (*type_size)(const struct glsl_type *));
>  void nir_lower_vars_to_ssa(nir_shader *shader);
>
> diff --git a/src/glsl/nir/nir_lower_io.c b/src/glsl/nir/nir_lower_io.c
> index 9f79c56..6072682 100644
> --- a/src/glsl/nir/nir_lower_io.c
> +++ b/src/glsl/nir/nir_lower_io.c
> @@ -38,6 +38,7 @@ struct lower_io_state {
>     nir_builder builder;
>     void *mem_ctx;
>     int (*type_size)(const struct glsl_type *type);
> +   nir_variable_mode mode;
>  };
>
>  void
> @@ -154,9 +155,17 @@ nir_lower_io_block(nir_block *block, void *void_state)
>
>        nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
>
> +      if (intrin->intrinsic != nir_intrinsic_load_var &&
> +          intrin->intrinsic != nir_intrinsic_store_var)
> +         continue;
> +
> +      nir_variable_mode mode = intrin->variables[0]->var->data.mode;
> +
> +      if (state->mode != -1 && state->mode != mode)
> +         continue;
> +
>        switch (intrin->intrinsic) {
>        case nir_intrinsic_load_var: {
> -         nir_variable_mode mode = intrin->variables[0]->var->data.mode;
>           if (mode != nir_var_shader_in && mode != nir_var_uniform)
>              continue;
>
> @@ -239,12 +248,15 @@ nir_lower_io_block(nir_block *block, void *void_state)
>  }
>
>  static void
> -nir_lower_io_impl(nir_function_impl *impl, int(*type_size)(const struct glsl_type *))
> +nir_lower_io_impl(nir_function_impl *impl,
> +                  nir_variable_mode mode,
> +                  int(*type_size)(const struct glsl_type *))

I see that the original code was like this, but I've always seen a
space after the return type in function pointers.

>  {
>     struct lower_io_state state;
>
>     nir_builder_init(&state.builder, impl);
>     state.mem_ctx = ralloc_parent(impl);
> +   state.mode = mode;
>     state.type_size = type_size;
>
>     nir_foreach_block(impl, nir_lower_io_block, &state);
> @@ -254,10 +266,11 @@ nir_lower_io_impl(nir_function_impl *impl, int(*type_size)(const struct glsl_typ
>  }
>
>  void
> -nir_lower_io(nir_shader *shader, int(*type_size)(const struct glsl_type *))
> +nir_lower_io(nir_shader *shader, nir_variable_mode mode,
> +             int(*type_size)(const struct glsl_type *))

Here as well.


More information about the mesa-dev mailing list