diff --git a/src/gallium/drivers/etnaviv/etnaviv_blend.c b/src/gallium/drivers/etnaviv/etnaviv_blend.c index 46ebe3bfaaf..c6d90eac02b 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blend.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blend.c @@ -78,7 +78,7 @@ etna_blend_state_create(struct pipe_context *pctx, rt0->rgb_func == rt0->alpha_func); if (alpha_enable) { - co->PE_ALPHA_CONFIG = + co->rt[0].PE_ALPHA_CONFIG = VIVS_PE_ALPHA_CONFIG_BLEND_ENABLE_COLOR | COND(separate_alpha, VIVS_PE_ALPHA_CONFIG_BLEND_SEPARATE_ALPHA) | VIVS_PE_ALPHA_CONFIG_SRC_FUNC_COLOR(translate_blend_factor(rt0->rgb_src_factor)) | @@ -88,7 +88,7 @@ etna_blend_state_create(struct pipe_context *pctx, VIVS_PE_ALPHA_CONFIG_EQ_COLOR(rt0->rgb_func) | VIVS_PE_ALPHA_CONFIG_EQ_ALPHA(rt0->alpha_func); } else { - co->PE_ALPHA_CONFIG = 0; + co->rt[0].PE_ALPHA_CONFIG = 0; } logicop_enable = so->logicop_enable && @@ -99,7 +99,7 @@ etna_blend_state_create(struct pipe_context *pctx, VIVS_PE_LOGIC_OP_DITHER_MODE(3) | /* TODO: related to dithering, sometimes 2 */ 0x000E4000 /* ??? */; - co->fo_allowed = !alpha_enable && !logicop_enable; + co->rt[0].fo_allowed = !alpha_enable && !logicop_enable; /* independent_blend_enable not needed: only one rt supported */ /* XXX alpha_to_coverage / alpha_to_one? */ @@ -147,9 +147,9 @@ etna_update_blend(struct etna_context *ctx) */ if (pfb->cbufs[0]) desc = util_format_description(pfb->cbufs[0]->format); - bool full_overwrite = !pfb->cbufs[0] || ((blend->fo_allowed && + bool full_overwrite = !pfb->cbufs[0] || ((blend->rt[0].fo_allowed && util_format_colormask_full(desc, colormask))); - blend->PE_COLOR_FORMAT = + blend->rt[0].PE_COLOR_FORMAT = VIVS_PE_COLOR_FORMAT_COMPONENTS(colormask) | COND(full_overwrite, VIVS_PE_COLOR_FORMAT_OVERWRITE); diff --git a/src/gallium/drivers/etnaviv/etnaviv_blend.h b/src/gallium/drivers/etnaviv/etnaviv_blend.h index de04a9d5e67..09afc6e1e07 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blend.h +++ b/src/gallium/drivers/etnaviv/etnaviv_blend.h @@ -32,13 +32,16 @@ struct etna_context; -struct etna_blend_state { - struct pipe_blend_state base; - - bool fo_allowed; - +struct etna_rt_blend_state { uint32_t PE_ALPHA_CONFIG; uint32_t PE_COLOR_FORMAT; + bool fo_allowed : 1; +}; + +struct etna_blend_state { + struct pipe_blend_state base; + struct etna_rt_blend_state rt[PIPE_MAX_COLOR_BUFS]; + uint32_t PE_LOGIC_OP; uint32_t PE_DITHER[2]; }; diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.c b/src/gallium/drivers/etnaviv/etnaviv_emit.c index 033cfb45c65..33907112edb 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_emit.c +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.c @@ -474,7 +474,7 @@ etna_emit_state(struct etna_context *ctx) /*01424*/ EMIT_STATE(PE_ALPHA_BLEND_COLOR, ctx->blend_color.PE_ALPHA_BLEND_COLOR); } if (unlikely(dirty & (ETNA_DIRTY_BLEND))) { - uint32_t val = etna_blend_state(ctx->blend)->PE_ALPHA_CONFIG; + uint32_t val = etna_blend_state(ctx->blend)->rt[0].PE_ALPHA_CONFIG; /*01428*/ EMIT_STATE(PE_ALPHA_CONFIG, val); } if (unlikely(dirty & (ETNA_DIRTY_BLEND | ETNA_DIRTY_FRAMEBUFFER))) { @@ -483,7 +483,7 @@ etna_emit_state(struct etna_context *ctx) * as a mask to enable the bits from blend PE_COLOR_FORMAT */ val = ~(VIVS_PE_COLOR_FORMAT_COMPONENTS__MASK | VIVS_PE_COLOR_FORMAT_OVERWRITE); - val |= etna_blend_state(ctx->blend)->PE_COLOR_FORMAT; + val |= etna_blend_state(ctx->blend)->rt[0].PE_COLOR_FORMAT; val &= ctx->framebuffer.PE_COLOR_FORMAT; /*0142C*/ EMIT_STATE(PE_COLOR_FORMAT, val); }