nir: Use a list instead of a hash_table for inputs, outputs, and uniforms
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 18 Mar 2015 19:34:09 +0000 (12:34 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 19 Mar 2015 20:18:38 +0000 (13:18 -0700)
We never did a single hash table lookup in the entire NIR code base that I
found so there was no real benifit to doing it that way.  I suppose that
for linking, we'll probably want to be able to lookup by name but we can
leave building that hash table to the linker.  In the mean time this was
causing problems with GLSL IR -> NIR because GLSL IR doesn't guarantee us
unique names of uniforms, etc.  This was causing massive rendering isues in
the unreal4 Sun Temple demo.

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/glsl/nir/glsl_to_nir.cpp
src/glsl/nir/nir.c
src/glsl/nir/nir.h
src/glsl/nir/nir_lower_io.c
src/glsl/nir/nir_print.c
src/glsl/nir/nir_validate.c
src/mesa/drivers/dri/i965/brw_fs_nir.cpp

index 047cb51e85d93ff9470269e520dbbf5ebeae4ce8..357944da64ab570bbc9b02df73e198d507bb028a 100644 (file)
@@ -352,15 +352,15 @@ nir_visitor::visit(ir_variable *ir)
       break;
 
    case nir_var_shader_in:
-      _mesa_hash_table_insert(shader->inputs, var->name, var);
+      exec_list_push_tail(&shader->inputs, &var->node);
       break;
 
    case nir_var_shader_out:
-      _mesa_hash_table_insert(shader->outputs, var->name, var);
+      exec_list_push_tail(&shader->outputs, &var->node);
       break;
 
    case nir_var_uniform:
-      _mesa_hash_table_insert(shader->uniforms, var->name, var);
+      exec_list_push_tail(&shader->uniforms, &var->node);
       break;
 
    case nir_var_system_value:
index abad3f8883b8e20406ac0ef1b759496210cf5dbd..6459d5108260990ff7cb2bae576a2b6e78f2c4fb 100644 (file)
@@ -33,12 +33,9 @@ nir_shader_create(void *mem_ctx, const nir_shader_compiler_options *options)
 {
    nir_shader *shader = ralloc(mem_ctx, nir_shader);
 
-   shader->uniforms = _mesa_hash_table_create(shader, _mesa_key_hash_string,
-                                              _mesa_key_string_equal);
-   shader->inputs = _mesa_hash_table_create(shader, _mesa_key_hash_string,
-                                            _mesa_key_string_equal);
-   shader->outputs = _mesa_hash_table_create(shader, _mesa_key_hash_string,
-                                             _mesa_key_string_equal);
+   exec_list_make_empty(&shader->uniforms);
+   exec_list_make_empty(&shader->inputs);
+   exec_list_make_empty(&shader->outputs);
 
    shader->options = options;
 
index 669a26ed24d67cb329557bac3631a2cf7194c290..6b42df953da7360ee37d249aaedfae91b816c472 100644 (file)
@@ -1380,13 +1380,13 @@ typedef struct nir_shader_compiler_options {
 
 typedef struct nir_shader {
    /** hash table of name -> uniform nir_variable */
-   struct hash_table *uniforms;
+   struct exec_list uniforms;
 
    /** hash table of name -> input nir_variable */
-   struct hash_table *inputs;
+   struct exec_list inputs;
 
    /** hash table of name -> output nir_variable */
-   struct hash_table *outputs;
+   struct exec_list outputs;
 
    /** Set of driver-specific options for the shader.
     *
index 207f8daa1bc8414adf4b298bd650004630ef1908..37c357e893ba9fb2e2206b925d08287f92b7ab62 100644 (file)
@@ -77,14 +77,11 @@ type_size(const struct glsl_type *type)
 }
 
 static void
-assign_var_locations(struct hash_table *ht, unsigned *size)
+assign_var_locations(struct exec_list *var_list, unsigned *size)
 {
    unsigned location = 0;
 
-   struct hash_entry *entry;
-   hash_table_foreach(ht, entry) {
-      nir_variable *var = (nir_variable *) entry->data;
-
+   foreach_list_typed(nir_variable, var, node, var_list) {
       /*
        * UBO's have their own address spaces, so don't count them towards the
        * number of global uniforms
@@ -102,9 +99,9 @@ assign_var_locations(struct hash_table *ht, unsigned *size)
 static void
 assign_var_locations_shader(nir_shader *shader)
 {
-   assign_var_locations(shader->inputs, &shader->num_inputs);
-   assign_var_locations(shader->outputs, &shader->num_outputs);
-   assign_var_locations(shader->uniforms, &shader->num_uniforms);
+   assign_var_locations(&shader->inputs, &shader->num_inputs);
+   assign_var_locations(&shader->outputs, &shader->num_outputs);
+   assign_var_locations(&shader->uniforms, &shader->num_uniforms);
 }
 
 static bool
index f8b14a149d325651481d6362aaa633e768263436..fa11a312e51155c5f725551fdff7b7e11c6efc03 100644 (file)
@@ -844,18 +844,16 @@ nir_print_shader(nir_shader *shader, FILE *fp)
    print_var_state state;
    init_print_state(&state);
 
-   struct hash_entry *entry;
-
-   hash_table_foreach(shader->uniforms, entry) {
-      print_var_decl((nir_variable *) entry->data, &state, fp);
+   foreach_list_typed(nir_variable, var, node, &shader->uniforms) {
+      print_var_decl(var, &state, fp);
    }
 
-   hash_table_foreach(shader->inputs, entry) {
-      print_var_decl((nir_variable *) entry->data, &state, fp);
+   foreach_list_typed(nir_variable, var, node, &shader->inputs) {
+      print_var_decl(var, &state, fp);
    }
 
-   hash_table_foreach(shader->outputs, entry) {
-      print_var_decl((nir_variable *) entry->data, &state, fp);
+   foreach_list_typed(nir_variable, var, node, &shader->outputs) {
+      print_var_decl(var, &state, fp);
    }
 
    foreach_list_typed(nir_variable, var, node, &shader->globals) {
index a3fe9d62077d3349bb976d3cc012cd924cc6663e..f247ae0691cf094f376ae27af804d821fdd02568 100644 (file)
@@ -931,17 +931,19 @@ nir_validate_shader(nir_shader *shader)
 
    state.shader = shader;
 
-   struct hash_entry *entry;
-   hash_table_foreach(shader->uniforms, entry) {
-      validate_var_decl((nir_variable *) entry->data, true, &state);
+   exec_list_validate(&shader->uniforms);
+   foreach_list_typed(nir_variable, var, node, &shader->uniforms) {
+      validate_var_decl(var, true, &state);
    }
 
-   hash_table_foreach(shader->inputs, entry) {
-     validate_var_decl((nir_variable *) entry->data, true, &state);
+   exec_list_validate(&shader->inputs);
+   foreach_list_typed(nir_variable, var, node, &shader->inputs) {
+     validate_var_decl(var, true, &state);
    }
 
-   hash_table_foreach(shader->outputs, entry) {
-      validate_var_decl((nir_variable *) entry->data, true, &state);
+   exec_list_validate(&shader->outputs);
+   foreach_list_typed(nir_variable, var, node, &shader->outputs) {
+     validate_var_decl(var, true, &state);
    }
 
    exec_list_validate(&shader->globals);
index a9e75ab55fa26c4f92aebc16aabcefd3f15a5c55..9431e5dd74e1c40c75c3204e2aee1037a154bd14 100644 (file)
@@ -196,9 +196,7 @@ fs_visitor::emit_nir_code()
 void
 fs_visitor::nir_setup_inputs(nir_shader *shader)
 {
-   struct hash_entry *entry;
-   hash_table_foreach(shader->inputs, entry) {
-      nir_variable *var = (nir_variable *) entry->data;
+   foreach_list_typed(nir_variable, var, node, &shader->inputs) {
       enum brw_reg_type type = brw_type_for_base_type(var->type);
       fs_reg input = offset(nir_inputs, var->data.driver_location);
 
@@ -250,9 +248,7 @@ fs_visitor::nir_setup_outputs(nir_shader *shader)
 {
    brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
 
-   struct hash_entry *entry;
-   hash_table_foreach(shader->outputs, entry) {
-      nir_variable *var = (nir_variable *) entry->data;
+   foreach_list_typed(nir_variable, var, node, &shader->outputs) {
       fs_reg reg = offset(nir_outputs, var->data.driver_location);
 
       int vector_elements =
@@ -304,10 +300,7 @@ fs_visitor::nir_setup_uniforms(nir_shader *shader)
    if (dispatch_width != 8)
       return;
 
-   struct hash_entry *entry;
-   hash_table_foreach(shader->uniforms, entry) {
-      nir_variable *var = (nir_variable *) entry->data;
-
+   foreach_list_typed(nir_variable, var, node, &shader->uniforms) {
       /* UBO's and atomics don't take up space in the uniform file */
 
       if (var->interface_type != NULL || var->type->contains_atomic())