[Intel-gfx] [PATCH i-g-t 2/5] tests/kms_atomic_transition: Add TEST_ONLY flag

Mika Kahola mika.kahola at intel.com
Fri Dec 30 12:00:38 UTC 2016


Add TEST_ONLY flag to test atomic transition display commits without
actual real-life commit.

Signed-off-by: Mika Kahola <mika.kahola at intel.com>
---
 tests/kms_atomic_transition.c | 227 ++++++++++++++++++++++++++++--------------
 1 file changed, 152 insertions(+), 75 deletions(-)

diff --git a/tests/kms_atomic_transition.c b/tests/kms_atomic_transition.c
index 851ffc9..2505210 100644
--- a/tests/kms_atomic_transition.c
+++ b/tests/kms_atomic_transition.c
@@ -68,7 +68,7 @@ wm_setup_plane(igt_display_t *display, enum pipe pipe,
 	}
 }
 
-static bool skip_on_unsupported_nonblocking_modeset(igt_display_t *display)
+static bool skip_on_unsupported_nonblocking_modeset(igt_display_t *display, bool test_only)
 {
 	enum pipe pipe;
 	int ret;
@@ -81,12 +81,14 @@ static bool skip_on_unsupported_nonblocking_modeset(igt_display_t *display)
 	 */
 	igt_display_commit_atomic(display, DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
 
-	ret = igt_display_try_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET | DRM_MODE_ATOMIC_NONBLOCK, NULL);
+	if (!test_only) {
+		ret = igt_display_try_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET | DRM_MODE_ATOMIC_NONBLOCK, NULL);
 
-	if (ret == -EINVAL)
-		return true;
+		if (ret == -EINVAL)
+			return true;
 
-	igt_assert_eq(ret, 0);
+		igt_assert_eq(ret, 0);
+	}
 
 	/* Force the next state to update all crtc's, to synchronize with the nonblocking modeset. */
 	for_each_pipe(display, pipe)
@@ -267,7 +269,7 @@ retry:
  */
 static void
 run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output,
