summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2014-08-15 12:32:23 -0700
committerMatt Turner <mattst88@gmail.com>2014-08-20 13:01:18 -0700
commit04895f5c601b240df547739da786b7c2b65bdd1e (patch)
tree969e300e96f004d85e645cab4062b4c2b675fe7f
parentbde2a62af72847f6722180d0203f5b537d1df8ab (diff)
i965/vec4: Allow reswizzling writemasks when swizzle is single-valued.
total instructions in shared programs: 4288033 -> 4266151 (-0.51%) instructions in affected programs: 930915 -> 909033 (-2.35%)
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.cpp60
1 files changed, 33 insertions, 27 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 5477fe6ab5f..ee61202c358 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -944,24 +944,27 @@ vec4_instruction::can_reswizzle_dst(int dst_writemask,
return false;
switch (opcode) {
- case BRW_OPCODE_DP4:
- case BRW_OPCODE_DP3:
- case BRW_OPCODE_DP2:
- return true;
default:
- /* Check if there happens to be no reswizzling required. */
- 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 (!brw_is_single_value_swizzle(swizzle)) {
+ /* Check if there happens to be no reswizzling required. */
+ 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;
- /* We don't do the reswizzling yet, so just sanity check that we
- * don't have to.
- */
- if (bit != (1 << c))
- return false;
+ /* We don't do the reswizzling yet, so just sanity check that we
+ * don't have to.
+ */
+ if (bit != (1 << c))
+ return false;
+ }
+ return true;
}
+ /* fallthrough */
+ case BRW_OPCODE_DP4:
+ case BRW_OPCODE_DP3:
+ case BRW_OPCODE_DP2:
return true;
}
}
@@ -979,6 +982,21 @@ vec4_instruction::reswizzle_dst(int dst_writemask, int swizzle)
int new_writemask = 0;
switch (opcode) {
+ default:
+ if (!brw_is_single_value_swizzle(swizzle)) {
+ for (int c = 0; c < 4; c++) {
+ /* Skip components of the swizzle not used by the dst. */
+ if (!(dst_writemask & (1 << c)))
+ continue;
+
+ /* We don't do the reswizzling yet, so just sanity check that we
+ * don't have to.
+ */
+ assert((1 << BRW_GET_SWZ(swizzle, c)) == (1 << c));
+ }
+ break;
+ }
+ /* fallthrough */
case BRW_OPCODE_DP4:
case BRW_OPCODE_DP3:
case BRW_OPCODE_DP2:
@@ -995,18 +1013,6 @@ vec4_instruction::reswizzle_dst(int dst_writemask, int swizzle)
}
dst.writemask = new_writemask;
break;
- default:
- for (int c = 0; c < 4; c++) {
- /* Skip components of the swizzle not used by the dst. */
- if (!(dst_writemask & (1 << c)))
- continue;
-
- /* We don't do the reswizzling yet, so just sanity check that we
- * don't have to.
- */
- assert((1 << BRW_GET_SWZ(swizzle, c)) == (1 << c));
- }
- break;
}
}