X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_fs_vector_splitting.cpp;h=a9125cad8f98cc86a1eaf21465f605b5726df345;hb=cf40ebacb113a370c1b2445e881f8dc440a7d8f3;hp=530ffa2658049e0d9e997f52ad766ed099620bdc;hpb=d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp b/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp index 530ffa26580..a9125cad8f9 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp @@ -39,13 +39,12 @@ extern "C" { #include "main/core.h" -#include "intel_context.h" +#include "brw_context.h" } -#include "../glsl/ir.h" -#include "../glsl/ir_visitor.h" -#include "../glsl/ir_print_visitor.h" -#include "../glsl/ir_rvalue_visitor.h" -#include "../glsl/glsl_types.h" +#include "glsl/ir.h" +#include "glsl/ir_visitor.h" +#include "glsl/ir_rvalue_visitor.h" +#include "glsl/glsl_types.h" static bool debug = false; @@ -56,7 +55,6 @@ public: { this->var = var; this->whole_vector_access = 0; - this->declaration = false; this->mem_ctx = NULL; } @@ -65,8 +63,6 @@ public: /** Number of times the variable is referenced, including assignments. */ unsigned whole_vector_access; - bool declaration; /* If the variable had a decl in the instruction stream */ - ir_variable *components[4]; /** ralloc_parent(this->var) -- the shader's ralloc context. */ @@ -108,13 +104,16 @@ ir_vector_reference_visitor::get_variable_entry(ir_variable *var) if (!var->type->is_vector()) return NULL; - switch (var->mode) { + switch (var->data.mode) { case ir_var_uniform: - case ir_var_in: - case ir_var_out: - case ir_var_inout: + case ir_var_shader_in: + case ir_var_shader_out: + case ir_var_system_value: + case ir_var_function_in: + case ir_var_function_out: + case ir_var_function_inout: /* Can't split varyings or uniforms. Function in/outs won't get split - * either, so don't care about the ambiguity. + * either. */ return NULL; case ir_var_auto: @@ -122,8 +121,8 @@ ir_vector_reference_visitor::get_variable_entry(ir_variable *var) break; } - foreach_iter(exec_list_iterator, iter, this->variable_list) { - variable_entry *entry = (variable_entry *)iter.get(); + foreach_list(node, &this->variable_list) { + variable_entry *entry = (variable_entry *)node; if (entry->var == var) return entry; } @@ -137,10 +136,8 @@ ir_vector_reference_visitor::get_variable_entry(ir_variable *var) ir_visitor_status ir_vector_reference_visitor::visit(ir_variable *ir) { - variable_entry *entry = this->get_variable_entry(ir); - - if (entry) - entry->declaration = true; + /* Make sure splitting looks at splitting this variable */ + (void)this->get_variable_entry(ir); return visit_continue; } @@ -209,12 +206,12 @@ public: virtual ir_visitor_status visit_leave(ir_assignment *); void handle_rvalue(ir_rvalue **rvalue); - struct variable_entry *get_splitting_entry(ir_variable *var); + variable_entry *get_splitting_entry(ir_variable *var); exec_list *variable_list; }; -struct variable_entry * +variable_entry * ir_vector_splitting_visitor::get_splitting_entry(ir_variable *var) { assert(var); @@ -222,8 +219,8 @@ ir_vector_splitting_visitor::get_splitting_entry(ir_variable *var) if (!var->type->is_vector()) return NULL; - foreach_iter(exec_list_iterator, iter, *this->variable_list) { - variable_entry *entry = (variable_entry *)iter.get(); + foreach_list(node, &*this->variable_list) { + variable_entry *entry = (variable_entry *)node; if (entry->var == var) { return entry; } @@ -316,7 +313,7 @@ ir_vector_splitting_visitor::visit_leave(ir_assignment *ir) elem = 3; break; default: - ir->print(); + ir->fprint(stderr); assert(!"not reached: non-channelwise dereference of LHS."); } @@ -341,16 +338,16 @@ brw_do_vector_splitting(exec_list *instructions) visit_list_elements(&refs, instructions); /* Trim out variables we can't split. */ - foreach_iter(exec_list_iterator, iter, refs.variable_list) { - variable_entry *entry = (variable_entry *)iter.get(); + foreach_list_safe(node, &refs.variable_list) { + variable_entry *entry = (variable_entry *)node; if (debug) { - printf("vector %s@%p: decl %d, whole_access %d\n", - entry->var->name, (void *) entry->var, entry->declaration, - entry->whole_vector_access); + fprintf(stderr, "vector %s@%p: whole_access %d\n", + entry->var->name, (void *) entry->var, + entry->whole_vector_access); } - if (!entry->declaration || entry->whole_vector_access) { + if (entry->whole_vector_access) { entry->remove(); } } @@ -363,8 +360,8 @@ brw_do_vector_splitting(exec_list *instructions) /* Replace the decls of the vectors to be split with their split * components. */ - foreach_iter(exec_list_iterator, iter, refs.variable_list) { - variable_entry *entry = (variable_entry *)iter.get(); + foreach_list(node, &refs.variable_list) { + variable_entry *entry = (variable_entry *)node; const struct glsl_type *type; type = glsl_type::get_instance(entry->var->type->base_type, 1, 1);