From 226bd9294541f65c91cad44924ef68b6da18f2a2 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 22 Apr 2016 11:51:55 -0700 Subject: [PATCH] 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 3c17676e439..598fb0bd3ba 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -240,22 +240,6 @@ ntq_rsq(struct vc4_compile *c, struct qreg x) return r; } -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) { @@ -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 7d2bdc093ef..7ea6ec8a50f 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. * -- 2.30.2