Mesa (master): vc4: Use NIR lowering for sRGB decode.

Eric Anholt anholt at kemper.freedesktop.org
Mon May 2 18:18:57 UTC 2016


Module: Mesa
Branch: master
Commit: 226bd9294541f65c91cad44924ef68b6da18f2a2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=226bd9294541f65c91cad44924ef68b6da18f2a2

Author: Eric Anholt <eric at anholt.net>
Date:   Fri Apr 22 11:51:55 2016 -0700

vc4: Use NIR lowering for sRGB decode.

This should get us the same decode code generated, but with a lot less
custom code in the driver.

---

 src/gallium/drivers/vc4/vc4_program.c | 38 +++--------------------------------
 src/gallium/drivers/vc4/vc4_qir.h     |  5 -----
 2 files changed, 3 insertions(+), 40 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index 3c17676..598fb0b 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -241,22 +241,6 @@ ntq_rsq(struct vc4_compile *c, struct qreg x)
 }
 
 static struct qreg
-qir_srgb_decode(struct vc4_compile *c, struct qreg srgb)
-{
-        struct qreg low = qir_FMUL(c, srgb, qir_uniform_f(c, 1.0 / 12.92));
-        struct qreg high = qir_POW(c,
-                                   qir_FMUL(c,
-                                            qir_FADD(c,
-                                                     srgb,
-                                                     qir_uniform_f(c, 0.055)),
-                                            qir_uniform_f(c, 1.0 / 1.055)),
-                                   qir_uniform_f(c, 2.4));
-
-        qir_SF(c, qir_FSUB(c, srgb, qir_uniform_f(c, 0.04045)));
-        return qir_SEL(c, QPU_COND_NS, low, high);
-}
-
-static struct qreg
 ntq_umul(struct vc4_compile *c, struct qreg src0, struct qreg src1)
 {
         struct qreg src0_hi = qir_SHR(c, src0,
@@ -326,11 +310,6 @@ ntq_emit_txf(struct vc4_compile *c, nir_tex_instr *instr)
                 for (int i = 0; i < 4; i++)
                         dest[i] = qir_UNPACK_8_F(c, tex, i);
         }
-
-        for (int i = 0; i < 4; i++) {
-                if (c->tex_srgb_decode[unit] & (1 << i))
-                        dest[i] = qir_srgb_decode(c, dest[i]);
-        }
 }
 
 static void
@@ -476,11 +455,6 @@ ntq_emit_tex(struct vc4_compile *c, nir_tex_instr *instr)
                 for (int i = 0; i < 4; i++)
                         dest[i] = qir_UNPACK_8_F(c, tex, i);
         }
-
-        for (int i = 0; i < 4; i++) {
-                if (c->tex_srgb_decode[unit] & (1 << i))
-                        dest[i] = qir_srgb_decode(c, dest[i]);
-        }
 }
 
 /**
@@ -1864,16 +1838,10 @@ vc4_shader_ntq(struct vc4_context *vc4, enum qstage stage,
                         } else {
                                 tex_options.swizzles[i][j] = arb_swiz;
                         }
-
-                        /* If ARB_texture_swizzle is reading from the R, G, or
-                         * B channels of an sRGB texture, then we need to
-                         * apply sRGB decode to this channel at sample time.
-                         */
-                        if (arb_swiz < 3 && util_format_is_srgb(format)) {
-                                c->tex_srgb_decode[i] |= (1 << j);
-                        }
-
                 }
+
+                if (util_format_is_srgb(format))
+                        tex_options.lower_srgb |= (1 << i);
         }
 
         NIR_PASS_V(c->s, nir_normalize_cubemap_coords);
diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h
index 7d2bdc0..7ea6ec8 100644
--- a/src/gallium/drivers/vc4/vc4_qir.h
+++ b/src/gallium/drivers/vc4/vc4_qir.h
@@ -379,11 +379,6 @@ struct vc4_compile {
 
         uint8_t vattr_sizes[8];
 
-        /* Bitfield for whether a given channel of a sampler needs sRGB
-         * decode.
-         */
-        uint8_t tex_srgb_decode[VC4_MAX_TEXTURE_SAMPLERS];
-
         /**
          * Array of the VARYING_SLOT_* of all FS QFILE_VARY reads.
          *




More information about the mesa-commit mailing list