panfrost: Disable tib read/write when colourmask = 0x0
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 20 May 2020 16:56:01 +0000 (12:56 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 21 May 2020 19:48:53 +0000 (15:48 -0400)
There might still be Z/S updates so we can't drop the whole shader but
we can shortcircuit the colour pipeline.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5124>

src/gallium/drivers/panfrost/pan_blend.h
src/gallium/drivers/panfrost/pan_blend_cso.c
src/gallium/drivers/panfrost/pan_cmdstream.c

index 1b1cb9df31da601e809c084cb174beb8cb4bd217..1dfb0776207751db481938daf98f1581b09537d6 100644 (file)
@@ -99,10 +99,12 @@ struct panfrost_blend_final {
         /* Set for a shader, clear for an equation */
         bool is_shader;
 
-        /* Set if the destination needs to be loaded from the tilebuffer,
-         * basically (for an equation) or if a shader is present */
+        /* Clear if the destination needs to be loaded from the tilebuffer */
         bool no_blending;
 
+        /* Set if the colour mask is 0x0 (nothing is written) */
+        bool no_colour;
+
         union {
                 struct panfrost_blend_shader_final shader;
                 struct panfrost_blend_equation_final equation;
index d0824ed488f638e87d52f8d435137421d20b5685..a68a9911b5780b6eba5a2d049abf07e3098ebf31 100644 (file)
@@ -255,6 +255,8 @@ panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti, struc
                                 (rt->equation.alpha_mode == 0x122) &&
                                 (rt->equation.color_mask == 0xf);
 
+                        final.no_colour = (rt->equation.color_mask == 0x0);
+
                         return final;
                 }
         }
index 21ab118085de970c3f9b5aec4d522659ff5f87cb..caf01663a488cf34d63d9598cb483ebd6a2b63fe 100644 (file)
@@ -725,16 +725,18 @@ panfrost_frag_meta_blend_update(struct panfrost_context *ctx,
                 } else {
                         struct midgard_blend_rt *mrts = rts;
 
-                        mrts[i].flags = 0x200;
+                        if (!blend[i].no_colour) {
+                                mrts[i].flags = 0x200;
 
-                        bool is_srgb = (ctx->pipe_framebuffer.nr_cbufs > i) &&
-                                       (ctx->pipe_framebuffer.cbufs[i]) &&
-                                       util_format_is_srgb(ctx->pipe_framebuffer.cbufs[i]->format);
+                                bool is_srgb = (ctx->pipe_framebuffer.nr_cbufs > i) &&
+                                               (ctx->pipe_framebuffer.cbufs[i]) &&
+                                               util_format_is_srgb(ctx->pipe_framebuffer.cbufs[i]->format);
 
-                        SET_BIT(mrts[i].flags, MALI_BLEND_MRT_SHADER, blend[i].is_shader);
-                        SET_BIT(mrts[i].flags, MALI_BLEND_LOAD_TIB, !blend[i].no_blending);
-                        SET_BIT(mrts[i].flags, MALI_BLEND_SRGB, is_srgb);
-                        SET_BIT(mrts[i].flags, MALI_BLEND_NO_DITHER, !ctx->blend->base.dither);
+                                SET_BIT(mrts[i].flags, MALI_BLEND_MRT_SHADER, blend[i].is_shader);
+                                SET_BIT(mrts[i].flags, MALI_BLEND_LOAD_TIB, !blend[i].no_blending);
+                                SET_BIT(mrts[i].flags, MALI_BLEND_SRGB, is_srgb);
+                                SET_BIT(mrts[i].flags, MALI_BLEND_NO_DITHER, !ctx->blend->base.dither);
+                        }
 
                         if (blend[i].is_shader) {
                                 mrts[i].blend.shader = blend[i].shader.gpu | blend[i].shader.first_tag;