All of lore.kernel.org
 help / color / mirror / Atom feed
From: Karthik B S <karthik.b.s@intel.com>
To: igt-dev@lists.freedesktop.org
Subject: [igt-dev] [PATCH i-g-t] tests/kms_big_joiner: Add dual display subtest
Date: Tue,  1 Jun 2021 09:16:08 +0530	[thread overview]
Message-ID: <20210601034608.11735-1-karthik.b.s@intel.com> (raw)

Add subtest to verify modeset on 2 big joiner outputs simultaneously.

Also, create fb only once and use it across all the subtests to optimize
the timings.

Signed-off-by: Karthik B S <karthik.b.s@intel.com>
---
 tests/kms_big_joiner.c | 120 +++++++++++++++++++++++++++++------------
 1 file changed, 87 insertions(+), 33 deletions(-)

diff --git a/tests/kms_big_joiner.c b/tests/kms_big_joiner.c
index 31397202..98a6fc77 100644
--- a/tests/kms_big_joiner.c
+++ b/tests/kms_big_joiner.c
@@ -34,9 +34,11 @@ typedef struct {
 	int drm_fd;
 	igt_display_t display;
 	struct igt_fb fb;
-	int mode_number;
 	int n_pipes;
-	uint32_t big_joiner_output_id;
+	struct output_data {
+		uint32_t id;
+		int mode_number;
+	} big_joiner_output[2];
 } data_t;
 
 static void test_invalid_modeset(data_t *data)
@@ -44,32 +46,25 @@ static void test_invalid_modeset(data_t *data)
 	drmModeModeInfo *mode;
 	igt_display_t *display = &data->display;
 	igt_output_t *output, *big_joiner_output = NULL, *second_output = NULL;
-	int width = 0, height = 0, i, ret;
+	int i, ret;
 	igt_pipe_t *pipe;
 	igt_plane_t *plane;
 
 	for_each_connected_output(display, output) {
 		mode = &output->config.connector->modes[0];
 
-		if (data->big_joiner_output_id == output->id) {
-			mode = &output->config.connector->modes[data->mode_number];
+		if (data->big_joiner_output[0].id == output->id) {
 			big_joiner_output = output;
 		} else if (second_output == NULL) {
 			second_output = output;
 		}
-
-		width = max(width, mode->hdisplay);
-		height = max(height, mode->vdisplay);
 	}
 
-	igt_create_pattern_fb(data->drm_fd, width, height, DRM_FORMAT_XRGB8888,
-			      LOCAL_DRM_FORMAT_MOD_NONE, &data->fb);
-
 	for_each_pipe(display, i) {
 		if (i < (data->n_pipes - 1)) {
 			igt_output_set_pipe(big_joiner_output, i);
 
-			mode = &big_joiner_output->config.connector->modes[data->mode_number];
+			mode = &big_joiner_output->config.connector->modes[data->big_joiner_output[0].mode_number];
 			igt_output_override_mode(big_joiner_output, mode);
 
 			pipe = &display->pipes[i];
@@ -131,7 +126,7 @@ static void test_invalid_modeset(data_t *data)
 
 			igt_output_set_pipe(big_joiner_output, i);
 
-			mode = &big_joiner_output->config.connector->modes[data->mode_number];
+			mode = &big_joiner_output->config.connector->modes[data->big_joiner_output[0].mode_number];
 			igt_output_override_mode(big_joiner_output, mode);
 
 			pipe = &display->pipes[i];
@@ -159,8 +154,6 @@ static void test_invalid_modeset(data_t *data)
 			igt_output_override_mode(big_joiner_output, NULL);
 		}
 	}
-
-	igt_remove_fb(data->drm_fd, &data->fb);
 }
 
 static void test_basic_modeset(data_t *data)
@@ -168,28 +161,22 @@ static void test_basic_modeset(data_t *data)
 	drmModeModeInfo *mode;
 	igt_output_t *output, *big_joiner_output = NULL;
 	igt_display_t *display = &data->display;
