freedreno: use PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND
authorRob Clark <robdclark@chromium.org>
Fri, 17 Jan 2020 21:58:44 +0000 (13:58 -0800)
committerMarge Bot <eric+marge@anholt.net>
Wed, 29 Jan 2020 11:21:47 +0000 (11:21 +0000)
This lets us drop a bunch of special handling for xRGB blend.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3565>

16 files changed:
src/gallium/drivers/freedreno/a2xx/fd2_blend.c
src/gallium/drivers/freedreno/a2xx/fd2_blend.h
src/gallium/drivers/freedreno/a2xx/fd2_emit.c
src/gallium/drivers/freedreno/a3xx/fd3_blend.c
src/gallium/drivers/freedreno/a3xx/fd3_blend.h
src/gallium/drivers/freedreno/a3xx/fd3_emit.c
src/gallium/drivers/freedreno/a4xx/fd4_blend.c
src/gallium/drivers/freedreno/a4xx/fd4_blend.h
src/gallium/drivers/freedreno/a4xx/fd4_emit.c
src/gallium/drivers/freedreno/a5xx/fd5_blend.c
src/gallium/drivers/freedreno/a5xx/fd5_blend.h
src/gallium/drivers/freedreno/a5xx/fd5_emit.c
src/gallium/drivers/freedreno/a6xx/fd6_blend.c
src/gallium/drivers/freedreno/a6xx/fd6_blend.h
src/gallium/drivers/freedreno/a6xx/fd6_emit.c
src/gallium/drivers/freedreno/freedreno_screen.c

index 8e03e840fcb66735209598f89d5a9e68a4b8df07..7593eaae482586c648ff7ebdf6ecb53cc2900c74 100644 (file)
@@ -78,7 +78,7 @@ fd2_blend_state_create(struct pipe_context *pctx,
 
        so->rb_colorcontrol = A2XX_RB_COLORCONTROL_ROP_CODE(rop);
 
-       so->rb_blendcontrol_rgb =
+       so->rb_blendcontrol =
                A2XX_RB_BLEND_CONTROL_COLOR_SRCBLEND(fd_blend_factor(rt->rgb_src_factor)) |
                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));
@@ -88,16 +88,11 @@ fd2_blend_state_create(struct pipe_context *pctx,
        if (alpha_src_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE)
                alpha_src_factor = PIPE_BLENDFACTOR_ONE;
 
-       so->rb_blendcontrol_alpha =
+       so->rb_blendcontrol |=
                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));
 
-       so->rb_blendcontrol_no_alpha_rgb =
-               A2XX_RB_BLEND_CONTROL_COLOR_SRCBLEND(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_src_factor))) |
-               A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN(blend_func(rt->rgb_func)) |
-               A2XX_RB_BLEND_CONTROL_COLOR_DESTBLEND(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_dst_factor)));
-
        if (rt->colormask & PIPE_MASK_R)
                so->rb_colormask |= A2XX_RB_COLOR_MASK_WRITE_RED;
        if (rt->colormask & PIPE_MASK_G)
index fd78519464f306280483bc52e0fc019a4c9a737c..9fe6e6e248e2d787ae2ae6263a47a58c356a576b 100644 (file)
@@ -32,9 +32,7 @@
 
 struct fd2_blend_stateobj {
        struct pipe_blend_state base;
-       uint32_t rb_blendcontrol_rgb;
-       uint32_t rb_blendcontrol_alpha;
-       uint32_t rb_blendcontrol_no_alpha_rgb;
+       uint32_t rb_blendcontrol;
        uint32_t rb_colorcontrol;   /* must be OR'd w/ zsa->rb_colorcontrol */
        uint32_t rb_colormask;
 };
