panfrost/midgard: Use fp16 exclusively while blending
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 2 Jul 2019 02:55:00 +0000 (19:55 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 10 Jul 2019 13:12:05 +0000 (06:12 -0700)
We now have some preliminary fp16 support available. We're not able to
expose this for GLSL quite yet, but for internal blend shaders, we're
able to do control bitness ourselves just fine. So let's fp16 that
stuff!

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

index 7a7f0ebabd7f7d3839b7e81f2dec4918f5056161..af0a7ac31cf90c4e496163dbf9850f2ece9b775e 100644 (file)
@@ -82,7 +82,7 @@ nir_alpha_saturate(
 {
    nir_ssa_def *Asrc = nir_channel(b, src, 3);
    nir_ssa_def *Adst = nir_channel(b, dst, 3);
-   nir_ssa_def *one = nir_imm_float(b, 1.0);
+   nir_ssa_def *one = nir_imm_float16(b, 1.0);
    nir_ssa_def *Adsti = nir_fsub(b, one, Adst);
 
    return (chan < 3) ? nir_fmin(b, Asrc, Adsti) : one;
@@ -99,7 +99,7 @@ nir_blend_factor_value(
 {
    switch (factor) {
    case BLEND_FACTOR_ZERO:
-      return nir_imm_float(b, 0.0);
+      return nir_imm_float16(b, 0.0);
    case BLEND_FACTOR_SRC_COLOR:
       return nir_channel(b, src, chan);
    case BLEND_FACTOR_DST_COLOR:
@@ -132,7 +132,7 @@ nir_blend_factor(
       nir_blend_factor_value(b, src, dst, bconst, chan, factor);
 
    if (inverted)
-      f = nir_fsub(b, nir_imm_float(b, 1.0), f);
+      f = nir_fsub(b, nir_imm_float16(b, 1.0), f);
 
    return nir_fmul(b, raw_scalar, f);
 }
@@ -167,7 +167,7 @@ nir_blend(
       nir_ssa_def *src, nir_ssa_def *dst)
 {
    /* Grab the blend constant ahead of time */
-   nir_ssa_def *bconst = nir_load_blend_const_color_rgba(b);
+   nir_ssa_def *bconst = nir_f2f16(b, nir_load_blend_const_color_rgba(b));
 
    /* We blend per channel and recombine later */
    nir_ssa_def *channels[4];
@@ -226,13 +226,13 @@ nir_lower_blend(nir_shader *shader, nir_lower_blend_options options)
             b.cursor = nir_before_instr(instr);
 
             /* Grab the input color */
-            nir_ssa_def *src = nir_ssa_for_src(&b, intr->src[1], 4);
+            nir_ssa_def *src = nir_f2f16(&b, nir_ssa_for_src(&b, intr->src[1], 4));
 
             /* Grab the tilebuffer color - io lowered to load_output */
-            nir_ssa_def *dst = nir_load_var(&b, var);
+            nir_ssa_def *dst = nir_f2f16(&b, nir_load_var(&b, var));
 
             /* Blend the two colors per the passed options */
-            nir_ssa_def *blended = nir_blend(&b, options, src, dst);
+            nir_ssa_def *blended = nir_f2f32(&b, nir_blend(&b, options, src, dst));
 
             /* Write out the final color instead of the input */
             nir_instr_rewrite_src(instr, &intr->src[1],
index 9a08a4c43bfd4d7bda8e43a622bac89f18ae28be..2986c3c3393004dab61b3b9c6ce7fad6f36adba5 100644 (file)
@@ -60,8 +60,8 @@ nir_float_to_native(nir_builder *b, nir_ssa_def *c_float)
 static nir_ssa_def *
 nir_native_to_float(nir_builder *b, nir_ssa_def *c_native)
 {
-   /* First, we convert up from u8 to f32 */
-   nir_ssa_def *converted = nir_u2f32(b, nir_u2u32(b, c_native));
+   /* First, we convert up from u8 to f16 */
+   nir_ssa_def *converted = nir_u2f16(b, nir_u2u16(b, c_native));
 
    /* Next, we scale down from [0, 255.0] to [0, 1] */
    nir_ssa_def *scaled = nir_fsat(b, nir_fmul_imm(b, converted, 1.0/255.0));