[igt-dev] [PATCH i-g-t 3/5] lib/igt_fb: move the CTS fill framebuffer to igt_fb lib

Abhinav Kumar abhinavk at codeaurora.org
Fri Sep 4 00:54:37 UTC 2020


The function to fill the framebuffer with the CTS pattern
is generic. Move it to the igt_fb layer so that it can be used by
other modules.

Signed-off-by: Abhinav Kumar <abhinavk at codeaurora.org>
---
 lib/igt_fb.c                | 65 ++++++++++++++++++++++++++++++++++
 lib/igt_fb.h                |  3 ++
 tools/intel_dp_compliance.c | 70 ++++++-------------------------------
 3 files changed, 78 insertions(+), 60 deletions(-)

diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 3864b7a1..d6f0b9ed 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  * Copyright © 2013,2014 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -1280,6 +1281,70 @@ void igt_paint_color(cairo_t *cr, int x, int y, int w, int h,
 	cairo_fill(cr);
 }
 
+/**
+ * igt_fill_cts_framebuffer:
+ * @pixmap: handle to the mapped buffer
+ * @video_width: required width for the CTS pattern
+ * @video_height: required height for the CTS pattern
+ * @bitdepth: required bitdepth for the CTS pattern
+ * @alpha: required alpha for the CTS pattern
+ * This functions draws the CTS test pattern for a given width, height.
+ */
+int igt_fill_cts_framebuffer(uint32_t *pixmap, uint32_t video_width,
+		uint32_t video_height, uint32_t bitdepth, int alpha)
+{
+	uint32_t tile_height, tile_width;
+	uint32_t *red_ptr, *green_ptr, *blue_ptr;
+	uint32_t *white_ptr, *src_ptr, *dst_ptr;
+	int x, y;
+	int32_t pixel_val;
+
+	tile_height = 64;
+	tile_width = 1 << bitdepth;
+
+	red_ptr = pixmap;
+	green_ptr = red_ptr + (video_width * tile_height);
+	blue_ptr = green_ptr + (video_width * tile_height);
+	white_ptr = blue_ptr + (video_width * tile_height);
+	x = 0;
+
+	/* Fill the frame buffer with video pattern from CTS 3.1.5 */
+	while (x < video_width) {
+		for (pixel_val = 0; pixel_val < 256;
+		     pixel_val = pixel_val + (256 / tile_width)) {
+			red_ptr[x] = alpha << 24 | pixel_val << 16;
+			green_ptr[x] = alpha << 24 | pixel_val << 8;
+			blue_ptr[x] = alpha << 24 | pixel_val << 0;
+			white_ptr[x] = alpha << 24 | red_ptr[x] | green_ptr[x] |
+				       blue_ptr[x];
+			if (++x >= video_width)
+				break;
+		}
+	}
+	for (y = 0; y < video_height; y++) {
+		if (y == 0 || y == 64 || y == 128 || y == 192)
+			continue;
+		switch ((y / tile_height) % 4) {
+		case 0:
+			src_ptr = red_ptr;
+			break;
+		case 1:
+			src_ptr = green_ptr;
+			break;
+		case 2:
+			src_ptr = blue_ptr;
+			break;
+		case 3:
+			src_ptr = white_ptr;
+			break;
+		}
+		dst_ptr = pixmap + (y * video_width);
+		memcpy(dst_ptr, src_ptr, (video_width * 4));
+	}
+
+	return 0;
+}
+
 /**
  * igt_paint_color_alpha:
  * @cr: cairo drawing context
diff --git a/lib/igt_fb.h b/lib/igt_fb.h
index 5ec906b7..a1f94503 100644
--- a/lib/igt_fb.h
+++ b/lib/igt_fb.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  * Copyright © 2013,2014 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -206,6 +207,8 @@ bool igt_format_is_fp16(uint32_t drm_format);
 int igt_format_plane_bpp(uint32_t drm_format, int plane);
 void igt_format_array_fill(uint32_t **formats_array, unsigned int *count,
 			   bool allow_yuv);
+int igt_fill_cts_framebuffer(uint32_t *pixmap, uint32_t video_width,
+		uint32_t video_height, uint32_t bitdepth, int alpha);
 
 #endif /* __IGT_FB_H__ */
 