-	int width = 0, height = 0, i;
+	int i;
 	igt_pipe_t *pipe;
 	igt_plane_t *plane;
 
 	for_each_connected_output(display, output) {
-		if (data->big_joiner_output_id == output->id) {
-			mode = &output->config.connector->modes[data->mode_number];
+		if (data->big_joiner_output[0].id == output->id) {
 			big_joiner_output = output;
-			width = mode->hdisplay;
-			height = mode->vdisplay;
 			break;
 		}
 	}
 
-	igt_create_pattern_fb(data->drm_fd, width, height, DRM_FORMAT_XRGB8888,
-			      LOCAL_DRM_FORMAT_MOD_NONE, &data->fb);
-
 	for_each_pipe(display, i) {
 		if (i < (data->n_pipes - 1)) {
 			igt_output_set_pipe(big_joiner_output, i);
 
-			mode = &big_joiner_output->config.connector->modes[data->mode_number];
+			mode = &big_joiner_output->config.connector->modes[data->big_joiner_output[0].mode_number];
 			igt_output_override_mode(big_joiner_output, mode);
 
 			pipe = &display->pipes[i];
@@ -206,17 +193,69 @@ static void test_basic_modeset(data_t *data)
 			igt_display_commit2(display, COMMIT_ATOMIC);
 		}
 	}
+}
+
+static void test_dual_display(data_t *data)
+{
+	drmModeModeInfo *mode;
+	igt_output_t *output, *big_joiner_output[2];
+	igt_display_t *display = &data->display;
+	igt_pipe_t *pipe;
+	igt_plane_t *plane;
+	int count = 0;
+
+	for_each_connected_output(display, output) {
+		if (data->big_joiner_output[count].id == output->id) {
+			big_joiner_output[count] = output;
+			count++;
+		}
 
-	igt_remove_fb(data->drm_fd, &data->fb);
+		if (count > 1)
+			break;
+	}
+
+	igt_output_set_pipe(big_joiner_output[0], PIPE_A);
+	igt_output_set_pipe(big_joiner_output[1], PIPE_C);
+
+	/* Set up first big joiner output on Pipe A*/
+	mode = &big_joiner_output[0]->config.connector->modes[data->big_joiner_output[0].mode_number];
+	igt_output_override_mode(big_joiner_output[0], mode);
+
+	pipe = &display->pipes[PIPE_A];
+	plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
+
+	igt_plane_set_fb(plane, &data->fb);
+	igt_fb_set_size(&data->fb, plane, mode->hdisplay, mode->vdisplay);
+	igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
+
+	/* Set up second big joiner output on Pipe C*/
+	mode = &big_joiner_output[1]->config.connector->modes[data->big_joiner_output[1].mode_number];
+	igt_output_override_mode(big_joiner_output[1], mode);
+
+	pipe = &display->pipes[PIPE_C];
+	plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
+
+	igt_plane_set_fb(plane, &data->fb);
+	igt_fb_set_size(&data->fb, plane, mode->hdisplay, mode->vdisplay);
+	igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
+
+	igt_display_commit2(display, COMMIT_ATOMIC);
+
+	/* Clean up */
+	igt_output_set_pipe(big_joiner_output[0], PIPE_NONE);
+	igt_output_set_pipe(big_joiner_output[1], PIPE_NONE);
+	igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[PIPE_A], DRM_PLANE_TYPE_PRIMARY), NULL);
+	igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[PIPE_C], DRM_PLANE_TYPE_PRIMARY), NULL);
+	igt_display_commit2(display, COMMIT_ATOMIC);
 }
 
 igt_main
 {
 	data_t data;
-	bool big_joiner_mode_found = false;
 	igt_output_t *output;
 	drmModeModeInfo *mode;
-	int valid_output = 0, i;
+	int valid_output = 0, i, count = 0;
+	uint16_t width = 0, height = 0;
 
 	igt_fixture {
 		data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
@@ -225,13 +264,16 @@ igt_main
 		igt_display_require(&data.display, data.drm_fd);
 
 		for_each_connected_output(&data.display, output) {
-			if (!big_joiner_mode_found) {
+			if (count < 2) {
 				for (i = 0; i < output->config.connector->count_modes; i++) {
 					mode = &output->config.connector->modes[i];
 					if (mode->hdisplay > MAX_HDISPLAY_PER_PIPE) {
-						big_joiner_mode_found = true;
-						data.mode_number = i;
-						data.big_joiner_output_id = output->id;
+						data.big_joiner_output[count].mode_number = i;
+						data.big_joiner_output[count].id = output->id;
+						count++;
+
+						width = max(width, mode->hdisplay);
+						height = max(height, mode->vdisplay);
 						break;
 					}
 				}
@@ -243,7 +285,10 @@ igt_main
 		for_each_pipe(&data.display, i)
 			data.n_pipes++;
 
-		igt_require_f(big_joiner_mode_found, "No output with 5k+ mode found\n");
+		igt_require_f(count > 0, "No output with 5k+ mode found\n");
+
+		igt_create_pattern_fb(data.drm_fd, width, height, DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE, &data.fb);
 	}
 
 	igt_describe("Verify the basic modeset on big joiner mode on all pipes");
@@ -257,6 +302,15 @@ igt_main
 		test_invalid_modeset(&data);
 	}
 
-	igt_fixture
+	igt_describe("Verify simultaneous modeset on 2 big joiner outputs");
+	igt_subtest("2x-modeset") {
+		igt_require_f(count > 1, "2 outputs with big joiner modes are required\n");
+		igt_require_f(data.n_pipes > 3, "Minumum of 4 pipes are required\n");
+		test_dual_display(&data);
+	}
+
+	igt_fixture {
+		igt_remove_fb(data.drm_fd, &data.fb);
 		igt_display_fini(&data.display);
+	}
 }
-- 
2.22.0

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

             reply	other threads:[~2021-06-01  4:09 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-01  3:46 Karthik B S [this message]
2021-06-01  6:17 ` [igt-dev] ✗ Fi.CI.IGT: failure for tests/kms_big_joiner: Add dual display subtest Patchwork
2021-06-03 11:06   ` Karthik B S
2021-06-01 19:29 ` [igt-dev] [PATCH i-g-t] " Navare, Manasi
2021-06-02  7:00   ` Karthik B S
2021-06-03 15:31 ` [igt-dev] ✗ Fi.CI.IGT: failure for " Patchwork
2021-06-03 16:05 ` [igt-dev] ✓ Fi.CI.IGT: success " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210601034608.11735-1-karthik.b.s@intel.com \
    --to=karthik.b.s@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.