summaryrefslogtreecommitdiffstats
path: root/src/glsl/nir
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2015-03-18 12:34:09 -0700
committerJason Ekstrand <[email protected]>2015-03-19 13:18:38 -0700
commit639115123efe7f71d432e24b1719adda7d23e97e (patch)
treec43e76da1b94e92fd3891f80710b65cb0ffa5b43 /src/glsl/nir
parent8f255f948bd5c7b8fd56c8f72f6a9a7f626fca29 (diff)
nir: Use a list instead of a hash_table for inputs, outputs, and uniforms
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 <[email protected]>
Diffstat (limited to 'src/glsl/nir')
-rw-r--r--src/glsl/nir/glsl_to_nir.cpp6
-rw-r--r--src/glsl/nir/nir.c9
-rw-r--r--src/glsl/nir/nir.h6
-rw-r--r--src/glsl/nir/nir_lower_io.c13
-rw-r--r--src/glsl/nir/nir_print.c14
-rw-r--r--src/glsl/nir/nir_validate.c16
6 files changed, 29 insertions, 35 deletions
diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
index 047cb51e85d..357944da64a 100644
--- a/src/glsl/nir/glsl_to_nir.cpp
+++ b/src/glsl/nir/glsl_to_nir.cpp
@@ -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:
diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
index abad3f8883b..6459d510826 100644
--- a/src/glsl/nir/nir.c
+++ b/src/glsl/nir/nir.c
@@ -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;
diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
index 669a26ed24d..6b42df953da 100644
--- a/src/glsl/nir/nir.h
+++ b/src/glsl/nir/nir.h
@@ -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.
*
diff --git a/src/glsl/nir/nir_lower_io.c b/src/glsl/nir/nir_lower_io.c
index 207f8daa1bc..37c357e893b 100644
--- a/src/glsl/nir/nir_lower_io.c
+++ b/src/glsl/nir/nir_lower_io.c
@@ -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
diff --git a/src/glsl/nir/nir_print.c b/src/glsl/nir/nir_print.c
index f8b14a149d3..fa11a312e51 100644
--- a/src/glsl/nir/nir_print.c
+++ b/src/glsl/nir/nir_print.c
@@ -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) {
diff --git a/src/glsl/nir/nir_validate.c b/src/glsl/nir/nir_validate.c
index a3fe9d62077..f247ae0691c 100644
--- a/src/glsl/nir/nir_validate.c
+++ b/src/glsl/nir/nir_validate.c
@@ -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);