diff --git a/tools/intel_dp_compliance.c b/tools/intel_dp_compliance.c
index fc512711..c8c5c841 100644
--- a/tools/intel_dp_compliance.c
+++ b/tools/intel_dp_compliance.c
@@ -448,70 +448,12 @@ static int setup_video_pattern_framebuffer(struct connector *dp_conn)
 
 }
 
-static int fill_framebuffer(struct connector *dp_conn)
-{
-	uint32_t tile_height, tile_width, video_width, video_height;
-	uint32_t *red_ptr, *green_ptr, *blue_ptr, *white_ptr, *src_ptr, *dst_ptr;
-	int x, y;
-	int32_t pixel_val;
-	uint8_t alpha;
-
-	video_width = dp_conn->test_pattern.hdisplay;
-	video_height = dp_conn->test_pattern.vdisplay;
-
-	tile_height = 64;
-	tile_width = 1 <<  (dp_conn->test_pattern.bitdepth);
-
-	red_ptr = dp_conn->test_pattern.pixmap;
-	green_ptr = red_ptr + (video_width * tile_height);
-	blue_ptr = green_ptr + (video_width * tile_height);
-	white_ptr = blue_ptr + (video_width * tile_height);
-	x = 0;
-
-	/* Fill the frame buffer with video pattern from CTS 3.1.5 */
-	while (x < video_width) {
-		for (pixel_val = 0; pixel_val < 256;
-		     pixel_val = pixel_val + (256 / tile_width)) {
-			alpha = gen == 10 ? 0xff : 0;
-			red_ptr[x] = alpha << 24 | pixel_val << 16;
-			green_ptr[x] = alpha << 24 | pixel_val << 8;
-			blue_ptr[x] = alpha << 24 | pixel_val << 0;
-			white_ptr[x] = alpha << 24 | red_ptr[x] | green_ptr[x] |
-				       blue_ptr[x];
-			if (++x >= video_width)
-				break;
-		}
-	}
-	for (y = 0; y < video_height; y++) {
-		if (y == 0 || y == 64 || y == 128 || y == 192)
-			continue;
-		switch ((y / tile_height) % 4) {
-		case 0:
-			src_ptr = red_ptr;
-			break;
-		case 1:
-			src_ptr = green_ptr;
-			break;
-		case 2:
-			src_ptr = blue_ptr;
-			break;
-		case 3:
-			src_ptr = white_ptr;
-			break;
-		}
-		dst_ptr = dp_conn->test_pattern.pixmap + (y * video_width);
-		memcpy(dst_ptr, src_ptr, (video_width * 4));
-	}
-	munmap(dp_conn->test_pattern.pixmap,
-	       dp_conn->test_pattern.size);
-	return 0;
-}
-
 static int set_test_mode(struct connector *dp_conn)
 {
 	int ret = 0;
 	int i;
 	bool found_std = false, found_fs = false;
+	uint32_t alpha;
 	drmModeConnector *c = dp_conn->connector;
 
 	/* Ignore any disconnected devices */
@@ -584,6 +526,7 @@ static int set_test_mode(struct connector *dp_conn)
 		dp_conn->test_pattern.hdisplay = hdisplay;
 		dp_conn->test_pattern.vdisplay = vdisplay;
 		dp_conn->test_pattern.bitdepth = bitdepth;
+		alpha = gen == 10 ? 0xff : 0;
 
 		ret = setup_video_pattern_framebuffer(dp_conn);
 		if (ret) {
@@ -592,12 +535,19 @@ static int set_test_mode(struct connector *dp_conn)
 			return ret;
 		}
 
-		ret = fill_framebuffer(dp_conn);
+		ret = igt_fill_cts_framebuffer(dp_conn->test_pattern.pixmap,
+				dp_conn->test_pattern.hdisplay,
+				dp_conn->test_pattern.vdisplay,
+				dp_conn->test_pattern.bitdepth,
+				alpha);
 		if (ret) {
 			igt_warn("Filling framebuffer for connector %u failed (%d)\n",
 				 c->connector_id, ret);
 			return ret;
 		}
+		/* unmapping the buffer previously mapped during setup */
+		munmap(dp_conn->test_pattern.pixmap,
+				dp_conn->test_pattern.size);
 	}
 
 	return ret;
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project



More information about the igt-dev mailing list