pan/bi: Pack ld_ubo ops
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 20 Mar 2020 15:52:43 +0000 (11:52 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 22 Mar 2020 03:32:35 +0000 (03:32 +0000)
Routes some infrastructure to do so at least slightly generically but
we'll see.

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

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

index 719ac2a1a24662a2cc1206ec42307f388c41d1ef..642a77ef24020a7ed1964a42eef0fd2ed361eca5 100644 (file)
@@ -352,6 +352,15 @@ bi_pack_registers(struct bi_registers regs)
         return packed;
 }
 
+static void
+bi_write_data_register(bi_clause *clause, bi_instruction *ins)
+{
+        assert(ins->dest & BIR_INDEX_REGISTER);
+        unsigned reg = ins->dest & ~BIR_INDEX_REGISTER;
+        assert(reg <= 63);
+        clause->data_register = reg;
+}
+
 static enum bifrost_packed_src
 bi_get_src_reg_port(struct bi_registers *regs, unsigned src)
 {
@@ -512,6 +521,34 @@ bi_pack_add_ld_vary(bi_clause *clause, bi_instruction *ins, struct bi_registers
         RETURN_PACKED(pack);
 }
 
+static unsigned
+bi_pack_add_2src(bi_instruction *ins, struct bi_registers *regs, unsigned op)
+{
+        struct bifrost_add_2src pack = {
+                .src0 = bi_get_src(ins, regs, 0, true),
+                .src1 = bi_get_src(ins, regs, 1, true),
+                .op = op
+        };
+
+        RETURN_PACKED(pack);
+}
+
+static unsigned
+bi_pack_add_ld_ubo(bi_clause *clause, bi_instruction *ins, struct bi_registers *regs)
+{
+        unsigned components = bi_load32_components(ins);
+
+        const unsigned ops[4] = {
+                BIFROST_ADD_OP_LD_UBO_1,
+                BIFROST_ADD_OP_LD_UBO_2,
+                BIFROST_ADD_OP_LD_UBO_3,
+                BIFROST_ADD_OP_LD_UBO_4
+        };
+
+        bi_write_data_register(clause, ins);
+        return bi_pack_add_2src(ins, regs, ops[components - 1]);
+}
+
 static unsigned
 bi_pack_add_atest(bi_clause *clause, bi_instruction *ins, struct bi_registers *regs)
 {
@@ -568,7 +605,9 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
         case BI_FREXP:
         case BI_ISUB:
         case BI_LOAD:
+                return BIFROST_ADD_NOP;
         case BI_LOAD_UNIFORM:
+                return bi_pack_add_ld_ubo(clause, bundle.add, regs);
         case BI_LOAD_ATTR:
                 return BIFROST_ADD_NOP;
         case BI_LOAD_VAR:
index b99115796d6b2784fd821f9a502ebfa9269cf3cb..4cd47ef01ab5163010f1a8ff48359c6158611a07 100644 (file)
@@ -110,6 +110,17 @@ struct bifrost_add_inst {
         unsigned op   : 17;
 } __attribute__((packed));
 
+#define BIFROST_ADD_OP_LD_UBO_1 (0x0c1a0 >> 3)
+#define BIFROST_ADD_OP_LD_UBO_2 (0x0c1e0 >> 3)
+#define BIFROST_ADD_OP_LD_UBO_3 (0x0caa0 >> 3)
+#define BIFROST_ADD_OP_LD_UBO_4 (0x0c220 >> 3)
+
+struct bifrost_add_2src {
+        unsigned src0 : 3;
+        unsigned src1 : 3;
+        unsigned op   : 14;
+} __attribute__((packed));
+
 #define BIFROST_ADD_OP_ATEST (0xc8f)
 
 struct bifrost_add_atest {