On Wed, 2015-09-30 at 18:41 -0700, Jason Ekstrand wrote: > Previously, pack_uniform_registers worked based on the size of the uniform > as given to us when we initially set up the uniforms. However, we have to > walk through the uniforms and figure out liveness anyway, so we migh as > well record the number of channels used as we go. This may also allow us > to pack things tighter in a few cases. > --- > src/mesa/drivers/dri/i965/brw_vec4.cpp | 52 > +++++++++++++++++++++++++--------- > 1 file changed, 38 insertions(+), 14 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp > b/src/mesa/drivers/dri/i965/brw_vec4.cpp > index 407698f..f0fa07e 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp > +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp > @@ -518,11 +518,11 @@ vec4_visitor::split_uniform_registers() > void > vec4_visitor::pack_uniform_registers() > { > - bool uniform_used[this->uniforms]; > + uint8_t chans_used[this->uniforms]; > int new_loc[this->uniforms]; > int new_chan[this->uniforms]; > > - memset(uniform_used, 0, sizeof(uniform_used)); > + memset(chans_used, 0, sizeof(chans_used)); > memset(new_loc, 0, sizeof(new_loc)); > memset(new_chan, 0, sizeof(new_chan)); > > @@ -532,10 +532,36 @@ vec4_visitor::pack_uniform_registers() > */ > foreach_block_and_inst(block, vec4_instruction, inst, cfg) { > for (int i = 0 ; i < 3; i++) { > - if (inst->src[i].file != UNIFORM) > - continue; > + if (inst->src[i].file != UNIFORM) > + continue;
The switch statement below should go before the loop. > + unsigned readmask; > + switch (inst->opcode) { > + case VEC4_OPCODE_PACK_BYTES: > + case BRW_OPCODE_DP4: > + case BRW_OPCODE_DPH: > + readmask = 0xf; > + break; > + case BRW_OPCODE_DP3: > + readmask = 0x7; > + break; > + case BRW_OPCODE_DP2: > + readmask = 0x3; > + break; I don't know if there are other opcodes that could also be special-handled like these, but if there are we are only missing the opportunity to do tighter packing for them (which we are not doing now anyway)... Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> > + default: > + readmask = inst->dst.writemask; > + break; > + } > + > + int reg = inst->src[i].reg; > + > + for (int c = 0; c < 4; c++) { > + if (!(readmask & (1 << c))) > + continue; > > - uniform_used[inst->src[i].reg] = true; > + chans_used[reg] = MAX2(chans_used[reg], > + BRW_GET_SWZ(inst->src[i].swizzle, c) + 1); > + } > } > } > > @@ -546,17 +572,15 @@ vec4_visitor::pack_uniform_registers() > */ > for (int src = 0; src < uniforms; src++) { > assert(src < uniform_array_size); > - int size = this->uniform_vector_size[src]; > + int size = chans_used[src]; > > - if (!uniform_used[src]) { > - this->uniform_vector_size[src] = 0; > - continue; > - } > + if (size == 0) > + continue; > > int dst; > /* Find the lowest place we can slot this uniform in. */ > for (dst = 0; dst < src; dst++) { > - if (this->uniform_vector_size[dst] + size <= 4) > + if (chans_used[dst] + size <= 4) > break; > } > > @@ -565,7 +589,7 @@ vec4_visitor::pack_uniform_registers() > new_chan[src] = 0; > } else { > new_loc[src] = dst; > - new_chan[src] = this->uniform_vector_size[dst]; > + new_chan[src] = chans_used[dst]; > > /* Move the references to the data */ > for (int j = 0; j < size; j++) { > @@ -573,8 +597,8 @@ vec4_visitor::pack_uniform_registers() > stage_prog_data->param[src * 4 + j]; > } > > - this->uniform_vector_size[dst] += size; > - this->uniform_vector_size[src] = 0; > + chans_used[dst] += size; > + chans_used[src] = 0; > } > > new_uniform_count = MAX2(new_uniform_count, dst + 1); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev