From: Eric Anholt Date: Mon, 18 Aug 2014 18:18:10 +0000 (-0700) Subject: vc4: Extract the swizzle handling from vertex fetch. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=37992a4e390bad9f7d83ce29bb7d01ad01bfc13c;p=mesa.git vc4: Extract the swizzle handling from vertex fetch. I want to reuse this elsewhere, and NONE debug output hasn't been useful so I don't miss it being as detailed as it was before. --- diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 0210ebc5815..a072043b38d 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -210,6 +210,27 @@ update_dst(struct tgsi_to_qir *trans, struct tgsi_full_instruction *tgsi_inst, } }; +static struct qreg +get_swizzled_channel(struct tgsi_to_qir *trans, + struct qreg *srcs, int swiz) +{ + switch (swiz) { + default: + case UTIL_FORMAT_SWIZZLE_NONE: + fprintf(stderr, "warning: unknown swizzle\n"); + /* FALLTHROUGH */ + case UTIL_FORMAT_SWIZZLE_0: + return qir_uniform_f(trans, 0.0); + case UTIL_FORMAT_SWIZZLE_1: + return qir_uniform_f(trans, 1.0); + case UTIL_FORMAT_SWIZZLE_X: + case UTIL_FORMAT_SWIZZLE_Y: + case UTIL_FORMAT_SWIZZLE_Z: + case UTIL_FORMAT_SWIZZLE_W: + return srcs[swiz]; + } +} + static struct qreg tgsi_to_qir_alu(struct tgsi_to_qir *trans, struct tgsi_full_instruction *tgsi_inst, @@ -557,34 +578,18 @@ emit_vertex_input(struct tgsi_to_qir *trans, int attr) for (int i = 0; i < 4; i++) { uint8_t swiz = desc->swizzle[i]; - switch (swiz) { - case UTIL_FORMAT_SWIZZLE_NONE: - if (!format_warned) { - fprintf(stderr, - "vtx element %d NONE swizzle: %s\n", - attr, util_format_name(format)); - format_warned = true; - } - /* FALLTHROUGH */ - case UTIL_FORMAT_SWIZZLE_0: - trans->inputs[attr * 4 + i] = qir_uniform_f(trans, 0.0); - break; - case UTIL_FORMAT_SWIZZLE_1: - trans->inputs[attr * 4 + i] = qir_uniform_f(trans, 1.0); - break; - default: - if (!format_warned && - (desc->channel[swiz].type != UTIL_FORMAT_TYPE_FLOAT || - desc->channel[swiz].size != 32)) { - fprintf(stderr, - "vtx element %d unsupported type: %s\n", - attr, util_format_name(format)); - format_warned = true; - } - - trans->inputs[attr * 4 + i] = vpm_reads[swiz]; - break; + if (swiz <= UTIL_FORMAT_SWIZZLE_W && + !format_warned && + (desc->channel[swiz].type != UTIL_FORMAT_TYPE_FLOAT || + desc->channel[swiz].size != 32)) { + fprintf(stderr, + "vtx element %d unsupported type: %s\n", + attr, util_format_name(format)); + format_warned = true; } + + trans->inputs[attr * 4 + i] = + get_swizzled_channel(trans, vpm_reads, swiz); } }