panfrost/midgard: Add a condense_writemask() helper
authorBoris Brezillon <boris.brezillon@collabora.com>
Fri, 24 Jan 2020 08:22:48 +0000 (09:22 +0100)
committerMarge Bot <eric+marge@anholt.net>
Mon, 27 Jan 2020 15:24:54 +0000 (15:24 +0000)
This way we can convert an 8-bit writemask (Midgard specific
representation) into the more common 1-bit/component representation.

8-bit mode is not supported yet, as we're not sure how the writemask is
encoded for this mode.

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/3536>

src/panfrost/midgard/helpers.h

index d2bfc18273e62b0653b31191395772d2982d4b65..66223f3fd787bc54e9f6709ccc14fc245eabeb54 100644 (file)
@@ -254,6 +254,28 @@ expand_writemask(unsigned mask, unsigned channels)
         return o;
 }
 
+/* Tansform an expanded writemask (duplicated 8-bit format) into its condensed
+ * form (one bit per component) */
+
+static inline unsigned
+condense_writemask(unsigned expanded_mask,
+                   unsigned bits_per_component)
+{
+        if (bits_per_component == 8)
+                unreachable("XXX TODO: sort out how 8-bit constant encoding works");
+
+        unsigned slots_per_component = bits_per_component / 16;
+        unsigned max_comp = (16 * 8) / bits_per_component;
+        unsigned condensed_mask = 0;
+
+        for (unsigned i = 0; i < max_comp; i++) {
+                if (expanded_mask & (1 << (i * slots_per_component)))
+                        condensed_mask |= (1 << i);
+        }
+
+        return condensed_mask;
+}
+
 /* Coerce structs to integer */
 
 static inline unsigned