summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/kms_atomic_transition.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/tests/kms_atomic_transition.c b/tests/kms_atomic_transition.c
index f9283079..0c0848d7 100644
--- a/tests/kms_atomic_transition.c
+++ b/tests/kms_atomic_transition.c
@@ -105,6 +105,12 @@ static drmEventContext drm_events = {
.page_flip_handler = ev_page_flip
};
+enum transition_type {
+ TRANSITION_PLANES,
+ TRANSITION_MODESET,
+ TRANSITION_MODESET_DISABLE,
+};
+
/*
* 1. Set primary plane to a known fb.
* 2. Make sure getcrtc returns the correct fb id.
@@ -115,10 +121,10 @@ static drmEventContext drm_events = {
* so test this and make sure it works.
*/
static void
-run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output, bool modeset, bool nonblocking)
+run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output, enum transition_type type, bool nonblocking)
{
struct igt_fb fb, argb_fb;
- drmModeModeInfo *mode;
+ drmModeModeInfo *mode, override_mode;
igt_plane_t *plane;
uint64_t cursor_width, cursor_height;
uint32_t n_planes = display->pipes[pipe].n_planes;
@@ -130,10 +136,12 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
if (nonblocking)
flags |= DRM_MODE_ATOMIC_NONBLOCK;
- if (modeset)
+ if (type >= TRANSITION_MODESET)
flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
mode = igt_output_get_mode(output);
+ override_mode = *mode;
+ override_mode.flags |= DRM_MODE_FLAG_HSKEW;
igt_create_fb(display->drm_fd, mode->hdisplay, mode->vdisplay,
DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE, &fb);
@@ -153,10 +161,11 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
wm_setup_plane(display, pipe, 0, NULL);
- if (nonblocking && modeset && (skip_test = skip_on_unsupported_nonblocking_modeset(display)))
- goto cleanup;
+ if (flags & DRM_MODE_ATOMIC_ALLOW_MODESET) {
+ skip_test = nonblocking && skip_on_unsupported_nonblocking_modeset(display);
+ if (skip_test)
+ goto cleanup;
- if (modeset) {
igt_output_set_pipe(output, PIPE_NONE);
igt_display_commit2(display, COMMIT_ATOMIC);
@@ -215,7 +224,6 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
if (!ret)
igt_skip("Cannot run tests without proper size sprite planes\n");
-
}
for (i = 0; i < iter_max; i++) {
@@ -226,7 +234,7 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
igt_display_commit_atomic(display, flags, (void *)(unsigned long)i);
drmHandleEvent(display->drm_fd, &drm_events);
- if (modeset) {
+ if (type == TRANSITION_MODESET_DISABLE) {
igt_output_set_pipe(output, PIPE_NONE);
wm_setup_plane(display, pipe, 0, parms);
@@ -241,10 +249,16 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
for (j = iter_max - 1; j > i + 1; j--) {
wm_setup_plane(display, pipe, j, parms);
+ 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);
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);
}
@@ -568,15 +582,19 @@ igt_main
igt_subtest("plane-all-transition")
for_each_pipe_with_valid_output(&display, pipe, output)
- run_transition_test(&display, pipe, output, false, false);
+ run_transition_test(&display, pipe, output, TRANSITION_PLANES, false);
igt_subtest("plane-all-transition-nonblocking")
for_each_pipe_with_valid_output(&display, pipe, output)
- run_transition_test(&display, pipe, output, false, true);
+ run_transition_test(&display, pipe, output, TRANSITION_PLANES, 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);
- igt_subtest("plane-modeset-transition")
+ igt_subtest("plane-toggle-modeset-transition")
for_each_pipe_with_valid_output(&display, pipe, output)
- run_transition_test(&display, pipe, output, true, false);
+ run_transition_test(&display, pipe, output, TRANSITION_MODESET_DISABLE, false);
for (i = 1; i <= I915_MAX_PIPES; i++) {
igt_subtest_f("%ix-modeset-transitions", i)