Mesa (master): zink: reduce blendfactor when alpha_to_one is set

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jan 16 06:55:24 UTC 2021


Module: Mesa
Branch: master
Commit: 011fea1a90041838ad4f00dc880a231c3eca5dc8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=011fea1a90041838ad4f00dc880a231c3eca5dc8

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Aug 14 11:39:00 2020 -0400

zink: reduce blendfactor when alpha_to_one is set

if alpha is 1, some of these blendfactors can be reduced to simpler ones

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8513>

---

 src/gallium/drivers/zink/zink_state.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c
index 5ef56b8d02c..734cc03a40d 100644
--- a/src/gallium/drivers/zink/zink_state.c
+++ b/src/gallium/drivers/zink/zink_state.c
@@ -201,6 +201,21 @@ logic_op(enum pipe_logicop func)
    unreachable("unexpected logicop function");
 }
 
+/* from iris */
+static enum pipe_blendfactor
+fix_blendfactor(enum pipe_blendfactor f, bool alpha_to_one)
+{
+   if (alpha_to_one) {
+      if (f == PIPE_BLENDFACTOR_SRC1_ALPHA)
+         return PIPE_BLENDFACTOR_ONE;
+
+      if (f == PIPE_BLENDFACTOR_INV_SRC1_ALPHA)
+         return PIPE_BLENDFACTOR_ZERO;
+   }
+
+   return f;
+}
+
 static void *
 zink_create_blend_state(struct pipe_context *pctx,
                         const struct pipe_blend_state *blend_state)
@@ -235,11 +250,11 @@ zink_create_blend_state(struct pipe_context *pctx,
 
       if (rt->blend_enable) {
          att.blendEnable = VK_TRUE;
-         att.srcColorBlendFactor = blend_factor(rt->rgb_src_factor);
-         att.dstColorBlendFactor = blend_factor(rt->rgb_dst_factor);
+         att.srcColorBlendFactor = blend_factor(fix_blendfactor(rt->rgb_src_factor, cso->alpha_to_one));
+         att.dstColorBlendFactor = blend_factor(fix_blendfactor(rt->rgb_dst_factor, cso->alpha_to_one));
          att.colorBlendOp = blend_op(rt->rgb_func);
-         att.srcAlphaBlendFactor = blend_factor(rt->alpha_src_factor);
-         att.dstAlphaBlendFactor = blend_factor(rt->alpha_dst_factor);
+         att.srcAlphaBlendFactor = blend_factor(fix_blendfactor(rt->alpha_src_factor, cso->alpha_to_one));
+         att.dstAlphaBlendFactor = blend_factor(fix_blendfactor(rt->alpha_dst_factor, cso->alpha_to_one));
          att.alphaBlendOp = blend_op(rt->alpha_func);
 
          if (need_blend_constants(rt->rgb_src_factor) ||



More information about the mesa-commit mailing list