diff options
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r-- | src/compiler/glsl/standalone.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp index efc6da9d004..7e633a72c6a 100644 --- a/src/compiler/glsl/standalone.cpp +++ b/src/compiler/glsl/standalone.cpp @@ -37,8 +37,65 @@ #include "standalone_scaffolding.h" #include "standalone.h" #include "util/string_to_uint_map.h" +#include "util/set.h" #include "opt_add_neg_to_sub.h" +class dead_variable_visitor : public ir_hierarchical_visitor { +public: + dead_variable_visitor() + { + variables = _mesa_set_create(NULL, + _mesa_hash_pointer, + _mesa_key_pointer_equal); + } + + virtual ~dead_variable_visitor() + { + _mesa_set_destroy(variables, NULL); + } + + virtual ir_visitor_status visit(ir_variable *ir) + { + /* If the variable is auto or temp, add it to the set of variables that + * are candidates for removal. + */ + if (ir->data.mode != ir_var_auto && ir->data.mode != ir_var_temporary) + return visit_continue; + + _mesa_set_add(variables, ir); + + return visit_continue; + } + + virtual ir_visitor_status visit(ir_dereference_variable *ir) + { + struct set_entry *entry = _mesa_set_search(variables, ir->var); + + /* If a variable is dereferenced at all, remove it from the set of + * variables that are candidates for removal. + */ + if (entry != NULL) + _mesa_set_remove(variables, entry); + + return visit_continue; + } + + void remove_dead_variables() + { + struct set_entry *entry; + + set_foreach(variables, entry) { + ir_variable *ir = (ir_variable *) entry->key; + + assert(ir->ir_type == ir_type_variable); + ir->remove(); + } + } + +private: + set *variables; +}; + static const struct standalone_options *options; static void @@ -445,6 +502,10 @@ standalone_compile_shader(const struct standalone_options *_options, add_neg_to_sub_visitor v; visit_list_elements(&v, shader->ir); + dead_variable_visitor dv; + visit_list_elements(&dv, shader->ir); + dv.remove_dead_variables(); + shader->Program = rzalloc(shader, gl_program); init_gl_program(shader->Program, shader->Stage); } |