linker: Refactor code that builds hash tables of varyings during linking
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 2 Oct 2013 22:39:45 +0000 (15:39 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 2 May 2014 14:19:39 +0000 (07:19 -0700)
I want to make some changes to this code, but first I want to make some
unit tests for it... so that I can capture the pre- and
post-invariants.  Pulling the code out into its own function in a
non-anonymous namespace enables that.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/link_varyings.cpp

index adb23593b65a29d93f4a317b30e21e1a335202d7..3a6dfc87148728f11b526377bee066f8f8c35b6c 100644 (file)
@@ -1036,6 +1036,34 @@ private:
 };
 
 
+namespace linker {
+
+void
+populate_consumer_input_sets(void *mem_ctx, exec_list *ir,
+                             hash_table *consumer_inputs,
+                             hash_table *consumer_interface_inputs)
+{
+   foreach_list(node, ir) {
+      ir_variable *const input_var = ((ir_instruction *) node)->as_variable();
+
+      if ((input_var != NULL) && (input_var->data.mode == ir_var_shader_in)) {
+         if (input_var->get_interface_type() != NULL) {
+            char *const iface_field_name =
+               ralloc_asprintf(mem_ctx, "%s.%s",
+                               input_var->get_interface_type()->name,
+                               input_var->name);
+            hash_table_insert(consumer_interface_inputs, input_var,
+                              iface_field_name);
+         } else {
+            hash_table_insert(consumer_inputs, input_var,
+                              ralloc_strdup(mem_ctx, input_var->name));
+         }
+      }
+   }
+}
+
+}
+
 /**
  * Assign locations for all variables that are produced in one pipeline stage
  * (the "producer") and consumed in the next stage (the "consumer").
@@ -1088,26 +1116,11 @@ assign_varying_locations(struct gl_context *ctx,
     *    not being inputs.  This lets the optimizer eliminate them.
     */
 
-   if (consumer) {
-      foreach_list(node, consumer->ir) {
-         ir_variable *const input_var =
-            ((ir_instruction *) node)->as_variable();
-
-         if ((input_var != NULL) && (input_var->data.mode == ir_var_shader_in)) {
-            if (input_var->get_interface_type() != NULL) {
-               char *const iface_field_name =
-                  ralloc_asprintf(mem_ctx, "%s.%s",
-                                  input_var->get_interface_type()->name,
-                                  input_var->name);
-               hash_table_insert(consumer_interface_inputs, input_var,
-                                 iface_field_name);
-            } else {
-               hash_table_insert(consumer_inputs, input_var,
-                                 ralloc_strdup(mem_ctx, input_var->name));
-            }
-         }
-      }
-   }
+   if (consumer)
+      linker::populate_consumer_input_sets(mem_ctx,
+                                           consumer->ir,
+                                           consumer_inputs,
+                                           consumer_interface_inputs);
 
    foreach_list(node, producer->ir) {
       ir_variable *const output_var = ((ir_instruction *) node)->as_variable();