X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglsl%2Fir_variable_refcount.cpp;h=e4d825c454b4869bc39af540beacdb9e57055d4c;hb=0e94f350eeecd84cd5f15b10837b285bc9120684;hp=20c2f6602bf229c749a069c932ebfbdd10fd58a9;hpb=d72edc4dddb6dd7908ef0d3f2cec353b028bf6c5;p=mesa.git diff --git a/src/glsl/ir_variable_refcount.cpp b/src/glsl/ir_variable_refcount.cpp index 20c2f6602bf..e4d825c454b 100644 --- a/src/glsl/ir_variable_refcount.cpp +++ b/src/glsl/ir_variable_refcount.cpp @@ -33,19 +33,52 @@ #include "ir_visitor.h" #include "ir_variable_refcount.h" #include "glsl_types.h" +#include "util/hash_table.h" -variable_entry * +ir_variable_refcount_visitor::ir_variable_refcount_visitor() +{ + this->mem_ctx = ralloc_context(NULL); + this->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer, + _mesa_key_pointer_equal); +} + +static void +free_entry(struct hash_entry *entry) +{ + ir_variable_refcount_entry *ivre = (ir_variable_refcount_entry *) entry->data; + delete ivre; +} + +ir_variable_refcount_visitor::~ir_variable_refcount_visitor() +{ + ralloc_free(this->mem_ctx); + _mesa_hash_table_destroy(this->ht, free_entry); +} + +// constructor +ir_variable_refcount_entry::ir_variable_refcount_entry(ir_variable *var) +{ + this->var = var; + assign = NULL; + assigned_count = 0; + declaration = false; + referenced_count = 0; +} + + +ir_variable_refcount_entry * ir_variable_refcount_visitor::get_variable_entry(ir_variable *var) { assert(var); - foreach_iter(exec_list_iterator, iter, this->variable_list) { - variable_entry *entry = (variable_entry *)iter.get(); - if (entry->var == var) - return entry; - } - variable_entry *entry = new(mem_ctx) variable_entry(var); - this->variable_list.push_tail(entry); + struct hash_entry *e = _mesa_hash_table_search(this->ht, var); + if (e) + return (ir_variable_refcount_entry *)e->data; + + ir_variable_refcount_entry *entry = new ir_variable_refcount_entry(var); + assert(entry->referenced_count == 0); + _mesa_hash_table_insert(this->ht, var, entry); + return entry; } @@ -53,7 +86,7 @@ ir_variable_refcount_visitor::get_variable_entry(ir_variable *var) ir_visitor_status ir_variable_refcount_visitor::visit(ir_variable *ir) { - variable_entry *entry = this->get_variable_entry(ir); + ir_variable_refcount_entry *entry = this->get_variable_entry(ir); if (entry) entry->declaration = true; @@ -65,7 +98,7 @@ ir_visitor_status ir_variable_refcount_visitor::visit(ir_dereference_variable *ir) { ir_variable *const var = ir->variable_referenced(); - variable_entry *entry = this->get_variable_entry(var); + ir_variable_refcount_entry *entry = this->get_variable_entry(var); if (entry) entry->referenced_count++; @@ -88,7 +121,7 @@ ir_variable_refcount_visitor::visit_enter(ir_function_signature *ir) ir_visitor_status ir_variable_refcount_visitor::visit_leave(ir_assignment *ir) { - variable_entry *entry; + ir_variable_refcount_entry *entry; entry = this->get_variable_entry(ir->lhs->variable_referenced()); if (entry) { entry->assigned_count++;