virgl: Use alpha_src_factor to store blend_equation_advenced value
authorElie Tournier <tournier.elie@gmail.com>
Wed, 24 Jun 2020 20:43:40 +0000 (21:43 +0100)
committerMarge Bot <eric+marge@anholt.net>
Fri, 17 Jul 2020 06:19:16 +0000 (06:19 +0000)
Signed-off-by: Elie Tournier <elie.tournier@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5516>

src/gallium/drivers/virgl/virgl_encode.c
src/gallium/include/pipe/p_state.h
src/mesa/state_tracker/st_atom_blend.c

index 292cc2b..8e65a90 100644 (file)
@@ -338,13 +338,19 @@ int virgl_encode_blend_state(struct virgl_context *ctx,
    virgl_encoder_write_dword(ctx->cbuf, tmp);
 
    for (i = 0; i < VIRGL_MAX_COLOR_BUFS; i++) {
+      /* We use alpha src factor to pass the advanced blend equation value
+       * to the host. By doing so, we don't have to change the protocol.
+       */
+      uint32_t alpha = (i == 0 && blend_state->advanced_blend_func)
+                        ? blend_state->advanced_blend_func
+                        : blend_state->rt[i].alpha_src_factor;
       tmp =
          VIRGL_OBJ_BLEND_S2_RT_BLEND_ENABLE(blend_state->rt[i].blend_enable) |
          VIRGL_OBJ_BLEND_S2_RT_RGB_FUNC(blend_state->rt[i].rgb_func) |
          VIRGL_OBJ_BLEND_S2_RT_RGB_SRC_FACTOR(blend_state->rt[i].rgb_src_factor) |
          VIRGL_OBJ_BLEND_S2_RT_RGB_DST_FACTOR(blend_state->rt[i].rgb_dst_factor)|
          VIRGL_OBJ_BLEND_S2_RT_ALPHA_FUNC(blend_state->rt[i].alpha_func) |
-         VIRGL_OBJ_BLEND_S2_RT_ALPHA_SRC_FACTOR(blend_state->rt[i].alpha_src_factor) |
+         VIRGL_OBJ_BLEND_S2_RT_ALPHA_SRC_FACTOR(alpha) |
          VIRGL_OBJ_BLEND_S2_RT_ALPHA_DST_FACTOR(blend_state->rt[i].alpha_dst_factor) |
          VIRGL_OBJ_BLEND_S2_RT_COLORMASK(blend_state->rt[i].colormask);
       virgl_encoder_write_dword(ctx->cbuf, tmp);
index b75906d..6f1d4c6 100644 (file)
@@ -365,6 +365,7 @@ struct pipe_blend_state
    unsigned alpha_to_coverage_dither:1;
    unsigned alpha_to_one:1;
    unsigned max_rt:3;            /* index of max rt, Ie. # of cbufs minus 1 */
+   unsigned advanced_blend_func:4;
    struct pipe_rt_blend_state rt[PIPE_MAX_COLOR_BUFS];
 };
 
index 1c53e34..9aefd6a 100644 (file)
@@ -218,6 +218,10 @@ st_update_blend( struct st_context *st )
       blend->logicop_func = ctx->Color._LogicOp;
    }
    else if (ctx->Color.BlendEnabled &&
+            ctx->Color._AdvancedBlendMode != BLEND_NONE) {
+      blend->advanced_blend_func = ctx->Color._AdvancedBlendMode;
+   }
+   else if (ctx->Color.BlendEnabled &&
             ctx->Color._AdvancedBlendMode == BLEND_NONE) {
       /* blending enabled */
       for (i = 0, j = 0; i < num_state; i++) {