[PATCH] etnaviv: fix blend color for RB swapped rendertargets
Christian Gmeiner
christian.gmeiner at gmail.com
Tue Jun 20 11:21:52 UTC 2017
Hi Lucas,
> this one is a logical follow-up to my piglit fixes series. Since the
> other patches have landed, it would be nice if you could also land this
> one.
>
thanks for the gentle ping :) Will 'process' it in the evening (and
will also have a
look at the other open patches on the ml).
greets
--
Christian Gmeiner, MSc
https://www.youtube.com/user/AloryOFFICIAL
https://soundcloud.com/christian-gmeiner
> Am Montag, den 05.06.2017, 21:11 +0200 schrieb Lucas Stach:
>> Same as with the colormasks, the blend color needs to be swizzled according
>> to the rendertarget format.
>>
>> Signed-off-by: Lucas Stach <dev at lynxeye.de>
>> ---
>> src/gallium/drivers/etnaviv/etnaviv_blend.c | 35 ++++++++++++++++++++++++++
>> src/gallium/drivers/etnaviv/etnaviv_blend.h | 6 +++++
>> src/gallium/drivers/etnaviv/etnaviv_internal.h | 1 +
>> 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 8ea09a3..6ed0e0f 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 e26864d..c219396 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 2f8dacb..1212fdf 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 fb7bb0f..fc3d9f1 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,
>> }
>> };
>>
>
>
More information about the etnaviv
mailing list