[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