Messages in this thread Patch in this message | | | Date | Tue, 9 Jul 2019 22:54:05 -0300 | From | Rodrigo Siqueira <> | Subject | [PATCH 2/2] drm/vkms: Use alpha channel for blending cursor with primary |
| |
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@gmail.com> Cc: Mamta Shukla <mamtashukla555@gmail.com> Cc: Harry Wentland <harry.wentland@amd.com> Cc: Daniel Vetter <daniel@ffwll.ch> Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com> --- 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[unhandled content-type:application/pgp-signature] | |