[Mesa-dev] [PATCH 3/5] i965/vec4: Use swizzle() to swizzle immediates during constant propagation.

Matt Turner mattst88 at gmail.com
Mon Feb 29 19:04:28 UTC 2016


On Mon, Feb 29, 2016 at 7:30 AM, Iago Toral <itoral at igalia.com> wrote:
> On Fri, 2016-02-26 at 22:02 -0800, Francisco Jerez wrote:
>> swizzle() works for vector immediates other than VF.
>> ---
>>  .../drivers/dri/i965/brw_vec4_copy_propagation.cpp    | 19 +------------------
>>  1 file changed, 1 insertion(+), 18 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
>> index 6bd9928..5c25164 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
>> @@ -76,22 +76,6 @@ is_channel_updated(vec4_instruction *inst, src_reg *values[4], int ch)
>>             inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch)));
>>  }
>>
>> -static unsigned
>> -swizzle_vf_imm(unsigned vf4, unsigned swizzle)
>> -{
>> -   union {
>> -      unsigned vf4;
>> -      uint8_t vf[4];
>> -   } v = { vf4 }, ret;
>> -
>> -   ret.vf[0] = v.vf[BRW_GET_SWZ(swizzle, 0)];
>> -   ret.vf[1] = v.vf[BRW_GET_SWZ(swizzle, 1)];
>> -   ret.vf[2] = v.vf[BRW_GET_SWZ(swizzle, 2)];
>> -   ret.vf[3] = v.vf[BRW_GET_SWZ(swizzle, 3)];
>> -
>> -   return ret.vf4;
>> -}
>> -
>>  static bool
>>  is_logic_op(enum opcode opcode)
>>  {
>> @@ -144,8 +128,7 @@ try_constant_propagate(const struct brw_device_info *devinfo,
>>        }
>>     }
>>
>> -   if (value.type == BRW_REGISTER_TYPE_VF)
>> -      value.ud = swizzle_vf_imm(value.ud, inst->src[arg].swizzle);
>> +   value = swizzle(value, inst->src[arg].swizzle);
>
> so I guess V/UV was broken before this?

My question is in the same vein -- what does swizzling V/UV even mean?
Swizzles operate on 4-component things, but V/UV have 8 components.

Concretely, for an immediate of 0x1234567UV, what does applying a
swizzle of .yxzw do? Does it swap two dwords (each containing two
values) and produce 0x34125678UV? Or does it operate on both halves
individually and produce 0x21346578UV?

Moreover, using one of these immediate types requires a W destination,
which isn't possible in align16 instructions -- so swizzling V/UV
seems pointless.

Remove the V/UV code from 2/5 and 3/5?


More information about the mesa-dev mailing list