@@ -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++;
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(-)