summaryrefslogtreecommitdiff
path: root/tests/kms_atomic_transition.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-08-22 11:47:51 +0200
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-08-22 11:49:20 +0200
commitb5ac73a85c92ac647fce0cbc151a210477e2cd68 (patch)
tree3b634bcd62fc192b77a48253120f089244cc622f /tests/kms_atomic_transition.c
parentb0658ce76557d4ce00be7252aa60d1b59d8980f6 (diff)
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 <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'tests/kms_atomic_transition.c')
-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)