[Mesa-dev] [PATCH 29/42] panfrost: Handle "blend disabled" blend shaders

Alyssa Rosenzweig alyssa.rosenzweig at collabora.com
Mon Jul 8 14:08:42 UTC 2019


Normally, disabled blend can definitely be fixed-function'd away, but
if a blend shader is used merely for format conversion rather than
blending, this code path can be nevertheless hit.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
---
 .../drivers/panfrost/pan_blend_shaders.c      | 34 ++++++++++++-------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_blend_shaders.c b/src/gallium/drivers/panfrost/pan_blend_shaders.c
index 91c8fb89688..2b6206545b3 100644
--- a/src/gallium/drivers/panfrost/pan_blend_shaders.c
+++ b/src/gallium/drivers/panfrost/pan_blend_shaders.c
@@ -89,21 +89,31 @@ nir_make_options(const struct pipe_blend_state *blend, unsigned nr_cbufs)
         nir_lower_blend_options options;
 
         for (unsigned i = 0; i < nr_cbufs; ++i) {
+                /* If blend is disabled, we just use replace mode */
+
                 nir_lower_blend_channel rgb = {
-                        .func = util_blend_func_to_shader(blend->rt[i].rgb_func),
-                        .src_factor = util_blend_factor_to_shader(blend->rt[i].rgb_src_factor),
-                        .dst_factor = util_blend_factor_to_shader(blend->rt[i].rgb_dst_factor),
-                        .invert_src_factor = util_blend_factor_is_inverted(blend->rt[i].rgb_src_factor),
-                        .invert_dst_factor = util_blend_factor_is_inverted(blend->rt[i].rgb_dst_factor)
+                        .func = BLEND_FUNC_ADD,
+                        .src_factor = BLEND_FACTOR_ZERO,
+                        .invert_src_factor = true,
+                        .dst_factor = BLEND_FACTOR_ZERO,
+                        .invert_dst_factor = false
                 };
 
-                nir_lower_blend_channel alpha = {
-                        .func = util_blend_func_to_shader(blend->rt[i].alpha_func),
-                        .src_factor = util_blend_factor_to_shader(blend->rt[i].alpha_src_factor),
-                        .dst_factor = util_blend_factor_to_shader(blend->rt[i].alpha_dst_factor),
-                        .invert_src_factor = util_blend_factor_is_inverted(blend->rt[i].alpha_src_factor),
-                        .invert_dst_factor = util_blend_factor_is_inverted(blend->rt[i].alpha_dst_factor)
-                };
+                nir_lower_blend_channel alpha = rgb;
+
+                if (blend->rt[i].blend_enable) {
+                        rgb.func = util_blend_func_to_shader(blend->rt[i].rgb_func);
+                        rgb.src_factor = util_blend_factor_to_shader(blend->rt[i].rgb_src_factor);
+                        rgb.dst_factor = util_blend_factor_to_shader(blend->rt[i].rgb_dst_factor);
+                        rgb.invert_src_factor = util_blend_factor_is_inverted(blend->rt[i].rgb_src_factor);
+                        rgb.invert_dst_factor = util_blend_factor_is_inverted(blend->rt[i].rgb_dst_factor);
+
+                        alpha.func = util_blend_func_to_shader(blend->rt[i].alpha_func);
+                        alpha.src_factor = util_blend_factor_to_shader(blend->rt[i].alpha_src_factor);
+                        alpha.dst_factor = util_blend_factor_to_shader(blend->rt[i].alpha_dst_factor);
+                        alpha.invert_src_factor = util_blend_factor_is_inverted(blend->rt[i].alpha_src_factor);
+                        alpha.invert_dst_factor = util_blend_factor_is_inverted(blend->rt[i].alpha_dst_factor);
+                }
 
                 options.rt[i].rgb = rgb;
                 options.rt[i].alpha = alpha;
-- 
2.20.1



More information about the mesa-dev mailing list