tests/kms_flip: scale test runtime
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 30 Sep 2013 19:38:09 +0000 (21:38 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 30 Sep 2013 20:55:12 +0000 (22:55 +0200)
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 <daniel.vetter@ffwll.ch>
tests/kms_flip.c

index 079bdfa..ee75ee8 100644 (file)
@@ -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,