glsl/st: move st_nir_opts() into gl compiler common code
This will allow us to use this in future NIR linker work. It also makes more sense to move it here as the classic drivers are gone, tgsi is going away and we are merging more of the st into the gl common code. Reviewed-by: Emma Anholt <emma@anholt.net> Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14785>
This commit is contained in:

committed by
Marge Bot

parent
665ee002c3
commit
bfa096a0b9
@@ -36,6 +36,87 @@
|
||||
* the counter-part glsl/linker.cpp
|
||||
*/
|
||||
|
||||
void
|
||||
gl_nir_opts(nir_shader *nir)
|
||||
{
|
||||
bool progress;
|
||||
|
||||
do {
|
||||
progress = false;
|
||||
|
||||
NIR_PASS_V(nir, nir_lower_vars_to_ssa);
|
||||
|
||||
/* Linking deals with unused inputs/outputs, but here we can remove
|
||||
* things local to the shader in the hopes that we can cleanup other
|
||||
* things. This pass will also remove variables with only stores, so we
|
||||
* might be able to make progress after it.
|
||||
*/
|
||||
NIR_PASS(progress, nir, nir_remove_dead_variables,
|
||||
nir_var_function_temp | nir_var_shader_temp |
|
||||
nir_var_mem_shared,
|
||||
NULL);
|
||||
|
||||
NIR_PASS(progress, nir, nir_opt_copy_prop_vars);
|
||||
NIR_PASS(progress, nir, nir_opt_dead_write_vars);
|
||||
|
||||
if (nir->options->lower_to_scalar) {
|
||||
NIR_PASS_V(nir, nir_lower_alu_to_scalar,
|
||||
nir->options->lower_to_scalar_filter, NULL);
|
||||
NIR_PASS_V(nir, nir_lower_phis_to_scalar, false);
|
||||
}
|
||||
|
||||
NIR_PASS_V(nir, nir_lower_alu);
|
||||
NIR_PASS_V(nir, nir_lower_pack);
|
||||
NIR_PASS(progress, nir, nir_copy_prop);
|
||||
NIR_PASS(progress, nir, nir_opt_remove_phis);
|
||||
NIR_PASS(progress, nir, nir_opt_dce);
|
||||
if (nir_opt_trivial_continues(nir)) {
|
||||
progress = true;
|
||||
NIR_PASS(progress, nir, nir_copy_prop);
|
||||
NIR_PASS(progress, nir, nir_opt_dce);
|
||||
}
|
||||
NIR_PASS(progress, nir, nir_opt_if, false);
|
||||
NIR_PASS(progress, nir, nir_opt_dead_cf);
|
||||
NIR_PASS(progress, nir, nir_opt_cse);
|
||||
NIR_PASS(progress, nir, nir_opt_peephole_select, 8, true, true);
|
||||
|
||||
NIR_PASS(progress, nir, nir_opt_phi_precision);
|
||||
NIR_PASS(progress, nir, nir_opt_algebraic);
|
||||
NIR_PASS(progress, nir, nir_opt_constant_folding);
|
||||
|
||||
if (!nir->info.flrp_lowered) {
|
||||
unsigned lower_flrp =
|
||||
(nir->options->lower_flrp16 ? 16 : 0) |
|
||||
(nir->options->lower_flrp32 ? 32 : 0) |
|
||||
(nir->options->lower_flrp64 ? 64 : 0);
|
||||
|
||||
if (lower_flrp) {
|
||||
bool lower_flrp_progress = false;
|
||||
|
||||
NIR_PASS(lower_flrp_progress, nir, nir_lower_flrp,
|
||||
lower_flrp,
|
||||
false /* always_precise */);
|
||||
if (lower_flrp_progress) {
|
||||
NIR_PASS(progress, nir,
|
||||
nir_opt_constant_folding);
|
||||
progress = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Nothing should rematerialize any flrps, so we only need to do this
|
||||
* lowering once.
|
||||
*/
|
||||
nir->info.flrp_lowered = true;
|
||||
}
|
||||
|
||||
NIR_PASS(progress, nir, nir_opt_undef);
|
||||
NIR_PASS(progress, nir, nir_opt_conditional_discard);
|
||||
if (nir->options->max_unroll_iterations) {
|
||||
NIR_PASS(progress, nir, nir_opt_loop_unroll);
|
||||
}
|
||||
} while (progress);
|
||||
}
|
||||
|
||||
static bool
|
||||
can_remove_uniform(nir_variable *var, UNUSED void *data)
|
||||
{
|
||||
|
Reference in New Issue
Block a user