dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2,1/2] drm/vkms: Use alpha for blending in blend() function
@ 2019-01-29 21:54 Mamta Shukla
  2019-01-29 22:00 ` [PATCH v2 2/2] drm/vkms: Modify memset() in compute_crc function Mamta Shukla
  2019-01-31 12:44 ` [PATCH v2,1/2] drm/vkms: Use alpha for blending in blend() function Rodrigo Siqueira
  0 siblings, 2 replies; 6+ messages in thread
From: Mamta Shukla @ 2019-01-29 21:54 UTC (permalink / raw)
  To: dri-devel, daniel, harry.wentland, hamohammed.sa,
	rodrigosiqueiramelo

Use the alpha value to blend vaddr_src with vaddr_dst instead
of overwriting it in blend().

Signed-off-by: Mamta Shukla <mamtashukla555@gmail.com>
---
changes in v2:
-Use macro to avoid code duplication
-Add spaces around '/' and '-'
-Remove spaces at the end of the line

 drivers/gpu/drm/vkms/vkms_crc.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index 9d9e8146db90..dc6cb4c2cced 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -5,6 +5,8 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 
+#define BITSHIFT(val,i)  (u8)((*(u32 *)(val)) >> i & 0xff)
+
 /**
  * compute_crc - Compute CRC value on output frame
  *
@@ -71,6 +73,9 @@ static void blend(void *vaddr_dst, void *vaddr_src,
 	int y_limit = y_src + h_dst;
 	int x_limit = x_src + w_dst;
 
+	u8 alpha, r_src, r_dst, g_src, g_dst, b_src, b_dst;
+	u8 r_alpha, g_alpha, b_alpha;
+
 	for (i = y_src, i_dst = y_dst; i < y_limit; ++i) {
 		for (j = x_src, j_dst = x_dst; j < x_limit; ++j) {
 			offset_dst = crc_dst->offset
@@ -79,9 +84,25 @@ static void blend(void *vaddr_dst, void *vaddr_src,
 			offset_src = crc_src->offset
 				     + (i * crc_src->pitch)
 				     + (j * crc_src->cpp);
+			
+			/*Currently handles alpha values for fully opaque or fully transparent*/
+			alpha = (u8)((*(u32 *)vaddr_src + offset_src) >> 24);
+			alpha = alpha / 255;
+			r_src = BITSHIFT(vaddr_src + offset_src, 16);
+			g_src = BITSHIFT(vaddr_src + offset_src, 8);
+			b_src = BITSHIFT(vaddr_src + offset_src, 0);
+			r_dst = BITSHIFT(vaddr_dst + offset_dst, 16);
+			g_dst = BITSHIFT(vaddr_dst + offset_dst, 8);
+			b_dst = BITSHIFT(vaddr_dst + offset_dst, 0);
+
+			/*Pre-multiplied alpha for blending */
+			r_alpha = (r_src) + (r_dst * (1 - alpha));
+			g_alpha = (g_src) + (g_dst * (1 - alpha));
+			b_alpha = (b_src) + (b_dst * (1 - alpha));
+			memset(vaddr_dst + offset_dst, b_alpha, sizeof(u8));
+			memset(vaddr_dst + offset_dst + 1, g_alpha, sizeof(u8));
+			memset(vaddr_dst + offset_dst + 2, r_alpha, sizeof(u8));
 
-			memcpy(vaddr_dst + offset_dst,
-			       vaddr_src + offset_src, sizeof(u32));
 		}
 		i_dst++;
 	}
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-02-14 22:32 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-01-29 21:54 [PATCH v2,1/2] drm/vkms: Use alpha for blending in blend() function Mamta Shukla
2019-01-29 22:00 ` [PATCH v2 2/2] drm/vkms: Modify memset() in compute_crc function Mamta Shukla
2019-01-31 16:39   ` Wentland, Harry
2019-02-14 22:31   ` Rodrigo Siqueira via dri-devel
2019-01-31 12:44 ` [PATCH v2,1/2] drm/vkms: Use alpha for blending in blend() function Rodrigo Siqueira
2019-02-01 17:15   ` Daniel Vetter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).