From: Lucas Stach Date: Mon, 5 Jun 2017 19:11:02 +0000 (+0200) Subject: etnaviv: fix blend color for RB swapped rendertargets X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=629003b5b841380ccad1b369507924c9946bb00a;p=mesa.git etnaviv: fix blend color for RB swapped rendertargets Same as with the colormasks, the blend color needs to be swizzled according to the rendertarget format. Signed-off-by: Lucas Stach Reviewed-by: Wladimir J. van der Laan Reviewed-by: Christian Gmeiner --- diff --git a/src/gallium/drivers/etnaviv/etnaviv_blend.c b/src/gallium/drivers/etnaviv/etnaviv_blend.c index 8ea09a37ae7..6ed0e0f3fc7 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blend.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blend.c @@ -129,3 +129,38 @@ etna_update_blend(struct etna_context *ctx) return true; } + +void +etna_set_blend_color(struct pipe_context *pctx, const struct pipe_blend_color *bc) +{ + struct etna_context *ctx = etna_context(pctx); + struct compiled_blend_color *cs = &ctx->blend_color; + + memcpy(cs->color, bc->color, sizeof(float) * 4); + + ctx->dirty |= ETNA_DIRTY_BLEND_COLOR; +} + +bool +etna_update_blend_color(struct etna_context *ctx) +{ + struct pipe_framebuffer_state *pfb = &ctx->framebuffer_s; + struct compiled_blend_color *cs = &ctx->blend_color; + + if (pfb->cbufs[0] && + translate_rs_format_rb_swap(pfb->cbufs[0]->texture->format)) { + cs->PE_ALPHA_BLEND_COLOR = + VIVS_PE_ALPHA_BLEND_COLOR_R(etna_cfloat_to_uint8(cs->color[2])) | + VIVS_PE_ALPHA_BLEND_COLOR_G(etna_cfloat_to_uint8(cs->color[1])) | + VIVS_PE_ALPHA_BLEND_COLOR_B(etna_cfloat_to_uint8(cs->color[0])) | + VIVS_PE_ALPHA_BLEND_COLOR_A(etna_cfloat_to_uint8(cs->color[3])); + } else { + cs->PE_ALPHA_BLEND_COLOR = + VIVS_PE_ALPHA_BLEND_COLOR_R(etna_cfloat_to_uint8(cs->color[0])) | + VIVS_PE_ALPHA_BLEND_COLOR_G(etna_cfloat_to_uint8(cs->color[1])) | + VIVS_PE_ALPHA_BLEND_COLOR_B(etna_cfloat_to_uint8(cs->color[2])) | + VIVS_PE_ALPHA_BLEND_COLOR_A(etna_cfloat_to_uint8(cs->color[3])); + } + + return true; +} diff --git a/src/gallium/drivers/etnaviv/etnaviv_blend.h b/src/gallium/drivers/etnaviv/etnaviv_blend.h index e26864d409f..c21939603d1 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blend.h +++ b/src/gallium/drivers/etnaviv/etnaviv_blend.h @@ -56,4 +56,10 @@ etna_blend_state_create(struct pipe_context *pctx, bool etna_update_blend(struct etna_context *ctx); +void +etna_set_blend_color(struct pipe_context *pctx, const struct pipe_blend_color *bc); + +bool +etna_update_blend_color(struct etna_context *ctx); + #endif diff --git a/src/gallium/drivers/etnaviv/etnaviv_internal.h b/src/gallium/drivers/etnaviv/etnaviv_internal.h index 2f8dacbce5f..1212fdfa310 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_internal.h +++ b/src/gallium/drivers/etnaviv/etnaviv_internal.h @@ -126,6 +126,7 @@ struct etna_specs { /* Compiled pipe_blend_color */ struct compiled_blend_color { + float color[4]; uint32_t PE_ALPHA_BLEND_COLOR; }; diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index fb7bb0f4c50..fc3d9f108fa 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -42,20 +42,6 @@ #include "util/u_math.h" #include "util/u_memory.h" -static void -etna_set_blend_color(struct pipe_context *pctx, const struct pipe_blend_color *bc) -{ - struct etna_context *ctx = etna_context(pctx); - struct compiled_blend_color *cs = &ctx->blend_color; - - cs->PE_ALPHA_BLEND_COLOR = - VIVS_PE_ALPHA_BLEND_COLOR_R(etna_cfloat_to_uint8(bc->color[0])) | - VIVS_PE_ALPHA_BLEND_COLOR_G(etna_cfloat_to_uint8(bc->color[1])) | - VIVS_PE_ALPHA_BLEND_COLOR_B(etna_cfloat_to_uint8(bc->color[2])) | - VIVS_PE_ALPHA_BLEND_COLOR_A(etna_cfloat_to_uint8(bc->color[3])); - ctx->dirty |= ETNA_DIRTY_BLEND_COLOR; -} - static void etna_set_stencil_ref(struct pipe_context *pctx, const struct pipe_stencil_ref *sr) { @@ -600,6 +586,9 @@ static const struct etna_state_updater etna_state_updates[] = { }, { etna_update_blend, ETNA_DIRTY_BLEND | ETNA_DIRTY_FRAMEBUFFER + }, + { + etna_update_blend_color, ETNA_DIRTY_BLEND_COLOR | ETNA_DIRTY_FRAMEBUFFER, } };