[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