Mesa (master): vc4: Don' t let pairing happen with badly mismatched unpack flags.
Eric Anholt
anholt at kemper.freedesktop.org
Thu Jan 15 09:25:08 UTC 2015
Module: Mesa
Branch: master
Commit: 5d5707707fb10712ba130c2dafb50e8fc92a2bcc
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5d5707707fb10712ba130c2dafb50e8fc92a2bcc
Author: Eric Anholt <eric at anholt.net>
Date: Sun Jan 11 19:31:59 2015 +1300
vc4: Don't let pairing happen with badly mismatched unpack flags.
No difference on shader-db, but prevents definite regressions in the
blending changes.
---
src/gallium/drivers/vc4/vc4_qpu.c | 39 +++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/src/gallium/drivers/vc4/vc4_qpu.c b/src/gallium/drivers/vc4/vc4_qpu.c
index 6bdb395..434e664 100644
--- a/src/gallium/drivers/vc4/vc4_qpu.c
+++ b/src/gallium/drivers/vc4/vc4_qpu.c
@@ -403,6 +403,15 @@ writes_a_file(uint64_t inst)
return QPU_GET_FIELD(inst, QPU_WADDR_MUL) < 32;
}
+static bool
+reads_r4(uint64_t inst)
+{
+ return (QPU_GET_FIELD(inst, QPU_ADD_A) == QPU_MUX_R4 ||
+ QPU_GET_FIELD(inst, QPU_ADD_B) == QPU_MUX_R4 ||
+ QPU_GET_FIELD(inst, QPU_MUL_A) == QPU_MUX_R4 ||
+ QPU_GET_FIELD(inst, QPU_MUL_B) == QPU_MUX_R4);
+}
+
uint64_t
qpu_merge_inst(uint64_t a, uint64_t b)
{
@@ -509,6 +518,36 @@ qpu_merge_inst(uint64_t a, uint64_t b)
return 0;
}
+ /* unpacking: Make sure that non-NOP unpacks agree, then deal with
+ * special-case failing of adding a non-NOP unpack to something with a
+ * NOP unpack.
+ */
+ if (!merge_fields(&merge, a, b, QPU_UNPACK_MASK, 0))
+ return 0;
+ bool new_a_unpack = (QPU_GET_FIELD(a, QPU_UNPACK) !=
+ QPU_GET_FIELD(merge, QPU_UNPACK));
+ bool new_b_unpack = (QPU_GET_FIELD(b, QPU_UNPACK) !=
+ QPU_GET_FIELD(merge, QPU_UNPACK));
+ if (!(merge & QPU_PM)) {
+ /* Make sure we're not going to be putting a new
+ * a-file packing on either half.
+ */
+ if (new_a_unpack && QPU_GET_FIELD(a, QPU_RADDR_A) != QPU_R_NOP)
+ return 0;
+
+ if (new_b_unpack && QPU_GET_FIELD(b, QPU_RADDR_A) != QPU_R_NOP)
+ return 0;
+ } else {
+ /* Make sure we're not going to be putting new r4 unpack on
+ * either half.
+ */
+ if (new_a_unpack && reads_r4(a))
+ return 0;
+
+ if (new_b_unpack && reads_r4(b))
+ return 0;
+ }
+
if (ok)
return merge;
else
More information about the mesa-commit
mailing list