index 227ba86ed81840eda0f091a6b442825e08b9a033..a463507cda14aa197772484b359ee14a1793c65b 100644 (file)
@@ -217,15 +217,9 @@ fd2_emit_state_binning(struct fd_context *ctx, const enum fd_dirty_3d_state dirt
 
        /* not sure why this is needed */
        if (dirty & (FD_DIRTY_BLEND | FD_DIRTY_FRAMEBUFFER)) {
-               enum pipe_format format =
-                       pipe_surface_format(ctx->batch->framebuffer.cbufs[0]);
-               bool has_alpha = util_format_has_alpha(format);
-
                OUT_PKT3(ring, CP_SET_CONSTANT, 2);
                OUT_RING(ring, CP_REG(REG_A2XX_RB_BLEND_CONTROL));
-               OUT_RING(ring, blend->rb_blendcontrol_alpha |
-                       COND(has_alpha, blend->rb_blendcontrol_rgb) |
-                       COND(!has_alpha, blend->rb_blendcontrol_no_alpha_rgb));
+               OUT_RING(ring, blend->rb_blendcontrol);
 
                OUT_PKT3(ring, CP_SET_CONSTANT, 2);
                OUT_RING(ring, CP_REG(REG_A2XX_RB_COLOR_MASK));
@@ -376,15 +370,9 @@ fd2_emit_state(struct fd_context *ctx, const enum fd_dirty_3d_state dirty)
        }
 
        if (dirty & (FD_DIRTY_BLEND | FD_DIRTY_FRAMEBUFFER)) {
-               enum pipe_format format =
-                       pipe_surface_format(ctx->batch->framebuffer.cbufs[0]);
-               bool has_alpha = util_format_has_alpha(format);
-
                OUT_PKT3(ring, CP_SET_CONSTANT, 2);
                OUT_RING(ring, CP_REG(REG_A2XX_RB_BLEND_CONTROL));
-               OUT_RING(ring, blend->rb_blendcontrol_alpha |
-                       COND(has_alpha, blend->rb_blendcontrol_rgb) |
-                       COND(!has_alpha, blend->rb_blendcontrol_no_alpha_rgb));
+               OUT_RING(ring, blend->rb_blendcontrol);
 
                OUT_PKT3(ring, CP_SET_CONSTANT, 2);
                OUT_RING(ring, CP_REG(REG_A2XX_RB_COLOR_MASK));
index ec1dff3e17b0c8d8d28968381cf98acc6a582899..383e557f18ea33b06122892935cdcabe759ad6ae 100644 (file)
@@ -98,21 +98,14 @@ fd3_blend_state_create(struct pipe_context *pctx,
                else
                        rt = &cso->rt[0];
 
-               so->rb_mrt[i].blend_control_rgb =
+               so->rb_mrt[i].blend_control =
                                A3XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(rt->rgb_src_factor)) |
                                A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A3XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor));
-
-               so->rb_mrt[i].blend_control_alpha =
+                               A3XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor)) |
                                A3XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(fd_blend_factor(rt->alpha_src_factor)) |
                                A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(blend_func(rt->alpha_func)) |
                                A3XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor));
 
-               so->rb_mrt[i].blend_control_no_alpha_rgb =
-                               A3XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_src_factor))) |
-                               A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A3XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_dst_factor)));
-
                so->rb_mrt[i].control =
                                A3XX_RB_MRT_CONTROL_ROP_CODE(rop) |
                                A3XX_RB_MRT_CONTROL_COMPONENT_ENABLE(rt->colormask);
index df249245a6a06c10167ce5fefeaa3130caf8b8aa..61fbeda594b38b66b11d7ba72e07cf55add62f71 100644 (file)
@@ -36,12 +36,7 @@ struct fd3_blend_stateobj {
        struct pipe_blend_state base;
        uint32_t rb_render_control;
        struct {
-               /* Blend control bits for color if there is an alpha channel */
-               uint32_t blend_control_rgb;
-               /* Blend control bits for color if there is no alpha channel */
-               uint32_t blend_control_no_alpha_rgb;
-               /* Blend control bits for alpha channel */
-               uint32_t blend_control_alpha;
+               uint32_t blend_control;
                uint32_t control;
        } rb_mrt[A3XX_MAX_RENDER_TARGETS];
 };
