panfrost: Enable sRGB fixed-function blending
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 17 Jun 2019 23:23:23 +0000 (16:23 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 18 Jun 2019 16:59:29 +0000 (09:59 -0700)
For fixed-function, we have hardware to handle sRGB so we just set a
flag. For blend shaders, it's rather more involved; this is currently
unimplemented. Assert it out for now; we don't need it quite yet.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/include/panfrost-job.h
src/gallium/drivers/panfrost/pan_context.c

index bcdffabff9777c518118a0b9809f378385a69548..80ce66fa7e22bc954005048d9d05fcc556b88fd0 100644 (file)
@@ -168,9 +168,6 @@ struct mali_stencil_test {
         unsigned zero                  : 4;
 } __attribute__((packed));
 
-/* Blending is a mess, since anything fancy triggers a blend shader, and
- * -those- are not understood whatsover yet */
-
 #define MALI_MASK_R (1 << 0)
 #define MALI_MASK_G (1 << 1)
 #define MALI_MASK_B (1 << 2)
@@ -439,11 +436,14 @@ union midgard_blend {
 /* On MRT Midgard systems (using an MFBD), each render target gets its own
  * blend descriptor */
 
+#define MALI_BLEND_SRGB (0x400)
+
 struct midgard_blend_rt {
         /* Flags base value of 0x200 to enable the render target.
          * OR with 0x1 for blending (anything other than REPLACE).
          * OR with 0x2 for programmable blending with 0-2 registers
          * OR with 0x3 for programmable blending with 2+ registers
+         * OR with MALI_BLEND_SRGB for implicit sRGB
          */
 
         u64 flags;
index 7f60cfa03d4a59ae4cd6db8b8c11a550da01c095..86a9533089c175270c6b19c7fa15aa96238fdb65 100644 (file)
@@ -1259,8 +1259,22 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
                         /* TODO: MRT */
 
                         for (unsigned i = 0; i < 1; ++i) {
+                                bool is_srgb =
+                                        util_format_is_srgb(ctx->pipe_framebuffer.cbufs[i]->format);
+
                                 rts[i].flags = blend_count;
 
+                                if (is_srgb)
+                                        rts[i].flags |= MALI_BLEND_SRGB;
+
+                                /* 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 && ctx->blend->has_blend_shader));
+
                                 if (ctx->blend->has_blend_shader) {
                                         rts[i].blend.shader = ctx->blend->blend_shader;
                                 } else {