[Mesa-dev] [PATCH 07/15] i965/vec4: Simplify reswizzle() using the swizzle utils.
Matt Turner
mattst88 at gmail.com
Sat Mar 21 14:27:11 PDT 2015
On Fri, Mar 20, 2015 at 7:11 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> ---
> src/mesa/drivers/dri/i965/brw_vec4.cpp | 40 ++++++++++------------------------
> 1 file 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 60f85f8..3e5f6c4 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> @@ -998,43 +998,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);
I'd indent this to line up vertically with dst_writemask.
More information about the mesa-dev
mailing list