freedreno/a3xx: color masking works like a blend for some formats

When there is a colormask active that does not cover all the channels,
enable reading in the destination like with a combining blend
operation. This fixes fbo-blending-formats on a3xx.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Ilia Mirkin 2015-04-25 15:37:24 -04:00
parent 9fc3f47278
commit 52614f59b7
1 changed files with 14 additions and 0 deletions

View File

@ -704,6 +704,8 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
for (i = 0; i < ARRAY_SIZE(blend->rb_mrt); i++) {
enum pipe_format format = pipe_surface_format(ctx->framebuffer.cbufs[i]);
const struct util_format_description *desc =
util_format_description(format);
bool is_float = util_format_is_float(format);
bool is_int = util_format_is_pure_integer(format);
bool has_alpha = util_format_has_alpha(format);
@ -726,6 +728,18 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
control &= ~A3XX_RB_MRT_CONTROL_BLEND2;
}
if (format && util_format_get_component_bits(
format, UTIL_FORMAT_COLORSPACE_RGB, 0) < 8) {
const struct pipe_rt_blend_state *rt;
if (ctx->blend->independent_blend_enable)
rt = &ctx->blend->rt[i];
else
rt = &ctx->blend->rt[0];
if (!util_format_colormask_full(desc, rt->colormask))
control |= A3XX_RB_MRT_CONTROL_READ_DEST_ENABLE;
}
OUT_PKT0(ring, REG_A3XX_RB_MRT_CONTROL(i), 1);
OUT_RING(ring, control);