diff options
author | Francisco Jerez <[email protected]> | 2015-03-18 21:08:52 +0200 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2015-03-23 14:09:32 +0200 |
commit | 7b30493dc4f0b1346fe4c1fe52211f0c0d7ed229 (patch) | |
tree | d8e89dd356616c7e3c9789924dacd35eaf3a0530 /src/mesa | |
parent | eb9bd3a1b0d6c518f9a38d81c0729feb38474f5a (diff) |
i965/vec4: Simplify opt_reduce_swizzle() using the swizzle utils.
Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4.cpp | 51 |
1 files changed, 7 insertions, 44 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index ee3ac1578b3..ecfc227882e 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -459,61 +459,28 @@ vec4_visitor::opt_reduce_swizzle() inst->is_send_from_grf()) continue; - int swizzle[4]; + unsigned swizzle; /* Determine which channels of the sources are read. */ switch (inst->opcode) { case VEC4_OPCODE_PACK_BYTES: - swizzle[0] = 0; - swizzle[1] = 1; - swizzle[2] = 2; - swizzle[3] = 3; - break; case BRW_OPCODE_DP4: case BRW_OPCODE_DPH: /* FINISHME: DPH reads only three channels of src0, * but all four of src1. */ - swizzle[0] = 0; - swizzle[1] = 1; - swizzle[2] = 2; - swizzle[3] = 3; + swizzle = brw_swizzle_for_size(4); break; case BRW_OPCODE_DP3: - swizzle[0] = 0; - swizzle[1] = 1; - swizzle[2] = 2; - swizzle[3] = -1; + swizzle = brw_swizzle_for_size(3); break; case BRW_OPCODE_DP2: - swizzle[0] = 0; - swizzle[1] = 1; - swizzle[2] = -1; - swizzle[3] = -1; + swizzle = brw_swizzle_for_size(2); break; default: - swizzle[0] = inst->dst.writemask & WRITEMASK_X ? 0 : -1; - swizzle[1] = inst->dst.writemask & WRITEMASK_Y ? 1 : -1; - swizzle[2] = inst->dst.writemask & WRITEMASK_Z ? 2 : -1; - swizzle[3] = inst->dst.writemask & WRITEMASK_W ? 3 : -1; + swizzle = brw_swizzle_for_mask(inst->dst.writemask); break; } - /* Resolve unread channels (-1) by assigning them the swizzle of the - * first channel that is used. - */ - int first_used_channel = 0; - for (int i = 0; i < 4; i++) { - if (swizzle[i] != -1) { - first_used_channel = swizzle[i]; - break; - } - } - for (int i = 0; i < 4; i++) { - if (swizzle[i] == -1) { - swizzle[i] = first_used_channel; - } - } - /* Update sources' swizzles. */ for (int i = 0; i < 3; i++) { if (inst->src[i].file != GRF && @@ -521,12 +488,8 @@ vec4_visitor::opt_reduce_swizzle() inst->src[i].file != UNIFORM) continue; - int swiz[4]; - for (int j = 0; j < 4; j++) { - swiz[j] = BRW_GET_SWZ(inst->src[i].swizzle, swizzle[j]); - } - - unsigned new_swizzle = BRW_SWIZZLE4(swiz[0], swiz[1], swiz[2], swiz[3]); + const unsigned new_swizzle = + brw_compose_swizzle(swizzle, inst->src[i].swizzle); if (inst->src[i].swizzle != new_swizzle) { inst->src[i].swizzle = new_swizzle; progress = true; |