freedreno/a2xx: fix SRC_ALPHA_SATURATE for alpha blend function
authorJonathan Marek <jonathan@marek.ca>
Thu, 5 Sep 2019 02:36:00 +0000 (22:36 -0400)
committerJonathan Marek <jonathan@marek.ca>
Fri, 6 Sep 2019 02:24:29 +0000 (02:24 +0000)
Fixes failures in the following deqp tests:
dEQP-GLES2.functional.fragment_ops.*src_alpha_saturate*

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/gallium/drivers/freedreno/a2xx/fd2_blend.c

index 223eec9f592b421bc416d9249a1ccbffd0ece969..8e03e840fcb66735209598f89d5a9e68a4b8df07 100644 (file)
@@ -83,8 +83,13 @@ fd2_blend_state_create(struct pipe_context *pctx,
                A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN(blend_func(rt->rgb_func)) |
                A2XX_RB_BLEND_CONTROL_COLOR_DESTBLEND(fd_blend_factor(rt->rgb_dst_factor));
 
+       /* hardware doesn't support SRC_ALPHA_SATURATE for alpha, but it is equivalent to ONE */
+       unsigned alpha_src_factor = rt->alpha_src_factor;
+       if (alpha_src_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE)
+               alpha_src_factor = PIPE_BLENDFACTOR_ONE;
+
        so->rb_blendcontrol_alpha =
-               A2XX_RB_BLEND_CONTROL_ALPHA_SRCBLEND(fd_blend_factor(rt->alpha_src_factor)) |
+               A2XX_RB_BLEND_CONTROL_ALPHA_SRCBLEND(fd_blend_factor(alpha_src_factor)) |
                A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN(blend_func(rt->alpha_func)) |
                A2XX_RB_BLEND_CONTROL_ALPHA_DESTBLEND(fd_blend_factor(rt->alpha_dst_factor));