index af1478599420f1eb19ace7e2ac0db756afef2305..6509435636c2730c9fcd3d7f9bc8ab44914af8c6 100644 (file)
@@ -735,7 +735,6 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        bool is_int = util_format_is_pure_integer(format);
                        bool has_alpha = util_format_has_alpha(format);
                        uint32_t control = blend->rb_mrt[i].control;
-                       uint32_t blend_control = blend->rb_mrt[i].blend_control_alpha;
 
                        if (is_int) {
                                control &= (A3XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK |
@@ -746,10 +745,7 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        if (format == PIPE_FORMAT_NONE)
                                control &= ~A3XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK;
 
-                       if (has_alpha) {
-                               blend_control |= blend->rb_mrt[i].blend_control_rgb;
-                       } else {
-                               blend_control |= blend->rb_mrt[i].blend_control_no_alpha_rgb;
+                       if (!has_alpha) {
                                control &= ~A3XX_RB_MRT_CONTROL_BLEND2;
                        }
 
@@ -769,7 +765,7 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        OUT_RING(ring, control);
 
                        OUT_PKT0(ring, REG_A3XX_RB_MRT_BLEND_CONTROL(i), 1);
-                       OUT_RING(ring, blend_control |
+                       OUT_RING(ring, blend->rb_mrt[i].blend_control |
                                        COND(!is_float, A3XX_RB_MRT_BLEND_CONTROL_CLAMP_ENABLE));
                }
        }
index 6c9fb3dd49ac0c0f202136059f8f0344ba094dc3..9a728088192c13d735ec51f13cadcd401987840e 100644 (file)
@@ -97,22 +97,14 @@ fd4_blend_state_create(struct pipe_context *pctx,
                else
                        rt = &cso->rt[0];
 
-               so->rb_mrt[i].blend_control_rgb =
+               so->rb_mrt[i].blend_control =
                                A4XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(rt->rgb_src_factor)) |
                                A4XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A4XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor));
-
-               so->rb_mrt[i].blend_control_alpha =
+                               A4XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor)) |
                                A4XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(fd_blend_factor(rt->alpha_src_factor)) |
                                A4XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(blend_func(rt->alpha_func)) |
                                A4XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor));
 
-               so->rb_mrt[i].blend_control_no_alpha_rgb =
-                               A4XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_src_factor))) |
-                               A4XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A4XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_dst_factor)));
-
-
                so->rb_mrt[i].control =
                                A4XX_RB_MRT_CONTROL_ROP_CODE(rop) |
                                COND(cso->logicop_enable, A4XX_RB_MRT_CONTROL_ROP_ENABLE) |
index 0db0b35a0083356a7cdb786b1152101648e719ed..74364ce1fdc1b76da63e9a60a9dcc730b46652ab 100644 (file)
@@ -37,12 +37,7 @@ struct fd4_blend_stateobj {
        struct {
                uint32_t control;
                uint32_t buf_info;
-               /* Blend control bits for color if there is an alpha channel */
-               uint32_t blend_control_rgb;
-               /* Blend control bits for color if there is no alpha channel */
-               uint32_t blend_control_no_alpha_rgb;
-               /* Blend control bits for alpha channel */
-               uint32_t blend_control_alpha;
+               uint32_t blend_control;
        } rb_mrt[A4XX_MAX_RENDER_TARGETS];
        uint32_t rb_fs_output;
 };
index 7a188c68afcac21e05396d3350361f79ce16c0ef..8d07ceff9bbdec1ddbf783be10ef5b48cf636b93 100644 (file)
@@ -697,17 +697,13 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        bool is_int = util_format_is_pure_integer(format);
                        bool has_alpha = util_format_has_alpha(format);
                        uint32_t control = blend->rb_mrt[i].control;
-                       uint32_t blend_control = blend->rb_mrt[i].blend_control_alpha;
 
                        if (is_int) {
                                control &= A4XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK;
                                control |= A4XX_RB_MRT_CONTROL_ROP_CODE(ROP_COPY);
                        }
 