-		    enum transition_type type, bool nonblocking)
+		    enum transition_type type, bool nonblocking, bool test_only)
 {
 	struct igt_fb fb, argb_fb, sprite_fb;
 	drmModeModeInfo *mode, override_mode;
@@ -276,6 +278,10 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
 	struct plane_parms parms[IGT_MAX_PLANES];
 	bool skip_test = false;
 	unsigned flags = DRM_MODE_PAGE_FLIP_EVENT;
+	int ret;
+
+	if (test_only)
+		flags = DRM_MODE_ATOMIC_ALLOW_MODESET | DRM_MODE_ATOMIC_TEST_ONLY;
 
 	if (nonblocking)
 		flags |= DRM_MODE_ATOMIC_NONBLOCK;
@@ -295,18 +301,26 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
 	wm_setup_plane(display, pipe, 0, NULL);
 
 	if (flags & DRM_MODE_ATOMIC_ALLOW_MODESET) {
-		skip_test = nonblocking && skip_on_unsupported_nonblocking_modeset(display);
+		skip_test = nonblocking && skip_on_unsupported_nonblocking_modeset(display, test_only);
 		if (skip_test)
 			goto cleanup;
 
 		igt_output_set_pipe(output, PIPE_NONE);
 
-		igt_display_commit2(display, COMMIT_ATOMIC);
+		if (test_only) {
+			ret = igt_display_try_commit_atomic(display, flags, NULL);
+			igt_assert_eq(ret, 0);
+		} else
+			igt_display_commit2(display, COMMIT_ATOMIC);
 
 		igt_output_set_pipe(output, pipe);
 	}
 
-	igt_display_commit2(display, COMMIT_ATOMIC);
+	if (test_only) {
+		ret = igt_display_try_commit_atomic(display, flags, NULL);
+		igt_assert_eq(ret, 0);
+	} else
+		igt_display_commit2(display, COMMIT_ATOMIC);
 
 	setup_parms(display, pipe, mode, &argb_fb, &sprite_fb, parms);
 
@@ -315,17 +329,22 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
 
 		wm_setup_plane(display, pipe, i, parms);
 
-		igt_display_commit_atomic(display, flags, (void *)(unsigned long)i);
-		drmHandleEvent(display->drm_fd, &drm_events);
+		ret = igt_display_try_commit_atomic(display, flags, (void *)(unsigned long)i);
+		igt_assert_eq(ret, 0);
+
+		if (!test_only)
+			drmHandleEvent(display->drm_fd, &drm_events);
 
 		if (type == TRANSITION_MODESET_DISABLE) {
 			igt_output_set_pipe(output, PIPE_NONE);
 
 			wm_setup_plane(display, pipe, 0, parms);
 
-			igt_display_commit_atomic(display, flags, (void *)0UL);
+			ret = igt_display_try_commit_atomic(display, flags, (void *)0UL);
+			igt_assert_eq(ret, 0);
 
-			drmHandleEvent(display->drm_fd, &drm_events);
+			if (!test_only)
+				drmHandleEvent(display->drm_fd, &drm_events);
 		} else {
 			uint32_t j;
 
@@ -336,15 +355,21 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
 				if (type == TRANSITION_MODESET)
 					igt_output_override_mode(output, &override_mode);
 
-				igt_display_commit_atomic(display, flags, (void *)(unsigned long)j);
-				drmHandleEvent(display->drm_fd, &drm_events);
+				ret = igt_display_try_commit_atomic(display, flags, (void *)(unsigned long)j);
+				igt_assert_eq(ret, 0);
+
+				if (!test_only)
+					drmHandleEvent(display->drm_fd, &drm_events);
 
 				wm_setup_plane(display, pipe, i, parms);
 				if (type == TRANSITION_MODESET)
 					igt_output_override_mode(output, NULL);
 
-				igt_display_commit_atomic(display, flags, (void *)(unsigned long)i);
-				drmHandleEvent(display->drm_fd, &drm_events);
+				ret = igt_display_try_commit_atomic(display, flags, (void *)(unsigned long)i);
+				igt_assert_eq(ret, 0);
+
+				if (!test_only)
+					drmHandleEvent(display->drm_fd, &drm_events);
 			}
 		}
 	}
@@ -355,7 +380,8 @@ cleanup:
 	for_each_plane_on_pipe(display, pipe, plane)
 		igt_plane_set_fb(plane, NULL);
 
-	igt_display_commit2(display, COMMIT_ATOMIC);
+	if (!test_only)
+		igt_display_commit2(display, COMMIT_ATOMIC);
 
 	igt_remove_fb(display->drm_fd, &fb);
 	igt_remove_fb(display->drm_fd, &argb_fb);
@@ -364,51 +390,60 @@ cleanup:
 		igt_skip("Atomic nonblocking modesets are not supported.\n");
 }
 
