pan/bi: Fix constant slot selection
authorBoris Brezillon <boris.brezillon@collabora.com>
Mon, 23 Nov 2020 22:03:59 +0000 (23:03 +0100)
committerMarge Bot <eric+marge@anholt.net>
Mon, 11 Jan 2021 17:39:39 +0000 (17:39 +0000)
The fau_index field contains the lower 4 bits of the 64bit constant,
which allows one to reuse the same clause constant slot from different
bundles if the upper 60 bits match. That doesn't work for constants
referenced from the same instruction or for constants referenced from
two instructions that are part of the same bundle though, since the
fau_index is shared in that case.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8418>

src/panfrost/bifrost/bi_pack.c

index 5758c2b..9ff6b82 100644 (file)
@@ -70,7 +70,13 @@ bi_lookup_constant(bi_clause *clause, uint32_t cons, bool *hi)
                 /* Try to apply to top or to bottom */
                 uint64_t top = clause->constants[i];
 
-                if (cons == ((uint32_t) top | (cons & 0xF)))
+                /* Constant slots can actually be used by a different
+                 * tuples if the 60 upper bits match since the 4 LSB are
+                 * encoded in the tuple itself. Let's not bother about this
+                 * case until we start scheduling more than one tuple per
+                 * clause.
+                 */
+                if (cons == (uint32_t) top)
                         return i;
 
                 if (cons == (top >> 32ul)) {