Currently, the blend function overwriting the cursor value into the primary plane. This patch utilizes the alpha value for a fully transparent blend of the cursor (vaddr_src) with primary (vaddr_dst) instead of overwriting it in blend(). Cc: Haneen Mohammed <hamohammed.sa@xxxxxxxxx> Cc: Mamta Shukla <mamtashukla555@xxxxxxxxx> Cc: Harry Wentland <harry.wentland@xxxxxxx> Cc: Daniel Vetter <daniel@xxxxxxxx> Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@xxxxxxxxx> --- drivers/gpu/drm/vkms/vkms_composer.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index fb106964d8bf..bb758a5131a4 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -26,6 +26,17 @@ static void set_pixel(int x, int y, u8 *buffer, *dst = value; } +static u32 apply_alpha(u32 src, u32 dst) +{ + u8 alpha; + u32 k; + + alpha = src >> 24; + alpha = (alpha + 1) >> 8; + k = (alpha << 24) - alpha; + return (k & src) | (~k & dst); +} + /** * compute_crc - Compute CRC value on output frame * @@ -89,15 +100,19 @@ static void blend(void *vaddr_dst, void *vaddr_src, int y_limit = y_src + h_dst; int x_limit = x_src + w_dst; - u32 pixel_src; + u32 pixel_src, pixel_dst, new_pixel; for (y = y_src, i_dst = y_dst; y < y_limit; ++y) { for (x = x_src, j_dst = x_dst; x < x_limit; ++x) { pixel_src = get_pixel_from_buffer(x, y, vaddr_src, src_composer); - set_pixel(j_dst, i_dst, vaddr_dst, dest_composer, - pixel_src); + pixel_dst = get_pixel_from_buffer(j_dst, i_dst, + vaddr_dst, + dst_composer); + new_pixel = apply_alpha(pixel_src, pixel_dst); + set_pixel(j_dst, i_dst, vaddr_dst, dst_composer, + new_pixel); j_dst++; } i_dst++; -- 2.21.0
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel