pan/bi: Pack st_vary
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 20 Mar 2020 16:39:29 +0000 (12:39 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 22 Mar 2020 03:32:35 +0000 (03:32 +0000)
This should let varying writes go through finally.

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 c8070dbf96b4d5ae2743f1f8a36a1247df53961c..556ed68961f87a910e949460e54f3a2d68ceeb86 100644 (file)
@@ -593,6 +593,23 @@ bi_pack_add_ld_var_addr(bi_clause *clause, bi_instruction *ins, struct bi_regist
         RETURN_PACKED(pack);
 }
 
+static unsigned
+bi_pack_add_st_vary(bi_clause *clause, bi_instruction *ins, struct bi_registers *regs)
+{
+        assert(ins->store_channels >= 1 && ins->store_channels <= 4);
+
+        struct bifrost_st_vary pack = {
+                .src0 = bi_get_src(ins, regs, 1, false),
+                .src1 = bi_get_src(ins, regs, 2, false),
+                .src2 = bi_get_src(ins, regs, 3, false),
+                .channels = MALI_POSITIVE(ins->store_channels),
+                .op = BIFROST_ADD_OP_ST_VAR
+        };
+
+        bi_read_data_register(clause, ins);
+        RETURN_PACKED(pack);
+}
+
 static unsigned
 bi_pack_add_atest(bi_clause *clause, bi_instruction *ins, struct bi_registers *regs)
 {
@@ -663,7 +680,9 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
         case BI_FMOV:
         case BI_SHIFT:
         case BI_STORE:
+                return BIFROST_ADD_NOP;
         case BI_STORE_VAR:
+                return bi_pack_add_st_vary(clause, bundle.add, regs);
         case BI_SPECIAL:
         case BI_SWIZZLE:
         case BI_TEX:
index b0662966eab3516a52d9421ed02eca625ee8a01d..6ee9291ca7b1915f6e0a91fffbc75cf8819f769a 100644 (file)
@@ -121,6 +121,16 @@ struct bifrost_add_2src {
         unsigned op   : 14;
 } __attribute__((packed));
 
+#define BIFROST_ADD_OP_ST_VAR (0x19300 >> 8)
+
+struct bifrost_st_vary {
+        unsigned src0 : 3;
+        unsigned src1 : 3;
+        unsigned src2 : 3;
+        unsigned channels : 2;
+        unsigned op   : 9;
+} __attribute__((packed));
+
 #define BIFROST_ADD_OP_ATEST (0xc8f)
 
 struct bifrost_add_atest {