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 <dev@lynxeye.de>
Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
This commit is contained in:
Lucas Stach
2017-06-05 21:11:02 +02:00
committed by Christian Gmeiner
parent 1bd0acab21
commit 629003b5b8
4 changed files with 45 additions and 14 deletions
@@ -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;
}
@@ -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
@@ -126,6 +126,7 @@ struct etna_specs {
/* Compiled pipe_blend_color */
struct compiled_blend_color {
float color[4];
uint32_t PE_ALPHA_BLEND_COLOR;
};
+3 -14
View File
@@ -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,
}
};