intel/nir: Break the linking code into a helper in brw_nir.c

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
Cc: mesa-stable@lists.freedesktop.org
diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c
index 821c38a..3f11fb7 100644
--- a/src/intel/compiler/brw_nir.c
+++ b/src/intel/compiler/brw_nir.c
@@ -675,6 +675,38 @@
    return nir;
 }
 
+void
+brw_nir_link_shaders(const struct brw_compiler *compiler,
+                     nir_shader **producer, nir_shader **consumer)
+{
+   NIR_PASS_V(*producer, nir_remove_dead_variables, nir_var_shader_out);
+   NIR_PASS_V(*consumer, nir_remove_dead_variables, nir_var_shader_in);
+
+   if (nir_remove_unused_varyings(*producer, *consumer)) {
+      NIR_PASS_V(*producer, nir_lower_global_vars_to_local);
+      NIR_PASS_V(*consumer, nir_lower_global_vars_to_local);
+
+      nir_variable_mode indirect_mask = (nir_variable_mode) 0;
+      if (compiler->glsl_compiler_options[(*producer)->info.stage].EmitNoIndirectTemp)
+         indirect_mask = nir_var_local;
+
+      /* The backend might not be able to handle indirects on
+       * temporaries so we need to lower indirects on any of the
+       * varyings we have demoted here.
+       */
+      NIR_PASS_V(*producer, nir_lower_indirect_derefs, indirect_mask);
+      NIR_PASS_V(*consumer, nir_lower_indirect_derefs, indirect_mask);
+
+      const bool p_is_scalar =
+         compiler->scalar_stage[(*producer)->info.stage];
+      *producer = brw_nir_optimize(*producer, compiler, p_is_scalar);
+
+      const bool c_is_scalar =
+         compiler->scalar_stage[(*producer)->info.stage];
+      *consumer = brw_nir_optimize(*consumer, compiler, c_is_scalar);
+   }
+}
+
 /* Prepare the given shader for codegen
  *
  * This function is intended to be called right before going into the actual
diff --git a/src/intel/compiler/brw_nir.h b/src/intel/compiler/brw_nir.h
index 0118cfa..e9cb6f8 100644
--- a/src/intel/compiler/brw_nir.h
+++ b/src/intel/compiler/brw_nir.h
@@ -95,6 +95,10 @@
 nir_shader *brw_preprocess_nir(const struct brw_compiler *compiler,
                                nir_shader *nir);
 
+void
+brw_nir_link_shaders(const struct brw_compiler *compiler,
+                     nir_shader **producer, nir_shader **consumer);
+
 bool brw_nir_lower_cs_intrinsics(nir_shader *nir,
                                  unsigned dispatch_width);
 void brw_nir_lower_vs_inputs(nir_shader *nir,
diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp
index 6ac4ecc..24545d5 100644
--- a/src/mesa/drivers/dri/i965/brw_link.cpp
+++ b/src/mesa/drivers/dri/i965/brw_link.cpp
@@ -282,40 +282,10 @@
           if (shProg->_LinkedShaders[i] == NULL)
              continue;
 
-            nir_shader *producer = shProg->_LinkedShaders[i]->Program->nir;
-            nir_shader *consumer = shProg->_LinkedShaders[next]->Program->nir;
-
-            NIR_PASS_V(producer, nir_remove_dead_variables, nir_var_shader_out);
-            NIR_PASS_V(consumer, nir_remove_dead_variables, nir_var_shader_in);
-
-            if (nir_remove_unused_varyings(producer, consumer)) {
-               NIR_PASS_V(producer, nir_lower_global_vars_to_local);
-               NIR_PASS_V(consumer, nir_lower_global_vars_to_local);
-
-               nir_variable_mode indirect_mask = (nir_variable_mode) 0;
-               if (compiler->glsl_compiler_options[i].EmitNoIndirectTemp)
-                  indirect_mask = (nir_variable_mode) nir_var_local;
-
-               /* The backend might not be able to handle indirects on
-                * temporaries so we need to lower indirects on any of the
-                * varyings we have demoted here.
-                */
-               NIR_PASS_V(producer, nir_lower_indirect_derefs, indirect_mask);
-               NIR_PASS_V(consumer, nir_lower_indirect_derefs, indirect_mask);
-
-               const bool p_is_scalar =
-                  compiler->scalar_stage[producer->info.stage];
-               producer = brw_nir_optimize(producer, compiler, p_is_scalar);
-
-               const bool c_is_scalar =
-                  compiler->scalar_stage[producer->info.stage];
-               consumer = brw_nir_optimize(consumer, compiler, c_is_scalar);
-            }
-
-            shProg->_LinkedShaders[i]->Program->nir = producer;
-            shProg->_LinkedShaders[next]->Program->nir = consumer;
-
-            next = i;
+          brw_nir_link_shaders(compiler,
+                               &shProg->_LinkedShaders[i]->Program->nir,
+                               &shProg->_LinkedShaders[next]->Program->nir);
+          next = i;
        }
     }