st/mesa: call nir_lower_flrp only once per shader
authorMarek Olšák <marek.olsak@amd.com>
Fri, 25 Oct 2019 04:15:37 +0000 (00:15 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 4 Nov 2019 21:49:44 +0000 (16:49 -0500)
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/compiler/shader_info.h
src/mesa/state_tracker/st_glsl_to_nir.cpp

index cc33899..339aee5 100644 (file)
@@ -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;
 
index e7b5060..5aa47a4 100644 (file)
@@ -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);