From 06c84cc77390f7d14d593856d40a22a03f6d3cf9 Mon Sep 17 00:00:00 2001 From: Thong Thai Date: Thu, 7 May 2026 15:13:11 +0000 Subject: [PATCH] frontends/va: Enable shader-based alpha blending Signed-off-by: Thong Thai Reviewed-by: David Rosca Part-of: --- src/gallium/frontends/va/postproc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/gallium/frontends/va/postproc.c b/src/gallium/frontends/va/postproc.c index 8e04f5d35a4..1f906daa5d6 100644 --- a/src/gallium/frontends/va/postproc.c +++ b/src/gallium/frontends/va/postproc.c @@ -126,8 +126,10 @@ vlVaQueryVideoProcPipelineCaps(VADriverContextP ctx, VAContextID context, PIPE_VIDEO_CAP_VPP_BLEND_MODES); pipeline_cap->blend_flags = 0; - if (pipe_blend_modes & PIPE_VIDEO_VPP_BLEND_MODE_GLOBAL_ALPHA) + if (!media_only || pipe_blend_modes & PIPE_VIDEO_VPP_BLEND_MODE_GLOBAL_ALPHA) pipeline_cap->blend_flags |= VA_BLEND_GLOBAL_ALPHA; + if (!media_only || pipe_blend_modes & PIPE_VIDEO_VPP_BLEND_MODE_PREMULTIPLIED_ALPHA) + pipeline_cap->blend_flags |= VA_BLEND_PREMULTIPLIED_ALPHA; vlVaDriver *drv = VL_VA_DRIVER(ctx); @@ -379,9 +381,14 @@ vlVaPostProcCompositor(vlVaDriver *drv, mirror = VL_COMPOSITOR_MIRROR_NONE; vl_compositor_clear_layers(&drv->cstate); + vl_compositor_set_layer_rotation(&drv->cstate, 0, rotation); vl_compositor_set_layer_mirror(&drv->cstate, 0, mirror); + drv->cstate.layers[0].blend_enabled = param->blend.enabled; + drv->cstate.layers[0].blend_mode = param->blend.mode; + drv->cstate.layers[0].blend_alpha = param->blend.global_alpha; + if (dst_yuv) { if (src_yuv) { /* YUV -> YUV */ @@ -647,10 +654,12 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *contex } if (param->blend_state) { - if (param->blend_state->flags & VA_BLEND_GLOBAL_ALPHA) { - vpp.blend.mode = PIPE_VIDEO_VPP_BLEND_MODE_GLOBAL_ALPHA; - vpp.blend.global_alpha = param->blend_state->global_alpha; - } + vpp.blend.enabled = true; + vpp.blend.global_alpha = param->blend_state->global_alpha; + if (param->blend_state->flags & VA_BLEND_GLOBAL_ALPHA) + vpp.blend.mode |= PIPE_VIDEO_VPP_BLEND_MODE_GLOBAL_ALPHA; + if (param->blend_state->flags & VA_BLEND_PREMULTIPLIED_ALPHA) + vpp.blend.mode |= PIPE_VIDEO_VPP_BLEND_MODE_PREMULTIPLIED_ALPHA; } /* Output background color */