summaryrefslogtreecommitdiff
path: root/tests/kms_cursor_legacy.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2017-05-09 11:58:55 +0200
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2017-05-09 12:02:13 +0200
commit0d67d8ee678e883ba8a1e40699b73b7db2d540fe (patch)
tree5bcaa7586a2620ac8ddae2b5caa216bff1011df1 /tests/kms_cursor_legacy.c
parentb9576426b675b72cd83d98fef486bb197ab77c4f (diff)
tests/kms_cursor_legacy: Increase tolerance for failing flip-before/after-cursor.
Run the test 25 times and fail if we miss too many vblanks. CI receives too many false positives so we have to fix it. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'tests/kms_cursor_legacy.c')
-rw-r--r--tests/kms_cursor_legacy.c113
1 files changed, 65 insertions, 48 deletions
diff --git a/tests/kms_cursor_legacy.c b/tests/kms_cursor_legacy.c
index 900fd5ce..3eef7f7a 100644
--- a/tests/kms_cursor_legacy.c
+++ b/tests/kms_cursor_legacy.c
@@ -590,6 +590,7 @@ static void basic_flip_cursor(igt_display_t *display,
unsigned vblank_start;
enum pipe pipe = find_connected_pipe(display, false);
uint32_t *busy;
+ int i, miss1 = 0, miss2 = 0, delta;
if (mode >= flip_test_atomic)
igt_require(display->is_atomic);
@@ -610,67 +611,83 @@ static void basic_flip_cursor(igt_display_t *display,
do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg[0]);
igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
- /* Bind the cursor first to warm up */
- do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg[0]);
+ for (i = 0; i < 25; i++) {
+ bool miss;
- busy = NULL;
- if (flags & BASIC_BUSY)
- busy = make_fb_busy(display->drm_fd, &fb_info);
+ /* Bind the cursor first to warm up */
+ do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg[0]);
- /* Start with a synchronous query to align with the vblank */
- vblank_start = get_vblank(display->drm_fd, pipe, DRM_VBLANK_NEXTONMISS);
+ busy = NULL;
+ if (flags & BASIC_BUSY)
+ busy = make_fb_busy(display->drm_fd, &fb_info);
- switch (order) {
- case FLIP_BEFORE_CURSOR:
- switch (mode) {
- default:
- flip_nonblocking(display, pipe, mode >= flip_test_atomic, &fb_info);
- break;
- case flip_test_atomic_transitions:
- case flip_test_atomic_transitions_varying_size:
- transition_nonblocking(display, pipe, &fb_info, &argb_fb, 0);
+ /* Start with a synchronous query to align with the vblank */
+ vblank_start = get_vblank(display->drm_fd, pipe, DRM_VBLANK_NEXTONMISS);
+
+ switch (order) {
+ case FLIP_BEFORE_CURSOR:
+ switch (mode) {
+ default:
+ flip_nonblocking(display, pipe, mode >= flip_test_atomic, &fb_info);
+ break;
+ case flip_test_atomic_transitions:
+ case flip_test_atomic_transitions_varying_size:
+ transition_nonblocking(display, pipe, &fb_info, &argb_fb, 0);
+ break;
+ }
+ igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
+
+ do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg[0]);
break;
- }
- igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
- do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg[0]);
- break;
+ case FLIP_AFTER_CURSOR:
+ do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg[0]);
+ igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
- case FLIP_AFTER_CURSOR:
- do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg[0]);
- igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
+ switch (mode) {
+ default:
+ flip_nonblocking(display, pipe, mode >= flip_test_atomic, &fb_info);
+ break;
+ case flip_test_atomic_transitions:
+ case flip_test_atomic_transitions_varying_size:
+ transition_nonblocking(display, pipe, &fb_info, &argb_fb, 0);
+ break;
+ }
+ }
- switch (mode) {
- default:
- flip_nonblocking(display, pipe, mode >= flip_test_atomic, &fb_info);
- break;
- case flip_test_atomic_transitions:
- case flip_test_atomic_transitions_varying_size:
- transition_nonblocking(display, pipe, &fb_info, &argb_fb, 0);
- break;
+ delta = get_vblank(display->drm_fd, pipe, 0) - vblank_start;
+
+ if (busy) {
+ struct pollfd pfd = { display->drm_fd, POLLIN };
+ igt_assert(poll(&pfd, 1, 0) == 0);
+ finish_fb_busy(busy);
}
- }
- if (!cursor_slowpath(mode))
- igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
- else
- igt_assert_lte(get_vblank(display->drm_fd, pipe, 0), vblank_start + 1);
+ if (!cursor_slowpath(mode))
+ miss = delta != 0;
+ else
+ miss = delta != 0 && delta != 1;
- if (busy) {
- struct pollfd pfd = { display->drm_fd, POLLIN };
- igt_assert(poll(&pfd, 1, 0) == 0);
- finish_fb_busy(busy);
- }
+ miss1 += miss;
+
+ igt_set_timeout(1, "Stuck page flip");
+ igt_ignore_warn(read(display->drm_fd, &vbl, sizeof(vbl)));
+ igt_reset_timeout();
- igt_set_timeout(1, "Stuck page flip");
- igt_ignore_warn(read(display->drm_fd, &vbl, sizeof(vbl)));
+ if (miss1)
+ continue;
- if (!mode_requires_extra_vblank(mode))
- igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start + 1);
- else
- igt_assert_lte(get_vblank(display->drm_fd, pipe, 0), vblank_start + 2);
+ delta = get_vblank(display->drm_fd, pipe, 0) - vblank_start;
+
+ if (!mode_requires_extra_vblank(mode))
+ miss2 += delta != 1;
+ else
+ miss2 += delta != 1 && delta != 2;
+ }
- igt_reset_timeout();
+ igt_fail_on_f(miss1 > 2 || miss1 + miss2 > 5, "Failed to evade %i vblanks and missed %i page flips\n", miss1, miss2);
+ if (miss1 || miss2)
+ igt_info("Failed to evade %i vblanks and missed %i page flips\n", miss1, miss2);
do_cleanup_display(display);
igt_remove_fb(display->drm_fd, &fb_info);