pan/bi: Add ATEST packing
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 19 Mar 2020 03:03:07 +0000 (23:03 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 19 Mar 2020 03:23:07 +0000 (03:23 +0000)
Only fp32 for now.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4242>

src/panfrost/bifrost/bi_pack.c
src/panfrost/bifrost/bifrost.h

index 2f961650d3ed8ca2ded37a359d1507ee0e68eaee..705a43e3531993ae6bd02c97e3df9d8619595478 100644 (file)
@@ -435,6 +435,26 @@ bi_pack_add_ld_vary(bi_clause *clause, bi_instruction *ins, struct bi_registers
         RETURN_PACKED(pack);
 }
 
+static unsigned
+bi_pack_add_atest(bi_clause *clause, bi_instruction *ins, struct bi_registers *regs)
+{
+        /* TODO: fp16 */
+        assert(ins->src_types[1] == nir_type_float32);
+
+        struct bifrost_add_atest pack = {
+                .src0 = bi_get_src(ins, regs, 0, false),
+                .src1 = bi_get_src(ins, regs, 1, false),
+                .component = 1, /* Set for fp32 */
+                .op = BIFROST_ADD_OP_ATEST,
+        };
+
+        /* Despite *also* writing with the usual mechanism... quirky and
+         * perhaps unnecessary, but let's match the blob */
+        clause->data_register = ins->dest & ~BIR_INDEX_REGISTER;
+
+        RETURN_PACKED(pack);
+}
+
 static unsigned
 bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
 {
@@ -443,7 +463,9 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
 
         switch (bundle.add->type) {
         case BI_ADD:
+                return BIFROST_ADD_NOP;
         case BI_ATEST:
+                return bi_pack_add_atest(clause, bundle.add, regs);
         case BI_BRANCH:
         case BI_CMP:
         case BI_BLEND:
index 959ef94f6c10622adbd867bf57182f60e44c9c4b..9fb063c32af8490f5978fe81bdd73cc5cd2ad4a2 100644 (file)
@@ -105,6 +105,22 @@ struct bifrost_add_inst {
         unsigned op   : 17;
 } __attribute__((packed));
 
+#define BIFROST_ADD_OP_ATEST (0xc8f)
+
+struct bifrost_add_atest {
+        /* gl_SampleMask (R60) */
+        unsigned src0 : 3;
+
+        /* Alpha value */
+        unsigned src1 : 3;
+
+        /* If half, X/Y select. If !half, always set */
+        unsigned component : 1;
+        unsigned half : 1;
+
+        unsigned op   : 12;
+} __attribute__((packed));
+
 enum bifrost_outmod {
         BIFROST_NONE = 0x0,
         BIFROST_POS = 0x1,