diff options
-rw-r--r-- | src/compiler/shader_info.h | 3 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_nir.cpp | 35 |
2 files changed, 22 insertions, 16 deletions
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index cc33899ad3e..339aee551eb 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -162,6 +162,9 @@ typedef struct shader_info { /** Was this shader linked with any transform feedback varyings? */ bool has_transform_feedback_varyings; + /* Whether flrp has been lowered. */ + bool flrp_lowered; + /* SPV_KHR_float_controls: execution mode for floating point ops */ unsigned float_controls_execution_mode; diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index e7b5060cfa9..5aa47a42b2a 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -244,10 +244,6 @@ void st_nir_opts(nir_shader *nir) { bool progress; - unsigned lower_flrp = - (nir->options->lower_flrp16 ? 16 : 0) | - (nir->options->lower_flrp32 ? 32 : 0) | - (nir->options->lower_flrp64 ? 64 : 0); do { progress = false; @@ -290,23 +286,30 @@ st_nir_opts(nir_shader *nir) NIR_PASS(progress, nir, nir_opt_algebraic); NIR_PASS(progress, nir, nir_opt_constant_folding); - if (lower_flrp != 0) { - bool lower_flrp_progress = false; - - NIR_PASS(lower_flrp_progress, nir, nir_lower_flrp, - lower_flrp, - false /* always_precise */, - nir->options->lower_ffma); - if (lower_flrp_progress) { - NIR_PASS(progress, nir, - nir_opt_constant_folding); - progress = true; + 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 */, + nir->options->lower_ffma); + 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. */ - lower_flrp = 0; + nir->info.flrp_lowered = true; } NIR_PASS(progress, nir, nir_opt_undef); |