-                       if (has_alpha) {
-                               blend_control |= blend->rb_mrt[i].blend_control_rgb;
-                       } else {
-                               blend_control |= blend->rb_mrt[i].blend_control_no_alpha_rgb;
+                       if (!has_alpha) {
                                control &= ~A4XX_RB_MRT_CONTROL_BLEND2;
                        }
 
@@ -715,7 +711,7 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        OUT_RING(ring, control);
 
                        OUT_PKT0(ring, REG_A4XX_RB_MRT_BLEND_CONTROL(i), 1);
-                       OUT_RING(ring, blend_control);
+                       OUT_RING(ring, blend->rb_mrt[i].blend_control);
                }
 
                OUT_PKT0(ring, REG_A4XX_RB_FS_OUTPUT, 1);
index fee6ba346b769d1882cdef77cefb6f7ea27c6a44..a7efcca6187fe2049b4963a99d5c43f2ea8d2513 100644 (file)
@@ -100,22 +100,14 @@ fd5_blend_state_create(struct pipe_context *pctx,
                else
                        rt = &cso->rt[0];
 
-               so->rb_mrt[i].blend_control_rgb =
+               so->rb_mrt[i].blend_control =
                                A5XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(rt->rgb_src_factor)) |
                                A5XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A5XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor));
-
-               so->rb_mrt[i].blend_control_alpha =
+                               A5XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor)) |
                                A5XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(fd_blend_factor(rt->alpha_src_factor)) |
                                A5XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(blend_func(rt->alpha_func)) |
                                A5XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor));
 
-               so->rb_mrt[i].blend_control_no_alpha_rgb =
-                               A5XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_src_factor))) |
-                               A5XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A5XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_dst_factor)));
-
-
                so->rb_mrt[i].control =
                                A5XX_RB_MRT_CONTROL_ROP_CODE(rop) |
                                COND(cso->logicop_enable, A5XX_RB_MRT_CONTROL_ROP_ENABLE) |
index 6985495485719e97650087e025aefa68447acd83..10cbbaa906c83500dea224263a7ab8e830fad4ed 100644 (file)
@@ -38,12 +38,7 @@ struct fd5_blend_stateobj {
        struct {
                uint32_t control;
                uint32_t buf_info;
-               /* Blend control bits for color if there is an alpha channel */
-               uint32_t blend_control_rgb;
-               /* Blend control bits for color if there is no alpha channel */
-               uint32_t blend_control_no_alpha_rgb;
-               /* Blend control bits for alpha channel */
-               uint32_t blend_control_alpha;
+               uint32_t blend_control;
        } rb_mrt[A5XX_MAX_RENDER_TARGETS];
        uint32_t rb_blend_cntl;
        uint32_t sp_blend_cntl;
index 9b337d33de22df8e8524f302de619d4d0f0b49b3..5bd429ef61abff0faad7e3498589322a7032fef3 100644 (file)
@@ -725,17 +725,13 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        bool is_int = util_format_is_pure_integer(format);
                        bool has_alpha = util_format_has_alpha(format);
                        uint32_t control = blend->rb_mrt[i].control;
-                       uint32_t blend_control = blend->rb_mrt[i].blend_control_alpha;
 
                        if (is_int) {
                                control &= A5XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK;
                                control |= A5XX_RB_MRT_CONTROL_ROP_CODE(ROP_COPY);
                        }
 
-                       if (has_alpha) {
-                               blend_control |= blend->rb_mrt[i].blend_control_rgb;
-                       } else {
-                               blend_control |= blend->rb_mrt[i].blend_control_no_alpha_rgb;
+                       if (!has_alpha) {
                                control &= ~A5XX_RB_MRT_CONTROL_BLEND2;
                        }
 
@@ -743,7 +739,7 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        OUT_RING(ring, control);
 
                        OUT_PKT4(ring, REG_A5XX_RB_MRT_BLEND_CONTROL(i), 1);
-                       OUT_RING(ring, blend_control);
+                       OUT_RING(ring, blend->rb_mrt[i].blend_control);
                }
 
                OUT_PKT4(ring, REG_A5XX_SP_BLEND_CNTL, 1);
index 6f1ea5e2f794915014008f66293f5f14ca974c92..0a9d5f4acc1f9dbf5745c6ce9d34c51c123e4081 100644 (file)
@@ -101,22 +101,14 @@ fd6_blend_state_create(struct pipe_context *pctx,
                else
                        rt = &cso->rt[0];
 
-               so->rb_mrt[i].blend_control_rgb =
+               so->rb_mrt[i].blend_control=
                                A6XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(rt->rgb_src_factor)) |
                                A6XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A6XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor));
