Hi,
вс, 5 июн. 2022 г. в 23:23, Jernej Škrabec jernej.skrabec@gmail.com:
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].
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@gmail.com
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)