From b5ac73a85c92ac647fce0cbc151a210477e2cd68 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Mon, 22 Aug 2016 11:47:51 +0200 Subject: kms_atomic_transition: Add modeset tests for all plane combinations. With the new patch series by Lyude for fixing SKL watermarks it was shown that watermarks for disabled planes may not be updated correctly on modeset. Ensure that this is tested by doing a test similar to plane-all-transition, but with modesets! Signed-off-by: Maarten Lankhorst --- tests/kms_atomic_transition.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'tests/kms_atomic_transition.c') 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) -- cgit v1.2.3