pan/bit: Implement outmods
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 1 Apr 2020 17:08:00 +0000 (13:08 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 5 Apr 2020 23:26:04 +0000 (23:26 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4458>

src/panfrost/bifrost/test/bi_interpret.c

index ccfd09548eaa5b6cdf46f52a3ff17c6e2214abde..8a4781b538e5aea04a552ec9962e3577ecc17a45 100644 (file)
@@ -184,6 +184,23 @@ bit_make_poly(add, a + b);
 bit_make_float(fma, (a * b) + c);
 bit_make_poly(mov, a);
 
+/* Modifiers */
+
+static float
+bit_outmod(float raw, enum bifrost_outmod mod)
+{
+        switch (mod) {
+        case BIFROST_POS:
+                return MAX2(raw, 0.0);
+        case BIFROST_SAT_SIGNED:
+                return CLAMP(raw, -1.0, 1.0);
+        case BIFROST_SAT:
+                return CLAMP(raw, 0.0, 1.0);
+        default:
+                return raw;
+        }
+}
+
 void
 bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
 {
@@ -247,6 +264,16 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
                 unreachable("Unsupported op");
         }
 
+        /* Apply outmod */
+        if (bi_has_outmod(ins) && ins->outmod != BIFROST_NONE) {
+                if (ins->dest_type == nir_type_float16) {
+                        for (unsigned c = 0; c < 2; ++c)
+                                dest.f16[c] = bh(bit_outmod(bf(dest.f16[c]), ins->outmod));
+                } else {
+                        dest.f32 = bit_outmod(dest.f32, ins->outmod);
+                }
+        }
+
         /* Finally, store the result */
         bit_write(s, ins->dest, ins->dest_type, dest, FMA);