diff options
author | Lucas Stach <[email protected]> | 2017-06-05 21:11:02 +0200 |
---|---|---|
committer | Christian Gmeiner <[email protected]> | 2017-06-21 07:45:15 +0200 |
commit | 629003b5b841380ccad1b369507924c9946bb00a (patch) | |
tree | 28d8106cf180119588c3dc8721dd94c736759487 /src | |
parent | 1bd0acab21c250b263604a52ca6694941a6f02e0 (diff) |
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 <[email protected]>
Reviewed-by: Wladimir J. van der Laan <[email protected]>
Reviewed-by: Christian Gmeiner <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_blend.c | 35 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_blend.h | 6 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_internal.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_state.c | 17 |
4 files changed, 45 insertions, 14 deletions
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 @@ -43,20 +43,6 @@ #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) { struct etna_context *ctx = etna_context(pctx); @@ -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, } }; |