summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancisco Jerez <[email protected]>2015-03-18 21:08:52 +0200
committerFrancisco Jerez <[email protected]>2015-03-23 14:09:32 +0200
commit7b30493dc4f0b1346fe4c1fe52211f0c0d7ed229 (patch)
treed8e89dd356616c7e3c9789924dacd35eaf3a0530
parenteb9bd3a1b0d6c518f9a38d81c0729feb38474f5a (diff)
i965/vec4: Simplify opt_reduce_swizzle() using the swizzle utils.
Reviewed-by: Matt Turner <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.cpp51
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;