nir: add nir_variable::index and nir_index_vars
authorRhys Perry <pendingchaos02@gmail.com>
Fri, 15 Nov 2019 15:15:14 +0000 (15:15 +0000)
committerRhys Perry <pendingchaos02@gmail.com>
Wed, 20 Nov 2019 15:05:42 +0000 (15:05 +0000)
This will be useful as a deterministic identifier/index for the variable.

v2: fix comment style

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com> (v1)
src/compiler/nir/nir.c
src/compiler/nir/nir.h

index d7bdc7ed4cab5d7a9919e70c8d75e902b10870cd..8a100e18dd8e388ef6870953b7d15e08d910ce54 100644 (file)
@@ -1787,6 +1787,39 @@ nir_index_instrs(nir_function_impl *impl)
    return index;
 }
 
+static void
+index_var_list(struct exec_list *list)
+{
+   unsigned next_index = 0;
+   nir_foreach_variable(var, list)
+      var->index = next_index++;
+}
+
+void
+nir_index_vars(nir_shader *shader, nir_function_impl *impl, nir_variable_mode modes)
+{
+   if ((modes & nir_var_function_temp) && impl)
+      index_var_list(&impl->locals);
+
+   if (modes & nir_var_shader_temp)
+      index_var_list(&shader->globals);
+
+   if (modes & nir_var_shader_in)
+      index_var_list(&shader->inputs);
+
+   if (modes & nir_var_shader_out)
+      index_var_list(&shader->outputs);
+
+   if (modes & (nir_var_uniform | nir_var_mem_ubo | nir_var_mem_ssbo))
+      index_var_list(&shader->uniforms);
+
+   if (modes & nir_var_mem_shared)
+      index_var_list(&shader->shared);
+
+   if (modes & nir_var_system_value)
+      index_var_list(&shader->system_values);
+}
+
 static nir_instr *
 cursor_next_instr(nir_cursor cursor)
 {
index 4db85b3fafd60443af0bcc9c4c5ab5aac90c2469..e88d3f8df96371e515b76b7d15a99dd851d48f4e 100644 (file)
@@ -504,6 +504,12 @@ typedef struct nir_variable {
       };
    } data;
 
+   /**
+    * Identifier for this variable generated by nir_index_vars() that is unique
+    * among other variables in the same exec_list.
+    */
+   unsigned index;
+
    /* Number of nir_variable_data members */
    uint16_t num_members;
 
@@ -3340,6 +3346,8 @@ unsigned nir_index_instrs(nir_function_impl *impl);
 
 void nir_index_blocks(nir_function_impl *impl);
 
+void nir_index_vars(nir_shader *shader, nir_function_impl *impl, nir_variable_mode modes);
+
 void nir_print_shader(nir_shader *shader, FILE *fp);
 void nir_print_shader_annotated(nir_shader *shader, FILE *fp, struct hash_table *errors);
 void nir_print_instr(const nir_instr *instr, FILE *fp);