From 3634dca99a44a2812b4284037eecfadfc794240a Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Thu, 17 Oct 2019 21:03:34 -0400 Subject: st/mesa: move some NIR lowering before shader caching Reviewed-by: Kenneth Graunke --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 19 +++++-------------- src/mesa/state_tracker/st_program.c | 15 +++++++++++++++ src/mesa/state_tracker/st_program.h | 3 +++ 3 files changed, 23 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 43459d46b57..0e5bdaea59d 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -486,6 +486,11 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, nir_variable_mode mask = nir_var_function_temp; nir_remove_dead_variables(nir, mask); + NIR_PASS_V(nir, nir_lower_atomics_to_ssbo, + st->ctx->Const.Program[nir->info.stage].MaxAtomicBuffers); + + st_finalize_nir_before_variants(nir); + if (st->ctx->_Shader->Flags & GLSL_DUMP) { _mesa_log("\n"); _mesa_log("NIR IR for linked %s program %d:\n", @@ -899,25 +904,11 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, struct gl_shader_program *shader_program, nir_shader *nir) { struct pipe_screen *screen = st->pipe->screen; - const nir_shader_compiler_options *options = - st->ctx->Const.ShaderCompilerOptions[prog->info.stage].NirOptions; NIR_PASS_V(nir, nir_split_var_copies); NIR_PASS_V(nir, nir_lower_var_copies); - if (options->lower_all_io_to_temps || - options->lower_all_io_to_elements || - nir->info.stage == MESA_SHADER_VERTEX || - nir->info.stage == MESA_SHADER_GEOMETRY) { - NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, false); - } else if (nir->info.stage == MESA_SHADER_FRAGMENT) { - NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, true); - } st_nir_assign_varying_locations(st, nir); - - NIR_PASS_V(nir, nir_lower_atomics_to_ssbo, - st->ctx->Const.Program[nir->info.stage].MaxAtomicBuffers); - st_nir_assign_uniform_locations(st->ctx, prog, &nir->uniforms); diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 684599e4ef5..e60a9924f81 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -387,6 +387,20 @@ st_release_common_variants(struct st_context *st, struct st_common_program *p) delete_ir(&p->state); } +void +st_finalize_nir_before_variants(struct nir_shader *nir) +{ + NIR_PASS_V(nir, nir_split_var_copies); + NIR_PASS_V(nir, nir_lower_var_copies); + if (nir->options->lower_all_io_to_temps || + nir->options->lower_all_io_to_elements || + nir->info.stage == MESA_SHADER_VERTEX || + nir->info.stage == MESA_SHADER_GEOMETRY) { + NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, false); + } else if (nir->info.stage == MESA_SHADER_FRAGMENT) { + NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, true); + } +} /** * Translate ARB (asm) program to NIR @@ -409,6 +423,7 @@ st_translate_prog_to_nir(struct st_context *st, struct gl_program *prog, /* Optimise NIR */ NIR_PASS_V(nir, nir_opt_constant_folding); st_nir_opts(nir); + st_finalize_nir_before_variants(nir); nir_validate_shader(nir, "after st/ptn NIR opts"); return nir; diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index d698e7b633f..90a77b9c17b 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -355,6 +355,9 @@ st_release_common_variants(struct st_context *st, struct st_common_program *p); extern void st_destroy_program_variants(struct st_context *st); +extern void +st_finalize_nir_before_variants(struct nir_shader *nir); + extern void st_prepare_vertex_program(struct st_vertex_program *stvp); -- cgit v1.2.3