diff options
author | Francisco Jerez <[email protected]> | 2015-03-18 21:09:51 +0200 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2015-03-23 14:09:32 +0200 |
commit | 05ec72d8ecdba04a81745fbc3ca0df40c7fb8828 (patch) | |
tree | 204042ec7a24b39c311f2e317b7e8d7add4a72b1 /src/mesa | |
parent | 7b30493dc4f0b1346fe4c1fe52211f0c0d7ed229 (diff) |
i965/vec4: Simplify reswizzle() 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 | 40 |
1 files changed, 11 insertions, 29 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index ecfc227882e..a08db0f70eb 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -978,43 +978,25 @@ vec4_instruction::can_reswizzle(int dst_writemask, void vec4_instruction::reswizzle(int dst_writemask, int swizzle) { - int new_writemask = 0; - int new_swizzle[4] = { 0 }; - - /* Dot product instructions write a single result into all channels. */ + /* Destination write mask doesn't correspond to source swizzle for the dot + * product and pack_bytes instructions. + */ if (opcode != BRW_OPCODE_DP4 && opcode != BRW_OPCODE_DPH && - opcode != BRW_OPCODE_DP3 && opcode != BRW_OPCODE_DP2) { + opcode != BRW_OPCODE_DP3 && opcode != BRW_OPCODE_DP2 && + opcode != VEC4_OPCODE_PACK_BYTES) { for (int i = 0; i < 3; i++) { if (src[i].file == BAD_FILE || src[i].file == IMM) continue; - /* Destination write mask doesn't correspond to source swizzle for the - * pack_bytes instruction. - */ - if (opcode == VEC4_OPCODE_PACK_BYTES) - continue; - - for (int c = 0; c < 4; c++) { - new_swizzle[c] = BRW_GET_SWZ(src[i].swizzle, BRW_GET_SWZ(swizzle, c)); - } - - src[i].swizzle = BRW_SWIZZLE4(new_swizzle[0], new_swizzle[1], - new_swizzle[2], new_swizzle[3]); + src[i].swizzle = brw_compose_swizzle(swizzle, src[i].swizzle); } } - for (int c = 0; c < 4; c++) { - int bit = 1 << BRW_GET_SWZ(swizzle, c); - /* Skip components of the swizzle not used by the dst. */ - if (!(dst_writemask & (1 << c))) - continue; - /* If we were populating this component, then populate the - * corresponding channel of the new dst. - */ - if (dst.writemask & bit) - new_writemask |= (1 << c); - } - dst.writemask = new_writemask; + /* Apply the specified swizzle and writemask to the original mask of + * written components. + */ + dst.writemask = dst_writemask & + brw_apply_swizzle_to_mask(swizzle, dst.writemask); } /* |