From 5e825f5cad5af4b085cfbaabc765dc42718e4b9e Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 2 Jul 2019 09:08:18 -0700 Subject: [PATCH] panfrost: Handle "blend disabled" blend shaders 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 --- .../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.30.2