-static void commit_display(igt_display_t *display, unsigned event_mask, bool nonblocking)
+static void commit_display(igt_display_t *display, unsigned int event_mask,
+			   bool nonblocking, bool test_only)
 {
 	unsigned flags;
 	int num_events = hweight32(event_mask);
 	ssize_t ret;
 
-	flags = DRM_MODE_ATOMIC_ALLOW_MODESET | DRM_MODE_PAGE_FLIP_EVENT;
+	if (test_only)
+		flags = DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET;
+	else
+		flags = DRM_MODE_ATOMIC_ALLOW_MODESET | DRM_MODE_PAGE_FLIP_EVENT;
+
 	if (nonblocking)
 		flags |= DRM_MODE_ATOMIC_NONBLOCK;
 
-	igt_display_commit_atomic(display, flags, NULL);
+	ret = igt_display_try_commit_atomic(display, flags, NULL);
 
-	igt_debug("Event mask: %x, waiting for %i events\n", event_mask, num_events);
+	igt_assert_eq(ret, 0);
 
-	igt_set_timeout(30, "Waiting for events timed out\n");
+	if (!test_only) {
+		igt_debug("Event mask: %x, waiting for %i events\n", event_mask, num_events);
 
-	while (num_events) {
-		char buf[32];
-		struct drm_event *e = (void *)buf;
-		struct drm_event_vblank *vblank = (void *)buf;
-		uint32_t crtc_id, pipe = I915_MAX_PIPES;
+		igt_set_timeout(30, "Waiting for events timed out\n");
 
-		ret = read(display->drm_fd, buf, sizeof(buf));
-		if (ret < 0 && (errno == EINTR || errno == EAGAIN))
-			continue;
+		while (num_events) {
+			char buf[32];
+			struct drm_event *e = (void *)buf;
+			struct drm_event_vblank *vblank = (void *)buf;
+			uint32_t crtc_id, pipe = I915_MAX_PIPES;
 
-		igt_assert(ret >= 0);
-		igt_assert_eq(e->type, DRM_EVENT_FLIP_COMPLETE);
+			ret = read(display->drm_fd, buf, sizeof(buf));
+			if (ret < 0 && (errno == EINTR || errno == EAGAIN))
+				continue;
 
-		crtc_id = vblank->reserved;
-		if (crtc_id) {
-			for_each_pipe(display, pipe)
-				if (display->pipes[pipe].crtc_id == crtc_id)
-					break;
+			igt_assert(ret >= 0);
+			igt_assert_eq(e->type, DRM_EVENT_FLIP_COMPLETE);
 
-			igt_assert_lt(pipe, display->n_pipes);
+			crtc_id = vblank->reserved;
+			if (crtc_id) {
+				for_each_pipe(display, pipe)
+					if (display->pipes[pipe].crtc_id == crtc_id)
+						break;
 
-			igt_debug("Retrieved vblank seq: %u on %u/%u\n", vblank->sequence, vblank->reserved, pipe);
-		} else
-			igt_debug("Retrieved vblank seq: %u on unk/unk\n", vblank->sequence);
+				igt_assert_lt(pipe, display->n_pipes);
 
-		num_events--;
-	}
+				igt_debug("Retrieved vblank seq: %u on %u/%u\n", vblank->sequence, vblank->reserved, pipe);
+			} else
+				igt_debug("Retrieved vblank seq: %u on unk/unk\n", vblank->sequence);
 
-	igt_reset_timeout();
+			num_events--;
+		}
+
+		igt_reset_timeout();
+	}
 }
 
 static unsigned set_combinations(igt_display_t *display, unsigned mask, struct igt_fb *fb)
@@ -481,7 +516,8 @@ static void collect_crcs_mask(igt_pipe_crc_t **pipe_crcs, unsigned mask, igt_crc
 	}
 }
 
