panfrost/midgard: Implement f2f16/f2f32
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 2 Jul 2019 00:38:26 +0000 (17:38 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 10 Jul 2019 13:12:04 +0000 (06:12 -0700)
These conversions handle half-floats within the shader.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/midgard/midgard_compile.c
src/gallium/drivers/panfrost/midgard/midgard_nir_algebraic.py
src/gallium/drivers/panfrost/midgard/nir_lower_framebuffer.c

index 353875d173fefc28af1c96b693f0de9e4ce30713..fc17ad2b05137508c0908827720e63e9823b99e2 100644 (file)
@@ -907,6 +907,24 @@ emit_alu(compiler_context *ctx, nir_alu_instr *instr)
                 break;
         }
 
+        case nir_op_f2f16: {
+                assert(src_bitsize == 32);
+
+                op = midgard_alu_op_fmov;
+                dest_override = midgard_dest_override_lower;
+                break;
+        }
+
+        case nir_op_f2f32: {
+                assert(src_bitsize == 16);
+
+                op = midgard_alu_op_fmov;
+                half_2 = true;
+                reg_mode++;
+                break;
+        }
+                
+
         /* For greater-or-equal, we lower to less-or-equal and flip the
          * arguments */
 
index b05c193e507877fca5b178f731358dfcf15edb48..871195b48cad2136da3c2d16346693ea8f8f8fc3 100644 (file)
@@ -53,7 +53,10 @@ converts = [
     (('u2u8', 'a@32'), ('u2u8', ('u2u16', a))),
 
     (('i2i32', 'a@8'), ('i2i32', ('i2i16', a))),
-    (('u2u32', 'a@8'), ('u2u32', ('u2u16', a)))
+    (('u2u32', 'a@8'), ('u2u32', ('u2u16', a))),
+
+    (('f2i32', 'a@16'), ('f2i32', ('f2f32', a))),
+    (('f2u32', 'a@16'), ('f2u32', ('f2f32', a))),
 ]
 
 # Midgard scales fsin/fcos arguments by pi.
index 5f3115b6ae8eff5faf2d7d9a668418ea7ef9c35f..5233fbc92808a4cc17ec3bc4a85bff38d1c0d88f 100644 (file)
 static nir_ssa_def *
 nir_float_to_native(nir_builder *b, nir_ssa_def *c_float)
 {
-   /* First, we scale from [0, 1] to [0, 255.0] */
-   nir_ssa_def *scaled = nir_fmul_imm(b, nir_fsat(b, c_float), 255.0);
+   /* First, we degrade quality to fp16; we don't need the extra bits */
+   nir_ssa_def *degraded = nir_f2f16(b, c_float);
+
+   /* Scale from [0, 1] to [0, 255.0] */
+   nir_ssa_def *scaled = nir_fmul_imm(b, nir_fsat(b, degraded), 255.0);
 
    /* Next, we type convert */
    nir_ssa_def *converted = nir_u2u8(b, nir_f2u32(b,