On Fri, Oct 2, 2015 at 12:32 AM, Iago Toral <ito...@igalia.com> wrote: > 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.
Will do. >> + 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