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 <[email protected]>
Cc: Mamta Shukla <[email protected]>
Cc: Harry Wentland <[email protected]>
Cc: Daniel Vetter <[email protected]>
Signed-off-by: Rodrigo Siqueira <[email protected]>
---
 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

Reply via email to