[Mesa-dev] [PATCH] st/mesa: Override blend factors involving alpha if it doesn't exist.
Ilia Mirkin
imirkin at alum.mit.edu
Sat Aug 25 14:46:28 UTC 2018
You have to make sure to flip blend->independent_blend_enable to 1 in
that case, and that will only work on some (well, most, but not all)
hardware. Pre-something Tesla-era and I assume r600-era gpu's must
have all rt's configured the same way.
I'm also not 100% sure that it's OK to access the draw buffers in
here, but Marek would know for sure -- he restructured the atoms logic
a while back, and I haven't re-learned the new scheme.
-ilia
On Sat, Aug 25, 2018 at 3:48 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> When faking an RGB format with an RGBA format, there may be a channel
> of data containing garbage. st/mesa already overrides texture swizzles
> to replace the A channel with ONE. This patch makes it override blend
> factors to achieve a similar effect.
>
> It appears that st_update_blend is already called when the framebuffer
> is changed, so it should be safe to look at the render target formats
> without adding additional state dependencies.
> ---
> src/mesa/state_tracker/st_atom_blend.c | 35 ++++++++++++++++++++++++++
> 1 file changed, 35 insertions(+)
>
> diff --git a/src/mesa/state_tracker/st_atom_blend.c b/src/mesa/state_tracker/st_atom_blend.c
> index 804de2f154f..3e6e4411107 100644
> --- a/src/mesa/state_tracker/st_atom_blend.c
> +++ b/src/mesa/state_tracker/st_atom_blend.c
> @@ -41,6 +41,7 @@
>
> #include "framebuffer.h"
> #include "main/blend.h"
> +#include "main/glformats.h"
> #include "main/macros.h"
>
> /**
> @@ -142,6 +143,28 @@ blend_per_rt(const struct gl_context *ctx, unsigned num_cb)
> return GL_FALSE;
> }
>
> +/**
> + * Modify blend function to force destination alpha to 1.0
> + *
> + * If \c function specifies a blend function that uses destination alpha,
> + * replace it with a function that hard-wires destination alpha to 1.0. This
> + * is used when rendering to xRGB targets.
> + */
> +static enum pipe_blendfactor
> +fix_xrgb_alpha(enum pipe_blendfactor factor)
> +{
> + switch (factor) {
> + case PIPE_BLENDFACTOR_DST_ALPHA:
> + return PIPE_BLENDFACTOR_ONE;
> +
> + case PIPE_BLENDFACTOR_INV_DST_ALPHA:
> + case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
> + return PIPE_BLENDFACTOR_ZERO;
> + default:
> + return factor;
> + }
> +}
> +
> void
> st_update_blend( struct st_context *st )
> {
> @@ -210,6 +233,18 @@ st_update_blend( struct st_context *st )
> blend->rt[i].alpha_dst_factor =
> translate_blend(ctx->Color.Blend[j].DstA);
> }
> +
> + const struct gl_renderbuffer *rb =
> + ctx->DrawBuffer->_ColorDrawBuffers[i];
> +
> + if (rb && !_mesa_base_format_has_channel(rb->_BaseFormat,
> + GL_TEXTURE_ALPHA_TYPE)) {
> + struct pipe_rt_blend_state *rt = &blend->rt[i];
> + rt->rgb_src_factor = fix_xrgb_alpha(rt->rgb_src_factor);
> + rt->rgb_dst_factor = fix_xrgb_alpha(rt->rgb_dst_factor);
> + rt->alpha_src_factor = fix_xrgb_alpha(rt->alpha_src_factor);
> + rt->alpha_dst_factor = fix_xrgb_alpha(rt->alpha_dst_factor);
> + }
> }
> }
> else {
> --
> 2.18.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list