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

Marek Olšák maraeo at gmail.com
Wed Jan 31 20:16:27 UTC 2018


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Jan 31, 2018 at 3:00 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> 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
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list