Hi, вс, 5 июн. 2022 г. в 23:23, Jernej Škrabec <jernej.skrabec@xxxxxxxxx>: > > Dne nedelja, 05. junij 2022 ob 11:40:18 CEST je Roman Stratiienko napisal(a): > > Otherwise alpha value is discarded, resulting incorrect pixel > > apperance on the display. > > > > This also fixes missing transparency for the most bottom layer. > > Can you explain that a bit more? Well... I would recommend reading Bartosz Ciechanowski's blog https://ciechanow.ski/alpha-compositing/ or the Porter-Duff's 1984 whitepaper itself. HINT: That magic numbers from sun8i_mixer.h ( 0x03010301 ) corresponds to SOURCE OVER mode. As you can see from the blending equation it outputs both pixel value and alpha value (non-premultiplied data mode). Also single-layer non-premultiplied buffers may have for example (R255,G255,B255,A2) pixel value, which should be sent as {R2, G2, B2} through the physical display interface. When OUTCTL.PREMULTI disabled pixel, the RGB values passes as is, and even 100% transparent data {R255, G255, B255, A0} will appear as 100% opaque white. >Also, BSP driver never enables this bit. What are we doing differently? Are you sure the BSP does not have an issues with presenting transparent buffers? Does the sunxi even have a customer-feedback mechanism and publicly available stable BSP with all the fixes? Regards, Roman > > > > > Test applications and videos w/ w/o this patch are available at [1]. > > > > [1]: https://github.com/GloDroid/glodroid_tests/issues/1 > > As stated in other emails, commit messages should not contain external links > (per patch rules). > > Best regards, > Jernej > > > Signed-off-by: Roman Stratiienko <r.stratiienko@xxxxxxxxx> > > > > --- > > Changelog: > > > > V2: Added code hunk missing in v1 > > --- > > drivers/gpu/drm/sun4i/sun8i_mixer.c | 5 +++-- > > drivers/gpu/drm/sun4i/sun8i_mixer.h | 1 + > > 2 files changed, 4 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c > > b/drivers/gpu/drm/sun4i/sun8i_mixer.c index 6b1711a9a71f..ba2932aaed08 > > 100644 > > --- a/drivers/gpu/drm/sun4i/sun8i_mixer.c > > +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c > > @@ -320,8 +320,9 @@ static void sun8i_mixer_mode_set(struct sunxi_engine > > *engine, else > > val = 0; > > > > - regmap_update_bits(engine->regs, > SUN8I_MIXER_BLEND_OUTCTL(bld_base), > > - SUN8I_MIXER_BLEND_OUTCTL_INTERLACED, > val); > > + val |= SUN8I_MIXER_BLEND_OUTCTL_PREMULTIPLY; > > + > > + regmap_write(engine->regs, SUN8I_MIXER_BLEND_OUTCTL(bld_base), > val); > > > > DRM_DEBUG_DRIVER("Switching display mixer interlaced mode %s\n", > > interlaced ? "on" : "off"); > > diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.h > > b/drivers/gpu/drm/sun4i/sun8i_mixer.h index ebfc276b2464..bc12c95af6f3 > > 100644 > > --- a/drivers/gpu/drm/sun4i/sun8i_mixer.h > > +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h > > @@ -65,6 +65,7 @@ > > #define SUN8I_MIXER_BLEND_ROUTE_PIPE_MSK(n) (0xf << ((n) << 2)) > > #define SUN8I_MIXER_BLEND_ROUTE_PIPE_SHIFT(n) ((n) << 2) > > > > +#define SUN8I_MIXER_BLEND_OUTCTL_PREMULTIPLY BIT(0) > > #define SUN8I_MIXER_BLEND_OUTCTL_INTERLACED BIT(1) > > > > #define SUN50I_MIXER_BLEND_CSC_CTL_EN(ch) BIT(ch) > > > >