[igt-dev] [PATCH i-g-t v2 3/3] tests/kms_psr2_sf: Add new subtest for biplanar format

Jouni Högander jouni.hogander at intel.com
Wed Dec 1 09:15:06 UTC 2021


Add new testcase which uses NV12 format for primary plane. It is
continuously updating overlay plane. It is also sending damaged
area only on every second flip.

v2: Fixed expected output and set fb on screen_changes & 1

Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
---
 tests/i915/kms_psr2_sf.c | 92 +++++++++++++++++++++++++++++++---------
 1 file changed, 73 insertions(+), 19 deletions(-)

diff --git a/tests/i915/kms_psr2_sf.c b/tests/i915/kms_psr2_sf.c
index a50c3e14..a91defde 100644
--- a/tests/i915/kms_psr2_sf.c
+++ b/tests/i915/kms_psr2_sf.c
@@ -38,8 +38,11 @@ IGT_TEST_DESCRIPTION("Tests to varify PSR2 selective fetch by sending multiple"
 #define CUR_SIZE 64
 #define MAX_DAMAGE_AREAS 5
 
+#define MAX_SCREEN_CHANGES 5
+
 enum operations {
 	PLANE_UPDATE,
+	PLANE_UPDATE_CONTINUOUS,
 	PLANE_MOVE,
 	OVERLAY_PRIM_UPDATE
 };
@@ -59,6 +62,8 @@ typedef struct {
 	igt_output_t *output;
 	struct igt_fb fb_primary, fb_overlay, fb_cursor;
 	struct igt_fb fb_test;
+	struct igt_fb *fb_continuous;
+	uint32_t primary_format;
 	int damage_area_count;
 	struct drm_mode_rect plane_update_clip[MAX_DAMAGE_AREAS];
 	struct drm_mode_rect plane_move_clip;
@@ -68,12 +73,14 @@ typedef struct {
 	int test_plane_id;
 	igt_plane_t *test_plane;
 	cairo_t *cr;
+	uint32_t screen_changes;
 } data_t;
 
 static const char *op_str(enum operations op)
 {
 	static const char * const name[] = {
 		[PLANE_UPDATE] = "plane-update",
+		[PLANE_UPDATE_CONTINUOUS] = "plane-update-continuous",
 		[PLANE_MOVE] = "plane-move",
 		[OVERLAY_PRIM_UPDATE] = "overlay-primary-update",
 	};
@@ -222,7 +229,7 @@ static void prepare(data_t *data)
 	/* all green frame */
 	igt_create_color_fb(data->drm_fd,
 			    data->mode->hdisplay, data->mode->vdisplay,
-			    DRM_FORMAT_XRGB8888,
+			    data->primary_format,
 			    DRM_FORMAT_MOD_LINEAR,
 			    0.0, 1.0, 0.0,
 			    &data->fb_primary);
@@ -251,6 +258,8 @@ static void prepare(data_t *data)
 				    0.0, 0.0, 1.0,
 				    &data->fb_test);
 
+		data->fb_continuous = &data->fb_overlay;
+
 		if (data->op == PLANE_MOVE) {
 			plane_move_setup_square(data, &data->fb_test,
 					   data->mode->hdisplay/2,
@@ -277,6 +286,7 @@ static void prepare(data_t *data)
 		plane_update_setup_squares(data, &data->fb_test,
 					   data->mode->hdisplay,
 					   data->mode->vdisplay);
+		data->fb_continuous = &data->fb_primary;
 		data->test_plane = primary;
 
 		if (data->op == OVERLAY_PRIM_UPDATE) {
@@ -312,6 +322,7 @@ static void prepare(data_t *data)
 		igt_create_fb(data->drm_fd, CUR_SIZE, CUR_SIZE,
 			      DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_LINEAR,
 			      &data->fb_test);
+		data->fb_continuous = &data->fb_cursor;
 
 		draw_rect(data, &data->fb_test, 0, 0, CUR_SIZE, CUR_SIZE,
 			    1.0, 1.0, 1.0, 1.0);
@@ -334,7 +345,8 @@ static inline void manual(const char *expected)
 	igt_debug_manual_check("all", expected);
 }
 
-static void plane_update_expected_output(int plane_type, int box_count)
+static void plane_update_expected_output(int plane_type, int box_count,
+					 int screen_changes)
 {
 	char expected[64] = {};
 
@@ -344,9 +356,16 @@ static void plane_update_expected_output(int plane_type, int box_count)
 			box_count);
 		break;
 	case DRM_PLANE_TYPE_OVERLAY:
-		sprintf(expected,
-			"screen Green with Blue box and %d White box(es)",
-			box_count);
+		/*
+		 * Continuous updates only for DRM_PLANE_TYPE_OVERLAY
+		 * for now.
+		 */
+		if (screen_changes & 1)
+			sprintf(expected, "screen Green with Blue box");
+		else
+			sprintf(expected,
+				"screen Green with Blue box and %d White box(es)",
+				box_count);
 		break;
 	case DRM_PLANE_TYPE_CURSOR:
 		sprintf(expected, "screen Green with %d White box(es)",
@@ -407,7 +426,13 @@ static void expected_output(data_t *data)
 		break;
 	case PLANE_UPDATE:
 		plane_update_expected_output(data->test_plane_id,
-					     data->damage_area_count);
+					     data->damage_area_count,
+					     data->screen_changes);
+		break;
+	case PLANE_UPDATE_CONTINUOUS:
+		plane_update_expected_output(data->test_plane_id,
+					     data->damage_area_count,
+					     data->screen_changes);
 		break;
 	case OVERLAY_PRIM_UPDATE:
 		overlay_prim_update_expected_output(data->damage_area_count);
@@ -468,24 +493,28 @@ static void damaged_plane_update(data_t *data)
 	uint32_t h = data->mode->hdisplay;
 	uint32_t v = data->mode->vdisplay;
 
-	igt_plane_set_fb(test_plane, &data->fb_test);
-
 	if (data->test_plane_id == DRM_PLANE_TYPE_OVERLAY) {
 		h = h/2;
 		v = v/2;
 	}
 
-	if (data->test_plane_id == DRM_PLANE_TYPE_CURSOR)
-		igt_plane_replace_prop_blob(test_plane,
-					    IGT_PLANE_FB_DAMAGE_CLIPS,
-					    &data->cursor_clip,
-					    sizeof(struct drm_mode_rect));
-	else
-		igt_plane_replace_prop_blob(test_plane,
-					    IGT_PLANE_FB_DAMAGE_CLIPS,
-					    &data->plane_update_clip,
-					    sizeof(struct drm_mode_rect)*
-					    data->damage_area_count);
+	if (data->screen_changes & 1) {
+		igt_plane_set_fb(test_plane, data->fb_continuous);
+	} else {
+		igt_plane_set_fb(test_plane, &data->fb_test);
+
+		if (data->test_plane_id == DRM_PLANE_TYPE_CURSOR)
+			igt_plane_replace_prop_blob(test_plane,
+						    IGT_PLANE_FB_DAMAGE_CLIPS,
+						    &data->cursor_clip,
+						    sizeof(struct drm_mode_rect));
+		else
+			igt_plane_replace_prop_blob(test_plane,
+						    IGT_PLANE_FB_DAMAGE_CLIPS,
+						    &data->plane_update_clip,
+						    sizeof(struct drm_mode_rect)*
+						    data->damage_area_count);
+	}
 
 	igt_plane_set_position(data->test_plane, 0, 0);
 	igt_display_commit2(&data->display, COMMIT_ATOMIC);
@@ -499,11 +528,20 @@ static void run(data_t *data)
 {
 	igt_assert(psr_wait_entry(data->debugfs_fd, PSR_MODE_2));
 
+	data->screen_changes = 0;
+
 	switch (data->op) {
 	case PLANE_UPDATE:
 	case OVERLAY_PRIM_UPDATE:
 		damaged_plane_update(data);
 		break;
+	case PLANE_UPDATE_CONTINUOUS:
+		for (data->screen_changes = 0;
+		     data->screen_changes < MAX_SCREEN_CHANGES;
+		     data->screen_changes++) {
+			damaged_plane_update(data);
+		}
+		break;
 	case PLANE_MOVE:
 		damaged_plane_move(data);
 		break;
@@ -568,6 +606,7 @@ igt_main
 		data.damage_area_count = MAX_DAMAGE_AREAS;
 		data.op = PLANE_UPDATE;
 		data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+		data.primary_format = DRM_FORMAT_XRGB8888;
 		prepare(&data);
 		r = psr_wait_entry(data.debugfs_fd, PSR_MODE_2);
 		if (!r)
@@ -643,6 +682,21 @@ igt_main
 		}
 	}
 
+	/*
+	 * Verify overlay plane selective fetch using NV12 primary
+	 * plane and continuous updates.
+	 */
+	data.op = PLANE_UPDATE_CONTINUOUS;
+	data.primary_format = DRM_FORMAT_NV12;
+	igt_describe("Test that selective fetch works on overlay plane");
+	igt_subtest_f("overlay-%s-sf", op_str(data.op)) {
+			data.damage_area_count = 1;
+			data.test_plane_id = DRM_PLANE_TYPE_OVERLAY;
+			prepare(&data);
+			run(&data);
+			cleanup(&data);
+	}
+
 	igt_fixture {
 		close(data.debugfs_fd);
 		display_fini(&data);
-- 
2.25.1



More information about the igt-dev mailing list