Mesa (master): vc4: Don' t let pairing happen with badly mismatched pack flags.

Eric Anholt anholt at kemper.freedesktop.org
Thu Jan 15 09:25:08 UTC 2015


Module: Mesa
Branch: master
Commit: 3820866e40d16f5d05319f0390956fb6e6407239
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3820866e40d16f5d05319f0390956fb6e6407239

Author: Eric Anholt <eric at anholt.net>
Date:   Sun Jan 11 18:27:07 2015 +1300

vc4: Don't let pairing happen with badly mismatched pack flags.

No difference on shader-db, but will become more important as I introduce
more use of pack flags with 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 7e38ede..6bdb395 100644
--- a/src/gallium/drivers/vc4/vc4_qpu.c
+++ b/src/gallium/drivers/vc4/vc4_qpu.c
@@ -394,6 +394,15 @@ convert_mov(uint64_t *inst)
         return true;
 }
 
+static bool
+writes_a_file(uint64_t inst)
+{
+        if (!(inst & QPU_WS))
+                return QPU_GET_FIELD(inst, QPU_WADDR_ADD) < 32;
+        else
+                return QPU_GET_FIELD(inst, QPU_WADDR_MUL) < 32;
+}
+
 uint64_t
 qpu_merge_inst(uint64_t a, uint64_t b)
 {
@@ -470,6 +479,36 @@ qpu_merge_inst(uint64_t a, uint64_t b)
                         return 0;
         }
 
+        /* packing: Make sure that non-NOP packs agree, then deal with
+         * special-case failing of adding a non-NOP pack to something with a
+         * NOP pack.
+         */
+        if (!merge_fields(&merge, a, b, QPU_PACK_MASK, 0))
+                return 0;
+        bool new_a_pack = (QPU_GET_FIELD(a, QPU_PACK) !=
+                           QPU_GET_FIELD(merge, QPU_PACK));
+        bool new_b_pack = (QPU_GET_FIELD(b, QPU_PACK) !=
+                           QPU_GET_FIELD(merge, QPU_PACK));
+        if (!(merge & QPU_PM)) {
+                /* Make sure we're not going to be putting a new
+                 * a-file packing on either half.
+                 */
+                if (new_a_pack && writes_a_file(a))
+                        return 0;
+
+                if (new_b_pack && writes_a_file(b))
+                        return 0;
+        } else {
+                /* Make sure we're not going to be putting new MUL packing on
+                 * either half.
+                 */
+                if (new_a_pack && QPU_GET_FIELD(a, QPU_OP_MUL) != QPU_M_NOP)
+                        return 0;
+
+                if (new_b_pack && QPU_GET_FIELD(b, QPU_OP_MUL) != QPU_M_NOP)
+                        return 0;
+        }
+
         if (ok)
                 return merge;
         else




More information about the mesa-commit mailing list