[Mesa-dev] [PATCH 04/11] i965/vec4: Use the actual channels used in pack_uniform_registers
Jason Ekstrand
jason at jlekstrand.net
Fri Oct 2 10:40:35 PDT 2015
On Fri, Oct 2, 2015 at 12:32 AM, Iago Toral <itoral at 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 <itoral at 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);
>
>
More information about the mesa-dev
mailing list