diff mbox series

[i-g-t,2/2] tests/kms_async_flips: Add test for atomic prop changes

Message ID 20231110163811.24158-3-andrealmeid@igalia.com (mailing list archive)
State New, archived
Headers show
Series Add test for atomic async page flip | expand

Commit Message

André Almeida Nov. 10, 2023, 4:38 p.m. UTC
DRM atomic API should reject modesetting during an async flip, so
test if the kernel properly rejects to flip with prop changes.

Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
 tests/kms_async_flips.c | 68 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)
diff mbox series

Patch

diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c
index 6bfcca474..edc19b5ef 100644
--- a/tests/kms_async_flips.c
+++ b/tests/kms_async_flips.c
@@ -305,6 +305,9 @@  static void test_async_flip_atomic(data_t *data)
 
 	test_init(data);
 
+	igt_plane_set_fb(data->plane, &data->bufs[0]);
+	igt_display_commit_atomic(&data->display, DRM_MODE_ATOMIC_ALLOW_MODESET, data);
+
 	gettimeofday(&start, NULL);
 	frame = 1;
 	do {
@@ -326,6 +329,55 @@  static void test_async_flip_atomic(data_t *data)
 		     "FPS should be significantly higher than the refresh rate\n");
 }
 
+static void test_invalid_atomic(data_t *data)
+{
+	int flags = DRM_MODE_PAGE_FLIP_ASYNC | DRM_MODE_PAGE_FLIP_EVENT;
+	int ret;
+
+	test_init(data);
+
+	igt_plane_set_fb(data->plane, &data->bufs[0]);
+	igt_display_commit_atomic(&data->display, DRM_MODE_ATOMIC_ALLOW_MODESET, data);
+
+	/* Trying to change plane position  */
+	igt_plane_set_position(data->plane, 15, 15);
+	igt_plane_set_fb(data->plane, &data->bufs[1]);
+	ret = igt_display_try_commit_atomic(&data->display, flags, data);
+	igt_assert(ret == -EINVAL);
+	igt_plane_set_position(data->plane, 0, 0);
+
+	/* Trying to change plane rotation  */
+	igt_plane_set_rotation(data->plane, IGT_ROTATION_180);
+	igt_plane_set_fb(data->plane, &data->bufs[1]);
+	ret = igt_display_try_commit_atomic(&data->display, flags, data);
+	igt_assert(ret == -EINVAL);
+	igt_plane_set_rotation(data->plane, IGT_ROTATION_0);
+}
+
+static void test_atomic_modeset(data_t *data)
+{
+	int flags = DRM_MODE_PAGE_FLIP_ASYNC | DRM_MODE_PAGE_FLIP_EVENT;
+	igt_output_t *output = data->output;
+	int ret;
+
+	test_init(data);
+
+	igt_plane_set_fb(data->plane, &data->bufs[0]);
+	igt_display_commit_atomic(&data->display, DRM_MODE_ATOMIC_ALLOW_MODESET, data);
+
+	/*
+	 * Modesetting is forbidden during atomic async flips. Mode changes that
+	 * require modeset are rejected.
+	 */
+	for_each_connector_mode(output) {
+		drmModeModeInfo *m = &output->config.connector->modes[j__];
+		igt_output_override_mode(output, m);
+		ret = igt_display_try_commit_atomic(&data->display, flags, data);
+		igt_assert(ret == -EINVAL);
+	}
+	igt_output_override_mode(output, NULL);
+}
+
 static void wait_for_vblank(data_t *data, unsigned long *vbl_time, unsigned int *seq)
 {
 	drmVBlank wait_vbl;
@@ -757,6 +809,22 @@  igt_main
 		run_test(&data, test_async_flip_atomic);
 	}
 
+	igt_describe("Negative case to verify if any atomic changes are rejected from kernel as expected");
+	igt_subtest_with_dynamic("invalid-atomic-async-flip") {
+		require_monotonic_timestamp(data.drm_fd);
+		igt_require_f(igt_has_drm_cap(data.drm_fd, DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP),
+			      "Atomic async page-flips are not supported\n");
+		run_test(&data, test_invalid_atomic);
+	}
+
+	igt_describe("Verify mode changes during atomic async flips");
+	igt_subtest_with_dynamic("modeset-atomic-async-flip") {
+		require_monotonic_timestamp(data.drm_fd);
+		igt_require_f(igt_has_drm_cap(data.drm_fd, DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP),
+			      "Atomic async page-flips are not supported\n");
+		run_test(&data, test_atomic_modeset);
+	}
+
 	igt_fixture {
 		for (i = 0; i < NUM_FBS; i++)
 			igt_remove_fb(data.drm_fd, &data.bufs[i]);