From 1f0addb689a5707bc3e5a5e36d28fea2745ea352 Mon Sep 17 00:00:00 2001 From: Daniel Vetter Date: Mon, 30 Sep 2013 21:38:09 +0200 Subject: [PATCH] tests/kms_flip: scale test runtime On machines with many outputs and many crtcs it takes too long. So scale the runtime by the number of output combinations we're trying to light up. Compensate the test runtime a bit by doubling most subtests' duration. Signed-off-by: Daniel Vetter --- tests/kms_flip.c | 160 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 100 insertions(+), 60 deletions(-) diff --git a/tests/kms_flip.c b/tests/kms_flip.c index 079bdfa..ee75ee8 100644 --- a/tests/kms_flip.c +++ b/tests/kms_flip.c @@ -1101,7 +1101,7 @@ static unsigned int wait_for_events(struct test_output *o) } /* Returned the elapsed time in us */ -static unsigned event_loop(struct test_output *o, unsigned duration_sec) +static unsigned event_loop(struct test_output *o, unsigned duration_ms) { unsigned long start, end; @@ -1116,7 +1116,7 @@ static unsigned event_loop(struct test_output *o, unsigned duration_sec) check_all_state(o, completed_events); update_all_state(o, completed_events); - if ((gettime_us() - start) / 1000000 >= duration_sec) + if ((gettime_us() - start) / 1000 >= duration_ms) break; } @@ -1129,13 +1129,10 @@ static unsigned event_loop(struct test_output *o, unsigned duration_sec) return end - start; } -static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) +static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration_ms) { unsigned elapsed; - o->bpp = 32; - o->depth = 24; - connector_find_preferred_mode(o->_connector[0], crtc_idx, o); if (!o->mode_valid) return; @@ -1154,10 +1151,9 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) o->bpp, o->depth, false, &o->fb_info[1]); o->fb_ids[2] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height, o->bpp, o->depth, true, &o->fb_info[2]); - if (!o->fb_ids[0] || !o->fb_ids[1] || !o->fb_ids[2]) { - fprintf(stderr, "failed to create fbs\n"); - igt_fail(3); - } + igt_assert(o->fb_ids[0]); + igt_assert(o->fb_ids[1]); + igt_assert(o->fb_ids[2]); paint_flip_mode(&o->fb_info[0], false); paint_flip_mode(&o->fb_info[1], true); @@ -1192,7 +1188,7 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) else o->vblank_state.seq_step = 1; - elapsed = event_loop(o, duration); + elapsed = event_loop(o, duration_ms); if (o->flags & TEST_FLIP && !(o->flags & TEST_NOEVENT)) check_final_state(o, &o->flip_state, elapsed); @@ -1213,14 +1209,12 @@ out: drmModeFreeConnector(o->kconnector[0]); } -static void run_test_on_crtc_pair(struct test_output *o, int crtc_idx0, int crtc_idx1, int duration) +static void run_test_on_crtc_pair(struct test_output *o, + int crtc_idx0, int crtc_idx1, int duration_ms) { unsigned elapsed; int i; - o->bpp = 32; - o->depth = 24; - connector_find_compatible_mode(crtc_idx0, crtc_idx1, o); if (!o->mode_valid) return; @@ -1239,10 +1233,9 @@ static void run_test_on_crtc_pair(struct test_output *o, int crtc_idx0, int crtc o->bpp, o->depth, false, &o->fb_info[1]); o->fb_ids[2] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height, o->bpp, o->depth, true, &o->fb_info[2]); - if (!o->fb_ids[0] || !o->fb_ids[1] || !o->fb_ids[2]) { - fprintf(stderr, "failed to create fbs\n"); - igt_fail(3); - } + igt_assert(o->fb_ids[0]); + igt_assert(o->fb_ids[1]); + igt_assert(o->fb_ids[2]); paint_flip_mode(&o->fb_info[0], false); paint_flip_mode(&o->fb_info[1], true); @@ -1282,7 +1275,7 @@ static void run_test_on_crtc_pair(struct test_output *o, int crtc_idx0, int crtc else o->vblank_state.seq_step = 1; - elapsed = event_loop(o, duration); + elapsed = event_loop(o, duration_ms); if (o->flags & TEST_FLIP && !(o->flags & TEST_NOEVENT)) check_final_state(o, &o->flip_state, elapsed); @@ -1308,15 +1301,34 @@ out: static int run_test(int duration, int flags) { struct test_output o; - int i, n; + int i, n, modes = 0; resources = drmModeGetResources(drm_fd); - if (!resources) { - fprintf(stderr, "drmModeGetResources failed: %s\n", - strerror(errno)); - igt_fail(5); + igt_assert(resources); + + /* Count output configurations to scale test runtime. */ + for (i = 0; i < resources->count_connectors; i++) { + for (n = 0; n < resources->count_crtcs; n++) { + memset(&o, 0, sizeof(o)); + o.count = 1; + o._connector[0] = resources->connectors[i]; + o.flags = flags; + o.flip_state.name = "flip"; + o.vblank_state.name = "vblank"; + o.bpp = 32; + o.depth = 24; + + connector_find_preferred_mode(o._connector[0], n, &o); + if (o.mode_valid) + modes++; + + } } + igt_assert(modes); + duration = duration * 1000 / modes; + duration = duration < 500 ? 500 : duration; + /* Find any connected displays */ for (i = 0; i < resources->count_connectors; i++) { for (n = 0; n < resources->count_crtcs; n++) { @@ -1326,6 +1338,8 @@ static int run_test(int duration, int flags) o.flags = flags; o.flip_state.name = "flip"; o.vblank_state.name = "vblank"; + o.bpp = 32; + o.depth = 24; run_test_on_crtc(&o, n, duration); } @@ -1338,15 +1352,39 @@ static int run_test(int duration, int flags) static int run_pair(int duration, int flags) { struct test_output o; - int i, j, m, n; + int i, j, m, n, modes = 0; resources = drmModeGetResources(drm_fd); - if (!resources) { - fprintf(stderr, "drmModeGetResources failed: %s\n", - strerror(errno)); - igt_fail(5); + igt_assert(resources); + + /* Find a pair of connected displays */ + for (i = 0; i < resources->count_connectors; i++) { + for (n = 0; n < resources->count_crtcs; n++) { + for (j = i + 1; j < resources->count_connectors; j++) { + for (m = n + 1; m < resources->count_crtcs; m++) { + memset(&o, 0, sizeof(o)); + o.count = 2; + o._connector[0] = resources->connectors[i]; + o._connector[1] = resources->connectors[j]; + o.flags = flags; + o.flip_state.name = "flip"; + o.vblank_state.name = "vblank"; + o.bpp = 32; + o.depth = 24; + + connector_find_compatible_mode(n, m, &o); + if (o.mode_valid) + modes++; + + } + } + } } + igt_assert(modes); + duration = duration * 1000 / modes; + duration = duration < 500 ? 500 : duration; + /* Find a pair of connected displays */ for (i = 0; i < resources->count_connectors; i++) { for (n = 0; n < resources->count_crtcs; n++) { @@ -1359,6 +1397,8 @@ static int run_pair(int duration, int flags) o.flags = flags; o.flip_state.name = "flip"; o.vblank_state.name = "vblank"; + o.bpp = 32; + o.depth = 24; run_test_on_crtc_pair(&o, n, m, duration); } @@ -1395,50 +1435,50 @@ int main(int argc, char **argv) int flags; const char *name; } tests[] = { - { 15, TEST_VBLANK, "wf_vblank" }, - { 15, TEST_VBLANK | TEST_CHECK_TS, "wf_vblank-ts-check" }, - { 15, TEST_VBLANK | TEST_VBLANK_BLOCK | TEST_CHECK_TS, + { 30, TEST_VBLANK, "wf_vblank" }, + { 30, TEST_VBLANK | TEST_CHECK_TS, "wf_vblank-ts-check" }, + { 30, TEST_VBLANK | TEST_VBLANK_BLOCK | TEST_CHECK_TS, "blocking-wf_vblank" }, - { 5, TEST_VBLANK | TEST_VBLANK_ABSOLUTE, + { 30, TEST_VBLANK | TEST_VBLANK_ABSOLUTE, "absolute-wf_vblank" }, - { 5, TEST_VBLANK | TEST_VBLANK_BLOCK | TEST_VBLANK_ABSOLUTE, + { 30, TEST_VBLANK | TEST_VBLANK_BLOCK | TEST_VBLANK_ABSOLUTE, "blocking-absolute-wf_vblank" }, - { 30, TEST_VBLANK | TEST_DPMS | TEST_EINVAL, "wf_vblank-vs-dpms" }, - { 30, TEST_VBLANK | TEST_DPMS | TEST_WITH_DUMMY_BCS, + { 60, TEST_VBLANK | TEST_DPMS | TEST_EINVAL, "wf_vblank-vs-dpms" }, + { 60, TEST_VBLANK | TEST_DPMS | TEST_WITH_DUMMY_BCS, "bcs-wf_vblank-vs-dpms" }, - { 30, TEST_VBLANK | TEST_DPMS | TEST_WITH_DUMMY_RCS, + { 60, TEST_VBLANK | TEST_DPMS | TEST_WITH_DUMMY_RCS, "rcs-wf_vblank-vs-dpms" }, - { 30, TEST_VBLANK | TEST_MODESET | TEST_EINVAL, "wf_vblank-vs-modeset" }, - { 30, TEST_VBLANK | TEST_MODESET | TEST_WITH_DUMMY_BCS, + { 60, TEST_VBLANK | TEST_MODESET | TEST_EINVAL, "wf_vblank-vs-modeset" }, + { 60, TEST_VBLANK | TEST_MODESET | TEST_WITH_DUMMY_BCS, "bcs-wf_vblank-vs-modeset" }, - { 30, TEST_VBLANK | TEST_MODESET | TEST_WITH_DUMMY_RCS, + { 60, TEST_VBLANK | TEST_MODESET | TEST_WITH_DUMMY_RCS, "rcs-wf_vblank-vs-modeset" }, - { 15, TEST_FLIP | TEST_EBUSY , "plain-flip" }, - { 15, TEST_FLIP | TEST_CHECK_TS | TEST_EBUSY , "plain-flip-ts-check" }, - { 15, TEST_FLIP | TEST_CHECK_TS | TEST_EBUSY | TEST_FB_RECREATE, + { 30, TEST_FLIP | TEST_EBUSY , "plain-flip" }, + { 30, TEST_FLIP | TEST_CHECK_TS | TEST_EBUSY , "plain-flip-ts-check" }, + { 30, TEST_FLIP | TEST_CHECK_TS | TEST_EBUSY | TEST_FB_RECREATE, "plain-flip-fb-recreate" }, - { 15, TEST_FLIP | TEST_EBUSY | TEST_RMFB | TEST_MODESET , "flip-vs-rmfb" }, - { 30, TEST_FLIP | TEST_DPMS | TEST_EINVAL, "flip-vs-dpms" }, - { 30, TEST_FLIP | TEST_DPMS | TEST_WITH_DUMMY_BCS, "bcs-flip-vs-dpms" }, - { 30, TEST_FLIP | TEST_DPMS | TEST_WITH_DUMMY_RCS, "rcs-flip-vs-dpms" }, - { 5, TEST_FLIP | TEST_PAN, "flip-vs-panning" }, - { 30, TEST_FLIP | TEST_PAN | TEST_WITH_DUMMY_BCS, "bcs-flip-vs-panning" }, - { 30, TEST_FLIP | TEST_PAN | TEST_WITH_DUMMY_RCS, "rcs-flip-vs-panning" }, - { 30, TEST_FLIP | TEST_MODESET | TEST_EINVAL, "flip-vs-modeset" }, - { 30, TEST_FLIP | TEST_MODESET | TEST_WITH_DUMMY_BCS, "bcs-flip-vs-modeset" }, - { 30, TEST_FLIP | TEST_MODESET | TEST_WITH_DUMMY_RCS, "rcs-flip-vs-modeset" }, - { 5, TEST_FLIP | TEST_VBLANK_EXPIRED_SEQ, + { 30, TEST_FLIP | TEST_EBUSY | TEST_RMFB | TEST_MODESET , "flip-vs-rmfb" }, + { 60, TEST_FLIP | TEST_DPMS | TEST_EINVAL, "flip-vs-dpms" }, + { 60, TEST_FLIP | TEST_DPMS | TEST_WITH_DUMMY_BCS, "bcs-flip-vs-dpms" }, + { 60, TEST_FLIP | TEST_DPMS | TEST_WITH_DUMMY_RCS, "rcs-flip-vs-dpms" }, + { 30, TEST_FLIP | TEST_PAN, "flip-vs-panning" }, + { 60, TEST_FLIP | TEST_PAN | TEST_WITH_DUMMY_BCS, "bcs-flip-vs-panning" }, + { 60, TEST_FLIP | TEST_PAN | TEST_WITH_DUMMY_RCS, "rcs-flip-vs-panning" }, + { 60, TEST_FLIP | TEST_MODESET | TEST_EINVAL, "flip-vs-modeset" }, + { 60, TEST_FLIP | TEST_MODESET | TEST_WITH_DUMMY_BCS, "bcs-flip-vs-modeset" }, + { 60, TEST_FLIP | TEST_MODESET | TEST_WITH_DUMMY_RCS, "rcs-flip-vs-modeset" }, + { 30, TEST_FLIP | TEST_VBLANK_EXPIRED_SEQ, "flip-vs-expired-vblank" }, - { 15, TEST_FLIP | TEST_VBLANK | TEST_VBLANK_ABSOLUTE | + { 30, TEST_FLIP | TEST_VBLANK | TEST_VBLANK_ABSOLUTE | TEST_CHECK_TS, "flip-vs-absolute-wf_vblank" }, - { 15, TEST_FLIP | TEST_VBLANK | TEST_CHECK_TS, + { 30, TEST_FLIP | TEST_VBLANK | TEST_CHECK_TS, "flip-vs-wf_vblank" }, - { 15, TEST_FLIP | TEST_VBLANK | TEST_VBLANK_BLOCK | + { 30, TEST_FLIP | TEST_VBLANK | TEST_VBLANK_BLOCK | TEST_CHECK_TS, "flip-vs-blocking-wf-vblank" }, - { 15, TEST_FLIP | TEST_MODESET | TEST_HANG | TEST_NOEVENT, "flip-vs-modeset-vs-hang" }, - { 15, TEST_FLIP | TEST_PAN | TEST_HANG, "flip-vs-panning-vs-hang" }, + { 30, TEST_FLIP | TEST_MODESET | TEST_HANG | TEST_NOEVENT, "flip-vs-modeset-vs-hang" }, + { 30, TEST_FLIP | TEST_PAN | TEST_HANG, "flip-vs-panning-vs-hang" }, { 1, TEST_FLIP | TEST_EINVAL | TEST_FB_BAD_TILING, "flip-vs-bad-tiling" }, { 1, TEST_DPMS_OFF | TEST_MODESET | TEST_FLIP, -- 2.7.4