From: Eric Anholt Date: Tue, 23 Aug 2011 17:22:50 +0000 (-0700) Subject: i965/vs: Track uniforms as separate vectors once we've done array access. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7c84b9d303345fa5075dba8c4ea7af449d93b0f8;p=mesa.git i965/vs: Track uniforms as separate vectors once we've done array access. This will make it easier to figure out which elements are totally unused and not upload them. Reviewed-by: Kenneth Graunke --- diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index 760bc1f7acd..cdbbb557960 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -158,4 +158,34 @@ vec4_visitor::dead_code_eliminate() return progress; } +void +vec4_visitor::split_uniform_registers() +{ + /* Prior to this, uniforms have been in an array sized according to + * the number of vector uniforms present, sparsely filled (so an + * aggregate results in reg indices being skipped over). Now we're + * going to cut those aggregates up so each .reg index is one + * vector. The goal is to make elimination of unused uniform + * components easier later. + */ + foreach_list(node, &this->instructions) { + vec4_instruction *inst = (vec4_instruction *)node; + + for (int i = 0 ; i < 3; i++) { + if (inst->src[i].file != UNIFORM) + continue; + + assert(!inst->src[i].reladdr); + + inst->src[i].reg += inst->src[i].reg_offset; + inst->src[i].reg_offset = 0; + } + } + + /* Update that everything is now vector-sized. */ + for (int i = 0; i < this->uniforms; i++) { + this->uniform_size[i] = 1; + } +} + } /* namespace brw */ diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index 1bb15016b52..945eea576b1 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -388,6 +388,7 @@ public: void reg_allocate(); void move_grf_array_access_to_scratch(); void move_uniform_array_access_to_pull_constants(); + void split_uniform_registers(); void calculate_live_intervals(); bool dead_code_eliminate(); bool virtual_grf_interferes(int a, int b); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index c4a3bbadd40..dc11d9883ca 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -2202,6 +2202,13 @@ vec4_visitor::move_uniform_array_access_to_pull_constants() inst->src[i].reladdr = NULL; } } + + /* Now there are no accesses of the UNIFORM file with a reladdr, so + * no need to track them as larger-than-vec4 objects. This will be + * relied on in cutting out unused uniform vectors from push + * constants. + */ + split_uniform_registers(); } vec4_visitor::vec4_visitor(struct brw_vs_compile *c,