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