On Wed, 2026-07-01 at 14:20 +0200, AngeloGioacchino Del Regno wrote: > From: Paul-pl Chen <[email protected]> > > For the new BLENDER component, the OVL ignore pixel alpha logic > should be exported as a function and reused it. > > Signed-off-by: Nancy Lin <[email protected]> > Signed-off-by: Paul-pl Chen <[email protected]> > Signed-off-by: AngeloGioacchino Del Regno > <[email protected]> > --- > drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 68 +++++++++++++++++-------- > drivers/gpu/drm/mediatek/mtk_disp_ovl.h | 8 +++ > 2 files changed, 56 insertions(+), 20 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > index 9ded20202191..fa4607304acb 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > @@ -215,6 +215,23 @@ void mtk_ovl_disable_vblank(struct device *dev) > writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN); > } > > +bool mtk_ovl_is_ignore_pixel_alpha(struct mtk_plane_state *state, unsigned > int blend_mode) > +{ > + if (!state->base.fb) > + return false; > + > + /* > + * Although the alpha channel can be ignored, CONST_BLD must be enabled > + * for XRGB format, otherwise OVL will still read the value from memory. > + * For RGB888 related formats, whether CONST_BLD is enabled or not won't > + * affect the result. Therefore we use !has_alpha as the condition. > + */ > + if (blend_mode == DRM_MODE_BLEND_PIXEL_NONE || > !state->base.fb->format->has_alpha) > + return true; > + > + return false; > +} > + > u32 mtk_ovl_get_blend_modes(struct device *dev) > { > struct mtk_disp_ovl *ovl = dev_get_drvdata(dev); > @@ -401,6 +418,29 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int > idx, > DISP_REG_OVL_RDMA_CTRL(idx)); > } > > +unsigned int mtk_ovl_get_blend_mode(struct mtk_plane_state *state, unsigned > int blend_modes) > +{ > + unsigned int blend_mode = DRM_MODE_BLEND_COVERAGE; > + > + /* > + * For the platforms where OVL_CON_CLRFMT_MAN is defined in the > hardware data sheet > + * and supports premultiplied color formats, such as > OVL_CON_CLRFMT_PARGB888 > + * and supports premultiplied color formats, such as > OVL_CON_CLRFMT_PARGB8888. > + * > + * Check blend_modes in the driver data to see if premultiplied mode is > supported. > + * If not, use coverage mode instead to set it to the supported color > formats. > + * > + * Current DRM assumption is that alpha is default premultiplied, so > the bitmask of > + * blend_modes must include BIT(DRM_MODE_BLEND_PREMULTI). Otherwise, > mtk_plane_init() > + * will get an error return from drm_plane_create_blend_mode_property() > and > + * state->base.pixel_blend_mode should not be used. > + */ > + if (blend_modes & BIT(DRM_MODE_BLEND_PREMULTI)) > + blend_mode = state->base.pixel_blend_mode; > + > + return blend_mode; > +} > + > unsigned int mtk_ovl_fmt_convert(unsigned int fmt, unsigned int blend_mode, > bool fmt_rgb565_is_0, bool color_convert, > u8 clrfmt_shift, u32 clrfmt_man, u32 > byte_swap, u32 rgb_swap) > @@ -529,7 +569,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned > int idx, > unsigned int rotation = pending->rotation; > unsigned int offset = (pending->y << 16) | pending->x; > unsigned int src_size = (pending->height << 16) | pending->width; > - unsigned int blend_mode = state->base.pixel_blend_mode; > + unsigned int blend_mode = mtk_ovl_get_blend_mode(state, > ovl->data->blend_modes);
In [02/42], you add these statement. + if (ovl->data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI)) + con = mtk_ovl_fmt_convert(fmt, blend_mode, + ovl->data->fmt_rgb565_is_0, true, OVL_CON_CLRFMT_SHIFT, + OVL_CON_CLRFMT_MAN, OVL_CON_BYTE_SWAP, OVL_CON_RGB_SWAP); + else + con = mtk_ovl_fmt_convert(fmt, DRM_MODE_BLEND_COVERAGE, + ovl->data->fmt_rgb565_is_0, true, OVL_CON_CLRFMT_SHIFT, + OVL_CON_CLRFMT_MAN, OVL_CON_BYTE_SWAP, OVL_CON_RGB_SWAP); And here you change definition of blend_mode, so these statement could be simplified as + con = mtk_ovl_fmt_convert(fmt, blend_mode, + ovl->data->fmt_rgb565_is_0, true, OVL_CON_CLRFMT_SHIFT, + OVL_CON_CLRFMT_MAN, OVL_CON_BYTE_SWAP, OVL_CON_RGB_SWAP); > unsigned int ignore_pixel_alpha = 0; > unsigned int con; > > @@ -554,17 +594,8 @@ void mtk_ovl_layer_config(struct device *dev, unsigned > int idx, > * For blend_modes supported SoCs, always enable alpha blending. > * For blend_modes unsupported SoCs, enable alpha blending when > has_alpha is set. > */ > - if (blend_mode || state->base.fb->format->has_alpha) > + if (state->base.pixel_blend_mode || > state->base.fb->format->has_alpha) > con |= OVL_CON_AEN; > - > - /* > - * Although the alpha channel can be ignored, CONST_BLD must be > enabled > - * for XRGB format, otherwise OVL will still read the value > from memory. > - * For RGB888 related formats, whether CONST_BLD is enabled or > not won't > - * affect the result. Therefore we use !has_alpha as the > condition. > - */ > - if (blend_mode == DRM_MODE_BLEND_PIXEL_NONE || > !state->base.fb->format->has_alpha) > - ignore_pixel_alpha = OVL_CONST_BLEND; > } > > /* > @@ -590,6 +621,9 @@ void mtk_ovl_layer_config(struct device *dev, unsigned > int idx, > > mtk_ddp_write_relaxed(cmdq_pkt, con, &ovl->cmdq_reg, ovl->regs, > DISP_REG_OVL_CON(idx)); > + > + if (mtk_ovl_is_ignore_pixel_alpha(state, blend_mode)) if (mtk_ovl_is_ignore_pixel_alpha(state, state->base.pixel_blend_mode)) Regards, CK > + ignore_pixel_alpha = OVL_CONST_BLEND; > mtk_ddp_write_relaxed(cmdq_pkt, pitch_lsb | ignore_pixel_alpha, > &ovl->cmdq_reg, ovl->regs, > DISP_REG_OVL_PITCH(idx)); > mtk_ddp_write_relaxed(cmdq_pkt, src_size, &ovl->cmdq_reg, ovl->regs, >
