pan/midgard: Allow non-contiguous masks in UBO lowering
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 15 Oct 2019 19:56:15 +0000 (15:56 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 16 Oct 2019 01:41:11 +0000 (21:41 -0400)
We don't really need to impose this condition, but we do need to cope
with the slightly more general case.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/mir_promote_uniforms.c

index 428710e5154ff402f2da913045e94b93f93c2b6d..5e31cb446bb9464bfddc09bda596866bb44baf79 100644 (file)
@@ -87,18 +87,13 @@ midgard_promote_uniforms(compiler_context *ctx, unsigned promoted_count)
                 bool needs_move = ins->dest & IS_REG;
                 needs_move |= mir_special_index(ctx, ins->dest);
 
-                /* Ensure this is a contiguous X-bound mask. It should be since
-                 * we haven't done RA and per-component masked UBO reads don't
-                 * make much sense. */
-
-                assert(((ins->mask + 1) & ins->mask) == 0);
-
                 /* Check the component count from the mask so we can setup a
                  * swizzle appropriately when promoting. The idea is to ensure
                  * the component count is preserved so RA can be smarter if we
                  * need to spill */
 
-                unsigned nr_components = util_bitcount(ins->mask);
+                unsigned mask = ins->mask;
+                unsigned nr_components = sizeof(mask)*8 - __builtin_clz(mask);
 
                 if (needs_move) {
                         midgard_instruction mov = v_mov(promoted, blank_alu_src, ins->dest);