diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-08-29 15:33:53 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-08-29 16:19:41 +0100 |
commit | 919d68901187fa797a9b648fcf87c838fae22fa3 (patch) | |
tree | 5c5de81a56224bf62438c1ed287a1299811a4f74 | |
parent | d0ed91210795e75847b3a3da6b48b1179ff53ede (diff) |
kms_flips: Operate on an array of crtc
This should be no functional change as we operate on an array of
crtc[1]. Later we shall test clone mode across a number of crtc.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | tests/kms_flip.c | 134 |
1 files changed, 79 insertions, 55 deletions
diff --git a/tests/kms_flip.c b/tests/kms_flip.c index acd12ed1..aaab80b7 100644 --- a/tests/kms_flip.c +++ b/tests/kms_flip.c @@ -113,14 +113,15 @@ struct event_state { }; struct test_output { - uint32_t id; int mode_valid; - drmModeModeInfo mode; - drmModeEncoder *encoder; - drmModeConnector *connector; - int crtc; - int pipe; + drmModeModeInfo kmode[4]; + drmModeEncoder *kencoder[4]; + drmModeConnector *kconnector[4]; + uint32_t _connector[4]; + uint32_t _crtc[4]; + int count; /* 1:1 mapping between crtc:connector */ int flags; + int pipe; /* primary pipe for vblank */ unsigned int current_fb_id; unsigned int fb_width; unsigned int fb_height; @@ -166,7 +167,7 @@ static void emit_dummy_load__bcs(struct test_output *o) (0xcc << 16) | /* copy ROP */ pitch); OUT_BATCH(0 << 16 | 0); - OUT_BATCH((o->mode.vdisplay) << 16 | (o->mode.hdisplay)); + OUT_BATCH(o->fb_height << 16 | o->fb_width); OUT_RELOC_FENCED(dummy_bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0); OUT_BATCH(0 << 16 | 0); OUT_BATCH(pitch); @@ -210,7 +211,7 @@ static void emit_dummy_load__rcs(struct test_output *o) sb[0].tiling = I915_TILING_NONE; sb[0].data = NULL; sb[0].num_tiles = sb[0].bo->size; - sb[0].stride = 4 * o->mode.hdisplay; + sb[0].stride = 4 * o->fb_width; sb[1].bo = gem_handle_to_libdrm_bo(bufmgr, drm_fd, "imported", fb_info->gem_handle); igt_assert(sb[1].bo); @@ -228,7 +229,7 @@ static void emit_dummy_load__rcs(struct test_output *o) copyfunc(batch, src, 0, 0, - o->mode.hdisplay, o->mode.vdisplay, + o->fb_width, o->fb_height, dst, 0, 0); tmp = src; @@ -273,7 +274,15 @@ static int set_connector_dpms(drmModeConnector *connector, int mode) static int set_dpms(struct test_output *o, int mode) { - return set_connector_dpms(o->connector, mode); + int n; + + for (n = 0; n < o->count; n++) { + int ret = set_connector_dpms(o->kconnector[n], mode); + if (ret) + return ret; + } + + return 0; } static void set_flag(unsigned int *v, unsigned int flag) @@ -290,12 +299,14 @@ static void clear_flag(unsigned int *v, unsigned int flag) static int do_page_flip(struct test_output *o, int fb_id, bool event) { - int ret; + int n, ret = 0; - ret = drmModePageFlip(drm_fd, o->crtc, fb_id, event ? DRM_MODE_PAGE_FLIP_EVENT : 0, - event ? o : NULL); - if (ret == 0 && event) - set_flag(&o->pending_events, EVENT_FLIP); + for (n = 0; n < o->count; n++) { + ret = drmModePageFlip(drm_fd, o->_crtc[n], fb_id, event ? DRM_MODE_PAGE_FLIP_EVENT : 0, + event ? o : NULL); + if (ret == 0 && event) + set_flag(&o->pending_events, EVENT_FLIP); + } return ret; } @@ -358,7 +369,7 @@ static int do_wait_for_vblank(struct test_output *o, int pipe_id, static bool analog_tv_connector(struct test_output *o) { - uint32_t connector_type = o->connector->connector_type; + uint32_t connector_type = o->kconnector[0]->connector_type; return connector_type == DRM_MODE_CONNECTOR_TV || connector_type == DRM_MODE_CONNECTOR_9PinDIN || @@ -398,7 +409,7 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec, static double frame_time(struct test_output *o) { - return 1000.0 * 1000.0 / o->mode.vrefresh; + return 1000.0 * 1000.0 / o->kmode[0].vrefresh; } static void fixup_premature_vblank_ts(struct test_output *o, @@ -695,6 +706,19 @@ static void hang_gpu(struct test_output *o) close(fd); } +static int set_mode(struct test_output *o, int fb, int x, int y) +{ + int n; + + for (n = 0; n < o->count; n++) { + if (drmModeSetCrtc(drm_fd, o->_crtc[n], fb, + x, y, &o->_connector[n], 1, &o->kmode[n])) + return -1; + } + + return 0; +} + /* Return mask of completed events. */ static unsigned int run_test_step(struct test_output *o) { @@ -767,10 +791,7 @@ static unsigned int run_test_step(struct test_output *o) do_or_die(set_dpms(o, DRM_MODE_DPMS_OFF)); if (o->flags & TEST_MODESET) { - if (drmModeSetCrtc(drm_fd, o->crtc, - o->fb_ids[o->current_fb_id], - 0, 0, - &o->id, 1, &o->mode)) { + if (set_mode(o, o->fb_ids[o->current_fb_id], 0, 0)) { fprintf(stderr, "failed to restore output mode: %s\n", strerror(errno)); igt_fail(7); @@ -812,14 +833,12 @@ static unsigned int run_test_step(struct test_output *o) if (o->flags & TEST_PAN) { int count = do_flip ? o->flip_state.count : o->vblank_state.count; - int x_ofs = count * 10 > o->mode.hdisplay ? - o->mode.hdisplay : count * 10; + int x_ofs = count * 10 > o->fb_width ? o->fb_width : count * 10; - if (drmModeSetCrtc(drm_fd, o->crtc, o->fb_ids[o->current_fb_id], - x_ofs, 0, &o->id, 1, &o->mode)) { + if (set_mode(o, o->fb_ids[o->current_fb_id], x_ofs, 0)){ fprintf(stderr, "failed to pan (%dx%d@%dHz): %s\n", o->fb_width, o->fb_height, - o->mode.vrefresh, strerror(errno)); + o->kmode[0].vrefresh, strerror(errno)); igt_fail(7); } } @@ -828,10 +847,7 @@ static unsigned int run_test_step(struct test_output *o) do_or_die(set_dpms(o, DRM_MODE_DPMS_OFF)); if (o->flags & TEST_MODESET && !(o->flags & TEST_RMFB)) { - if (drmModeSetCrtc(drm_fd, o->crtc, - 0, /* no fb */ - 0, 0, - NULL, 0, NULL)) { + if (set_mode(o, 0 /* no fb */, 0, 0)) { fprintf(stderr, "failed to disable output: %s\n", strerror(errno)); igt_fail(7); @@ -883,12 +899,16 @@ static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx, return; } - o->connector = config.connector; - o->encoder = config.encoder; - o->crtc = config.crtc->crtc_id; o->pipe = config.pipe; - o->mode = config.default_mode; + o->kconnector[0] = config.connector; + o->kencoder[0] = config.encoder; + o->_crtc[0] = config.crtc->crtc_id; + o->kmode[0] = config.default_mode; o->mode_valid = 1; + + o->fb_width = o->kmode[0].hdisplay; + o->fb_height = o->kmode[0].vdisplay; + } static void paint_flip_mode(struct kmstest_fb *fb, bool odd_frame) @@ -913,13 +933,20 @@ static void paint_flip_mode(struct kmstest_fb *fb, bool odd_frame) static int fb_is_bound(struct test_output *o, int fb) { - struct drm_mode_crtc mode; + int n; - mode.crtc_id = o->crtc; - if (drmIoctl(drm_fd, DRM_IOCTL_MODE_GETCRTC, &mode)) - return 0; + for (n = 0; n < o->count; n++) { + struct drm_mode_crtc mode; - return mode.mode_valid && mode.fb_id == fb; + mode.crtc_id = o->_crtc[n]; + if (drmIoctl(drm_fd, DRM_IOCTL_MODE_GETCRTC, &mode)) + return 0; + + if (!mode.mode_valid || mode.fb_id != fb) + return false; + } + + return true; } static void check_final_state(struct test_output *o, struct event_state *es, @@ -937,10 +964,10 @@ static void check_final_state(struct test_output *o, struct event_state *es, int count = es->count; count *= es->seq_step; - expected = ellapsed * o->mode.vrefresh / (1000 * 1000); + expected = ellapsed * o->kmode[0].vrefresh / (1000 * 1000); if (count < expected * 99/100) { fprintf(stderr, "dropped frames, expected %d, counted %d, encoder type %d\n", - expected, count, o->encoder->encoder_type); + expected, count, o->kencoder[0]->encoder_type); igt_fail(3); } } @@ -1029,17 +1056,14 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) o->bpp = 32; o->depth = 24; - connector_find_preferred_mode(o->id, crtc_idx, o); + connector_find_preferred_mode(o->_connector[0], crtc_idx, o); if (!o->mode_valid) return; - last_connector = o->connector; + last_connector = o->kconnector[0]; fprintf(stdout, "Beginning %s on crtc %d, connector %d\n", - igt_subtest_name(), o->crtc, o->id); - - o->fb_width = o->mode.hdisplay; - o->fb_height = o->mode.vdisplay; + igt_subtest_name(), o->_crtc[0], o->_connector[0]); if (o->flags & TEST_PAN) o->fb_width *= 2; @@ -1062,15 +1086,14 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) set_y_tiling(o, 2); - kmstest_dump_mode(&o->mode); - if (drmModeSetCrtc(drm_fd, o->crtc, o->fb_ids[0], 0, 0, - &o->id, 1, &o->mode)) { + kmstest_dump_mode(&o->kmode[0]); + if (set_mode(o, o->fb_ids[0], 0, 0)) { /* We may fail to apply the mode if there are hidden * constraints, such as bandwidth on the third pipe. */ if (0) { fprintf(stderr, "failed to set mode (%dx%d@%dHz): %s\n", - o->fb_width, o->fb_height, o->mode.vrefresh, + o->fb_width, o->fb_height, o->kmode[0].vrefresh, strerror(errno)); } goto out; @@ -1102,7 +1125,7 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) check_final_state(o, &o->vblank_state, ellapsed); fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n", - igt_subtest_name(), o->crtc, o->id); + igt_subtest_name(), o->_crtc[0], o->_connector[0]); out: kmstest_remove_fb(drm_fd, &o->fb_info[2]); @@ -1111,8 +1134,8 @@ out: last_connector = NULL; - drmModeFreeEncoder(o->encoder); - drmModeFreeConnector(o->connector); + drmModeFreeEncoder(o->kencoder[0]); + drmModeFreeConnector(o->kconnector[0]); } static int run_test(int duration, int flags) @@ -1132,7 +1155,8 @@ static int run_test(int duration, int flags) for (c = 0; c < resources->count_connectors; c++) { for (crtc_idx = 0; crtc_idx < resources->count_crtcs; crtc_idx++) { memset(&o, 0, sizeof(o)); - o.id = resources->connectors[c]; + o.count = 1; + o._connector[0] = resources->connectors[c]; o.flags = flags; o.flip_state.name = "flip"; o.vblank_state.name = "vblank"; |