summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/vc5/vc5_context.h8
-rw-r--r--src/gallium/drivers/vc5/vc5_emit.c22
-rw-r--r--src/gallium/drivers/vc5/vc5_state.c4
3 files changed, 27 insertions, 7 deletions
diff --git a/src/gallium/drivers/vc5/vc5_context.h b/src/gallium/drivers/vc5/vc5_context.h
index 99d170b7dc0..22920278192 100644
--- a/src/gallium/drivers/vc5/vc5_context.h
+++ b/src/gallium/drivers/vc5/vc5_context.h
@@ -345,6 +345,14 @@ struct vc5_context {
*/
uint8_t swap_color_rb;
+ /* Per render target, whether we should treat the dst alpha values as
+ * one in blending.
+ *
+ * For RGBX formats, the tile buffer's alpha channel will be
+ * undefined.
+ */
+ uint8_t blend_dst_alpha_one;
+
struct pipe_poly_stipple stipple;
struct pipe_clip_state clip;
struct pipe_viewport_state viewport;
diff --git a/src/gallium/drivers/vc5/vc5_emit.c b/src/gallium/drivers/vc5/vc5_emit.c
index 1368d34729a..83ea3c475b2 100644
--- a/src/gallium/drivers/vc5/vc5_emit.c
+++ b/src/gallium/drivers/vc5/vc5_emit.c
@@ -28,7 +28,7 @@
#include "broadcom/compiler/v3d_compiler.h"
static uint8_t
-vc5_factor(enum pipe_blendfactor factor)
+vc5_factor(enum pipe_blendfactor factor, bool dst_alpha_one)
{
/* We may get a bad blendfactor when blending is disabled. */
if (factor == 0)
@@ -52,9 +52,13 @@ vc5_factor(enum pipe_blendfactor factor)
case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
return V3D_BLEND_FACTOR_INV_SRC_ALPHA;
case PIPE_BLENDFACTOR_DST_ALPHA:
- return V3D_BLEND_FACTOR_DST_ALPHA;
+ return (dst_alpha_one ?
+ V3D_BLEND_FACTOR_ONE :
+ V3D_BLEND_FACTOR_DST_ALPHA);
case PIPE_BLENDFACTOR_INV_DST_ALPHA:
- return V3D_BLEND_FACTOR_INV_DST_ALPHA;
+ return (dst_alpha_one ?
+ V3D_BLEND_FACTOR_ZERO :
+ V3D_BLEND_FACTOR_INV_DST_ALPHA);
case PIPE_BLENDFACTOR_CONST_COLOR:
return V3D_BLEND_FACTOR_CONST_COLOR;
case PIPE_BLENDFACTOR_INV_CONST_COLOR:
@@ -327,15 +331,19 @@ vc5_emit_state(struct pipe_context *pctx)
config.colour_blend_mode = rtblend->rgb_func;
config.colour_blend_dst_factor =
- vc5_factor(rtblend->rgb_dst_factor);
+ vc5_factor(rtblend->rgb_dst_factor,
+ vc5->blend_dst_alpha_one);
config.colour_blend_src_factor =
- vc5_factor(rtblend->rgb_src_factor);
+ vc5_factor(rtblend->rgb_src_factor,
+ vc5->blend_dst_alpha_one);
config.alpha_blend_mode = rtblend->alpha_func;
config.alpha_blend_dst_factor =
- vc5_factor(rtblend->alpha_dst_factor);
+ vc5_factor(rtblend->alpha_dst_factor,
+ vc5->blend_dst_alpha_one);
config.alpha_blend_src_factor =
- vc5_factor(rtblend->alpha_src_factor);
+ vc5_factor(rtblend->alpha_src_factor,
+ vc5->blend_dst_alpha_one);
}
cl_emit(&job->bcl, COLOUR_WRITE_MASKS, mask) {
diff --git a/src/gallium/drivers/vc5/vc5_state.c b/src/gallium/drivers/vc5/vc5_state.c
index a7717b30dfb..db921d63f36 100644
--- a/src/gallium/drivers/vc5/vc5_state.c
+++ b/src/gallium/drivers/vc5/vc5_state.c
@@ -389,6 +389,7 @@ vc5_set_framebuffer_state(struct pipe_context *pctx,
cso->height = framebuffer->height;
vc5->swap_color_rb = 0;
+ vc5->blend_dst_alpha_one = 0;
for (int i = 0; i < vc5->framebuffer.nr_cbufs; i++) {
struct pipe_surface *cbuf = vc5->framebuffer.cbufs[i];
const struct util_format_description *desc =
@@ -401,6 +402,9 @@ vc5_set_framebuffer_state(struct pipe_context *pctx,
cbuf->format != PIPE_FORMAT_B5G6R5_UNORM) {
vc5->swap_color_rb |= 1 << i;
}
+
+ if (desc->swizzle[3] == PIPE_SWIZZLE_1)
+ vc5->blend_dst_alpha_one |= 1 << i;
}
vc5->dirty |= VC5_DIRTY_FRAMEBUFFER;