panfrost: Implement sRGB blend shaders
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sat, 4 Jan 2020 17:14:57 +0000 (12:14 -0500)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 6 Jan 2020 12:49:48 +0000 (07:49 -0500)
We use the lowering in nir_format_convert. There are native ops for this
so this is far from optimal and not remotely efficient but as with most
blend shader things right now, it's hard enough to get it working, so
let's focus on that for now. We'll make it fast later (once we have
GLES3 stable, we can start optimizing these things).

Fixes dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.*

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
src/gallium/drivers/panfrost/nir/nir_lower_framebuffer.c
src/gallium/drivers/panfrost/pan_context.c

index ffb51c4c3a17eb8a127b43d34d3d31795e7fd5ae..887b3662dc306211116026ca5a81b2b9032a0646 100644 (file)
@@ -338,6 +338,22 @@ nir_lower_framebuffer(nir_shader *shader, enum pipe_format format,
                /* Grab the input color */
                nir_ssa_def *c_nir = nir_ssa_for_src(&b, intr->src[1], 4);
 
+               /* Apply sRGB transform */
+
+               if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
+                  nir_ssa_def *rgb = nir_channels(&b, c_nir, 0x7);
+                  nir_ssa_def *trans = nir_format_linear_to_srgb(&b, rgb);
+
+                  nir_ssa_def *comp[4] = {
+                     nir_channel(&b, trans, 0),
+                     nir_channel(&b, trans, 1),
+                     nir_channel(&b, trans, 2),
+                     nir_channel(&b, c_nir, 3),
+                  };
+
+                  c_nir = nir_vec(&b, comp, 4);
+               }
+
                /* Format convert */
                nir_ssa_def *converted = nir_shader_to_native(&b, c_nir, format_desc, bits, homogenous_bits);
 
index 8c911b5d001551c513ee4b661a5de5417b626b9e..9c51f423f8612a6795f31340f5539d3173d3481c 100644 (file)
@@ -1037,14 +1037,6 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
                                 SET_BIT(rts[i].flags, MALI_BLEND_SRGB, is_srgb);
                                 SET_BIT(rts[i].flags, MALI_BLEND_NO_DITHER, !ctx->blend->base.dither);
 
-                                /* TODO: sRGB in blend shaders is currently
-                                 * unimplemented. Contact me (Alyssa) if you're
-                                 * interested in working on this. We have
-                                 * native Midgard ops for helping here, but
-                                 * they're not well-understood yet. */
-
-                                assert(!(is_srgb && blend[i].is_shader));
-
                                 if (blend[i].is_shader) {
                                         rts[i].blend.shader = blend[i].shader.gpu | blend[i].shader.first_tag;
                                 } else {