-static void run_modeset_tests(igt_display_t *display, int howmany, bool nonblocking)
+static void run_modeset_tests(igt_display_t *display, int howmany,
+			      bool nonblocking, bool test_only)
 {
 	struct igt_fb fbs[2];
 	int i, j;
@@ -490,6 +526,7 @@ static void run_modeset_tests(igt_display_t *display, int howmany, bool nonblock
 	igt_output_t *output;
 	unsigned width = 0, height = 0;
 	bool skip_test = false;
+	int ret;
 
 	for_each_connected_output(display, output) {
 		drmModeModeInfo *mode = igt_output_get_mode(output);
@@ -501,7 +538,7 @@ static void run_modeset_tests(igt_display_t *display, int howmany, bool nonblock
 	}
 
 	igt_create_pattern_fb(display->drm_fd, width, height,
-				   DRM_FORMAT_XRGB8888, 0, &fbs[0]);
+			      DRM_FORMAT_XRGB8888, 0, &fbs[0]);
 	igt_create_color_pattern_fb(display->drm_fd, width, height,
 				    DRM_FORMAT_XRGB8888, 0, .5, .5, .5, &fbs[1]);
 
@@ -533,10 +570,15 @@ static void run_modeset_tests(igt_display_t *display, int howmany, bool nonblock
 	 * When i915 supports nonblocking modeset, this if branch can be removed.
 	 * It's only purpose is to ensure nonblocking modeset works.
 	 */
-	if (nonblocking && (skip_test = skip_on_unsupported_nonblocking_modeset(display)))
+	if (nonblocking && (skip_test = skip_on_unsupported_nonblocking_modeset(display, test_only)))
 		goto cleanup;
 
-	igt_display_commit2(display, COMMIT_ATOMIC);
+	if (test_only)
+		ret = igt_display_try_commit2(display, DRM_MODE_ATOMIC_TEST_ONLY | COMMIT_ATOMIC);
+	else
+		ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
+
+	igt_assert_eq(ret, 0);
 
 	for (i = 0; i < iter_max; i++) {
 		igt_crc_t crcs[5][I915_MAX_PIPES];
@@ -549,9 +591,10 @@ static void run_modeset_tests(igt_display_t *display, int howmany, bool nonblock
 		if (!event_mask && i)
 			continue;
 
-		commit_display(display, event_mask, nonblocking);
+		commit_display(display, event_mask, nonblocking, test_only);
 
-		collect_crcs_mask(pipe_crcs, i, crcs[0]);
+		if (!test_only)
+			collect_crcs_mask(pipe_crcs, i, crcs[0]);
 
 		for (j = iter_max - 1; j > i + 1; j--) {
 			if (hweight32(j) > howmany)
@@ -564,43 +607,54 @@ static void run_modeset_tests(igt_display_t *display, int howmany, bool nonblock
 			if (!event_mask)
 				continue;
 
-			commit_display(display, event_mask, nonblocking);
+			commit_display(display, event_mask, nonblocking, test_only);
 
-			collect_crcs_mask(pipe_crcs, j, crcs[1]);
+			if (!test_only)
+				collect_crcs_mask(pipe_crcs, j, crcs[1]);
 
 			refresh_primaries(display);
-			commit_display(display, j, nonblocking);
-			collect_crcs_mask(pipe_crcs, j, crcs[2]);
+			commit_display(display, j, nonblocking, test_only);
+
+			if (!test_only)
+				collect_crcs_mask(pipe_crcs, j, crcs[2]);
 
 			event_mask = set_combinations(display, i, &fbs[0]);
 			if (!event_mask)
 				continue;
 
-			commit_display(display, event_mask, nonblocking);
-			collect_crcs_mask(pipe_crcs, i, crcs[3]);
+			commit_display(display, event_mask, nonblocking, test_only);
+
+			if (!test_only)
+				collect_crcs_mask(pipe_crcs, i, crcs[3]);
 
 			refresh_primaries(display);
-			commit_display(display, i, nonblocking);
-			collect_crcs_mask(pipe_crcs, i, crcs[4]);
+			commit_display(display, i, nonblocking, test_only);
+
+			if (!test_only)
+				collect_crcs_mask(pipe_crcs, i, crcs[4]);
 
 			if (!is_i915_device(display->drm_fd))
 				continue;
 
-			for (int k = 0; k < I915_MAX_PIPES; k++) {
-				if (i & (1 << k)) {
-					igt_assert_crc_equal(&crcs[0][k], &crcs[3][k]);
-					igt_assert_crc_equal(&crcs[0][k], &crcs[4][k]);
-				}
+			if (!test_only) {
+				for (int k = 0; k < I915_MAX_PIPES; k++) {
+					if (i & (1 << k)) {
+						igt_assert_crc_equal(&crcs[0][k], &crcs[3][k]);
+						igt_assert_crc_equal(&crcs[0][k], &crcs[4][k]);
+					}
 
-				if (j & (1 << k))
-					igt_assert_crc_equal(&crcs[1][k], &crcs[2][k]);
+					if (j & (1 << k))
+						igt_assert_crc_equal(&crcs[1][k], &crcs[2][k]);
+				}
 			}
 		}
 	}
 
 cleanup:
 	set_combinations(display, 0, NULL);
-	igt_display_commit2(display, COMMIT_ATOMIC);
+
+	if (!test_only)
+		igt_display_commit2(display, COMMIT_ATOMIC);
 
 	if (is_i915_device(display->drm_fd))
 		for_each_pipe(display, i)
@@ -614,7 +668,8 @@ cleanup:
 
 }
 
-static void run_modeset_transition(igt_display_t *display, int requested_outputs, bool nonblocking)
+static void run_modeset_transition(igt_display_t *display, int requested_outputs,
+				   bool nonblocking, bool test_only)
 {
 	igt_output_t *outputs[I915_MAX_PIPES] = {};
 	int num_outputs = 0;
@@ -642,7 +697,7 @@ static void run_modeset_transition(igt_display_t *display, int requested_outputs
 		      "Should have at least %i outputs, found %i\n",
 		      requested_outputs, num_outputs);
 
-	run_modeset_tests(display, requested_outputs, nonblocking);
+	run_modeset_tests(display, requested_outputs, nonblocking, test_only);
 }
 
 igt_main
@@ -673,26 +728,48 @@ igt_main
 
 	igt_subtest("plane-all-transition")
 		for_each_pipe_with_valid_output(&display, pipe, output)
-			run_transition_test(&display, pipe, output, TRANSITION_PLANES, false);
+			run_transition_test(&display, pipe, output, TRANSITION_PLANES, false, false);
+
+	igt_subtest("plane-all-transition-test-only")
+		for_each_pipe_with_valid_output(&display, pipe, output)
+			run_transition_test(&display, pipe, output, TRANSITION_PLANES, false, true);
 
 	igt_subtest("plane-all-transition-nonblocking")
 		for_each_pipe_with_valid_output(&display, pipe, output)
-			run_transition_test(&display, pipe, output, TRANSITION_PLANES, true);
+			run_transition_test(&display, pipe, output, TRANSITION_PLANES, true, false);
+
+	igt_subtest("plane-all-transition-nonblocking-test-only")
+		for_each_pipe_with_valid_output(&display, pipe, output)
+			run_transition_test(&display, pipe, output, TRANSITION_PLANES, true, true);
 
 	igt_subtest("plane-all-modeset-transition")
 		for_each_pipe_with_valid_output(&display, pipe, output)
-			run_transition_test(&display, pipe, output, TRANSITION_MODESET, false);
+			run_transition_test(&display, pipe, output, TRANSITION_MODESET, false, false);
+
+	igt_subtest("plane-all-modeset-transition-test-only")
+		for_each_pipe_with_valid_output(&display, pipe, output)
+			run_transition_test(&display, pipe, output, TRANSITION_MODESET, false, true);
 
 	igt_subtest("plane-toggle-modeset-transition")
 		for_each_pipe_with_valid_output(&display, pipe, output)
-			run_transition_test(&display, pipe, output, TRANSITION_MODESET_DISABLE, false);
+			run_transition_test(&display, pipe, output, TRANSITION_MODESET_DISABLE, false, false);
+
+	igt_subtest("plane-toggle-modeset-transition-test-only")
+		for_each_pipe_with_valid_output(&display, pipe, output)
+			run_transition_test(&display, pipe, output, TRANSITION_MODESET_DISABLE, false, true);
 
 	for (i = 1; i <= I915_MAX_PIPES; i++) {
 		igt_subtest_f("%ix-modeset-transitions", i)
-			run_modeset_transition(&display, i, false);
+			run_modeset_transition(&display, i, false, false);
+
+		igt_subtest_f("%ix-modeset-transitions-test-only", i)
+			run_modeset_transition(&display, i, false, true);
 
 		igt_subtest_f("%ix-modeset-transitions-nonblocking", i)
-			run_modeset_transition(&display, i, true);
+			run_modeset_transition(&display, i, true, false);
+
+		igt_subtest_f("%ix-modeset-transitions-nonblocking-test-only", i)
+			run_modeset_transition(&display, i, true, true);
 	}
 
 	igt_fixture {
-- 
2.7.4



More information about the Intel-gfx mailing list