On Wed, Jan 10, 2018 at 09:57:47AM +0100, Daniel Vetter wrote: > On Thu, Jan 04, 2018 at 03:12:39PM +0100, Maarten Lankhorst wrote: > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > > --- > > tests/kms_vblank.c | 93 ++++++++++++++++++++++++++++-------------------------- > > 1 file changed, 49 insertions(+), 44 deletions(-) > > > > diff --git a/tests/kms_vblank.c b/tests/kms_vblank.c > > index 342e4ef23b97..e51e96c7f061 100644 > > --- a/tests/kms_vblank.c > > +++ b/tests/kms_vblank.c > > @@ -118,49 +118,41 @@ static void run_test(data_t *data, int fd, void (*testfunc)(data_t *, int, int)) > > int nchildren = > > data->flags & FORKED ? sysconf(_SC_NPROCESSORS_ONLN) : 1; > > igt_display_t *display = &data->display; > > - igt_output_t *output; > > - enum pipe p; > > + igt_output_t *output = data->output; > > > > - for_each_pipe_with_valid_output(display, p, output) { > > - data->pipe = p; > > - prepare_crtc(data, fd, output); > > + prepare_crtc(data, fd, output); > > > > - igt_info("Beginning %s on pipe %s, connector %s (%d threads)\n", > > - igt_subtest_name(), > > - kmstest_pipe_name(data->pipe), > > - igt_output_name(output), > > - nchildren); > > - > > - if (data->flags & BUSY) { > > - union drm_wait_vblank vbl; > > - > > - memset(&vbl, 0, sizeof(vbl)); > > - vbl.request.type = > > - DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT; > > - vbl.request.type |= kmstest_get_vbl_flag(data->pipe); > > - vbl.request.sequence = 120 + 12; > > - igt_assert_eq(wait_vblank(fd, &vbl), 0); > > - } > > + igt_info("Beginning %s on pipe %s, connector %s (%d threads)\n", > > + igt_subtest_name(), kmstest_pipe_name(data->pipe), > > + igt_output_name(output), nchildren); > > > > - igt_fork(child, nchildren) > > - testfunc(data, fd, nchildren); > > - igt_waitchildren(); > > - > > - if (data->flags & BUSY) { > > - struct drm_event_vblank buf; > > - igt_assert_eq(read(fd, &buf, sizeof(buf)), sizeof(buf)); > > - } > > + if (data->flags & BUSY) { > > + union drm_wait_vblank vbl; > > > > - igt_assert(poll(&(struct pollfd){fd, POLLIN}, 1, 0) == 0); > > + memset(&vbl, 0, sizeof(vbl)); > > + vbl.request.type = > > + DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT; > > + vbl.request.type |= kmstest_get_vbl_flag(data->pipe); > > + vbl.request.sequence = 120 + 12; > > + igt_assert_eq(wait_vblank(fd, &vbl), 0); > > + } > > > > - igt_info("\n%s on pipe %s, connector %s: PASSED\n\n", > > - igt_subtest_name(), > > - kmstest_pipe_name(data->pipe), > > - igt_output_name(output)); > > + igt_fork(child, nchildren) > > + testfunc(data, fd, nchildren); > > + igt_waitchildren(); > > > > - /* cleanup what prepare_crtc() has done */ > > - cleanup_crtc(data, fd, output); > > + if (data->flags & BUSY) { > > + struct drm_event_vblank buf; > > + igt_assert_eq(read(fd, &buf, sizeof(buf)), sizeof(buf)); > > } > > + > > + igt_assert(poll(&(struct pollfd){fd, POLLIN}, 1, 0) == 0); > > + > > + igt_info("\n%s on pipe %s, connector %s: PASSED\n\n", > > + igt_subtest_name(), kmstest_pipe_name(data->pipe), igt_output_name(output)); > > + > > + /* cleanup what prepare_crtc() has done */ > > + cleanup_crtc(data, fd, output); > > } > > > > static void crtc_id_subtest(data_t *data, int fd) > > @@ -329,6 +321,8 @@ igt_main > > { "wait", vblank_wait, IDLE | FORKED | BUSY }, > > { } > > }, *f; > > + enum pipe p; > > + > > const struct { > > const char *name; > > unsigned int flags; > > @@ -352,14 +346,25 @@ igt_main > > igt_subtest("crtc-id") > > crtc_id_subtest(&data, fd); > > > > - for (f = funcs; f->name; f++) { > > - for (m = modes; m->name; m++) { > > - if (m->flags & ~f->valid) > > - continue; > > - > > - igt_subtest_f("%s-%s", f->name, m->name) { > > - data.flags = m->flags; > > - run_test(&data, fd, f->func); > > + for_each_pipe_static(p) igt_subtest_group { > > Imo newline and {} and more indent, I was confused for a bit looking where > you have the igt_subtest_group :-) > > Also we need to give the cibuglog folks a headups before pushing ofc. > > With the bikeshed addressed: > > Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > > > > + igt_fixture > > + igt_display_require_output_on_pipe(&data.display, p); > > + > > + data.pipe = p; > > + > > + for (f = funcs; f->name; f++) { > > + for (m = modes; m->name; m++) { > > + if (m->flags & ~f->valid) > > + continue; > > + > > + igt_subtest_f("pipe-%s-%s-%s", > > + kmstest_pipe_name(data.pipe), > > + f->name, m->name) { > > + for_each_valid_output_on_pipe(&data.display, data.pipe, data.output) { > > + data.flags = m->flags; > > + run_test(&data, fd, f->func); > > + } Ok I totally overlooked this one - looping over all output combos still means tons of modesets within each subtest. How does that make stuff faster/better? -Daniel > > + } > > } > > } > > } > > -- > > 2.15.1 > > > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > > https://lists.freedesktop.org/mailman/listinfo/intel-gfx > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx