diff options
author | Eric Anholt <[email protected]> | 2011-08-23 10:22:50 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2011-08-30 12:09:40 -0700 |
commit | 7c84b9d303345fa5075dba8c4ea7af449d93b0f8 (patch) | |
tree | d62f1d8d5d06e60e5f10091acadefbe5a5d86555 | |
parent | ddca4592a7fa08cc294403d221a5f329ee4991e9 (diff) |
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 <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4.cpp | 30 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4.h | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 7 |
3 files changed, 38 insertions, 0 deletions
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, |