[Mesa-dev] [PATCH] st/glsl_to_nir: add more nir opts to st_nir_opts()

Timothy Arceri tarceri at itsqueeze.com
Wed Jan 31 02:00:47 UTC 2018


I forgot to add that adding the opts also required some of the lowering 
passes to be called slightly earlier.

On 31/01/18 12:58, Timothy Arceri wrote:
> All of the current gallium nir driver use these optimisations but
> they do so in their backends. Having these called in the backend
> only can cause a number of problems:
> 
> - Shader compile times are greater because the opts need to do
>    significant passes over all shader variants.
> - The shader cache is partially defeated due to the significant
>    optimisation passes over variants.
> - We might miss out on nir linking optimisation opportunities.
> 
> Adding these passes to st_nir_opts() alleviates these problems.
> ---
>   src/mesa/state_tracker/st_glsl_to_nir.cpp | 36 +++++++++++++++++--------------
>   1 file changed, 20 insertions(+), 16 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index 65931bfa33..b9ac9fafc2 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -270,6 +270,10 @@ st_nir_opts(nir_shader *nir)
>      do {
>         progress = false;
>   
> +      NIR_PASS_V(nir, nir_lower_vars_to_ssa);
> +      NIR_PASS_V(nir, nir_lower_alu_to_scalar);
> +      NIR_PASS_V(nir, nir_lower_phis_to_scalar);
> +
>         NIR_PASS_V(nir, nir_lower_64bit_pack);
>         NIR_PASS(progress, nir, nir_copy_prop);
>         NIR_PASS(progress, nir, nir_opt_remove_phis);
> @@ -317,6 +321,22 @@ st_glsl_to_nir(struct st_context *st, struct gl_program *prog,
>         (nir_variable_mode) (nir_var_shader_in | nir_var_shader_out);
>      nir_remove_dead_variables(nir, mask);
>   
> +   if (options->lower_all_io_to_temps ||
> +       nir->info.stage == MESA_SHADER_VERTEX ||
> +       nir->info.stage == MESA_SHADER_GEOMETRY) {
> +      NIR_PASS_V(nir, nir_lower_io_to_temporaries,
> +                 nir_shader_get_entrypoint(nir),
> +                 true, true);
> +   } else if (nir->info.stage == MESA_SHADER_FRAGMENT) {
> +      NIR_PASS_V(nir, nir_lower_io_to_temporaries,
> +                 nir_shader_get_entrypoint(nir),
> +                 true, false);
> +   }
> +
> +   NIR_PASS_V(nir, nir_lower_global_vars_to_local);
> +   NIR_PASS_V(nir, nir_split_var_copies);
> +   NIR_PASS_V(nir, nir_lower_var_copies);
> +
>      st_nir_opts(nir);
>   
>      return nir;
> @@ -481,22 +501,6 @@ st_nir_get_mesa_program(struct gl_context *ctx,
>   
>      set_st_program(prog, shader_program, nir);
>      prog->nir = nir;
> -
> -   if (options->lower_all_io_to_temps ||
> -       nir->info.stage == MESA_SHADER_VERTEX ||
> -       nir->info.stage == MESA_SHADER_GEOMETRY) {
> -      NIR_PASS_V(nir, nir_lower_io_to_temporaries,
> -                 nir_shader_get_entrypoint(nir),
> -                 true, true);
> -   } else if (nir->info.stage == MESA_SHADER_FRAGMENT) {
> -      NIR_PASS_V(nir, nir_lower_io_to_temporaries,
> -                 nir_shader_get_entrypoint(nir),
> -                 true, false);
> -   }
> -
> -   NIR_PASS_V(nir, nir_lower_global_vars_to_local);
> -   NIR_PASS_V(nir, nir_split_var_copies);
> -   NIR_PASS_V(nir, nir_lower_var_copies);
>   }
>   
>   static void
> 


More information about the mesa-dev mailing list