-
-               so->rb_mrt[i].blend_control_alpha =
+                               A6XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor)) |
                                A6XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(fd_blend_factor(rt->alpha_src_factor)) |
                                A6XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(blend_func(rt->alpha_func)) |
                                A6XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor));
 
-               so->rb_mrt[i].blend_control_no_alpha_rgb =
-                               A6XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_src_factor))) |
-                               A6XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(blend_func(rt->rgb_func)) |
-                               A6XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(util_blend_dst_alpha_to_one(rt->rgb_dst_factor)));
-
-
                so->rb_mrt[i].control =
                                A6XX_RB_MRT_CONTROL_ROP_CODE(rop) |
                                COND(cso->logicop_enable, A6XX_RB_MRT_CONTROL_ROP_ENABLE) |
index e207000bed14514dce3795a1fce12f6747028bc6..878178d0ec769361c4fdc39201651c55544b081f 100644 (file)
@@ -31,6 +31,7 @@
 #include "pipe/p_state.h"
 #include "pipe/p_context.h"
 
+#include "freedreno_context.h"
 #include "freedreno_util.h"
 
 struct fd6_blend_stateobj {
@@ -39,12 +40,7 @@ struct fd6_blend_stateobj {
        struct {
                uint32_t control;
                uint32_t buf_info;
-               /* Blend control bits for color if there is an alpha channel */
-               uint32_t blend_control_rgb;
-               /* Blend control bits for color if there is no alpha channel */
-               uint32_t blend_control_no_alpha_rgb;
-               /* Blend control bits for alpha channel */
-               uint32_t blend_control_alpha;
+               uint32_t blend_control;
        } rb_mrt[A6XX_MAX_RENDER_TARGETS];
        uint32_t rb_blend_cntl;
        uint32_t rb_dither_cntl;
index 9fb0125409e44d031f21c16f42140f409754e060..087b537f10f04836396215971454e58cf91eaea8 100644 (file)
@@ -1082,17 +1082,13 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                        bool is_int = util_format_is_pure_integer(format);
                        bool has_alpha = util_format_has_alpha(format);
                        uint32_t control = blend->rb_mrt[i].control;
-                       uint32_t blend_control = blend->rb_mrt[i].blend_control_alpha;
 
                        if (is_int) {
                                control &= A6XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK;
                                control |= A6XX_RB_MRT_CONTROL_ROP_CODE(ROP_COPY);
                        }
 
-                       if (has_alpha) {
-                               blend_control |= blend->rb_mrt[i].blend_control_rgb;
-                       } else {
-                               blend_control |= blend->rb_mrt[i].blend_control_no_alpha_rgb;
+                       if (!has_alpha) {
                                control &= ~A6XX_RB_MRT_CONTROL_BLEND2;
                        }
 
@@ -1100,7 +1096,7 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                        OUT_RING(ring, control);
 
                        OUT_PKT4(ring, REG_A6XX_RB_MRT_BLEND_CONTROL(i), 1);
-                       OUT_RING(ring, blend_control);
+                       OUT_RING(ring, blend->rb_mrt[i].blend_control);
                }
 
                OUT_PKT4(ring, REG_A6XX_RB_DITHER_CNTL, 1);
index d467cae6b002ea281e86358bb12cb650f96593fb..9bdc0cc260cc006b8fc58acc375fa1068601c9e1 100644 (file)
@@ -197,6 +197,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
        case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
        case PIPE_CAP_TEXTURE_BARRIER:
        case PIPE_CAP_INVALIDATE_BUFFER:
+       case PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND:
                return 1;
 
        case PIPE_CAP_PACKED_UNIFORMS: