diff options
author | Imre Deak <imre.deak@intel.com> | 2012-10-22 20:40:05 +0300 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-10-23 10:34:20 +0200 |
commit | 429dc016360946c4b126bf453187a2cb5d7dd003 (patch) | |
tree | e1813f39d51cebc69786fed68d9722d963ca30ff /tests | |
parent | 5fc312e9f1e19dfdbb1427d344489aa09002dcdd (diff) |
flip_test: fixup zero timestamp for premature vblanks
Signed-off-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/flip_test.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/flip_test.c b/tests/flip_test.c index 81a7afe6..00f98ce1 100644 --- a/tests/flip_test.c +++ b/tests/flip_test.c @@ -291,6 +291,30 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec, event_handler(&o->flip_state, frame, sec, usec); } +static void fixup_premature_vblank_ts(struct test_output *o, + struct event_state *es) +{ + /* + * In case a power off event preempts the completion of a + * wait-for-vblank event the kernel will return a wf-vblank event with + * a zeroed-out timestamp. In order that check_state() doesn't + * complain replace this ts with a valid ts. As we can't calculate the + * exact timestamp, just use the time we received the event. + */ + struct timeval tv; + + if (!(o->flags & (TEST_DPMS | TEST_MODESET))) + return; + + if (o->vblank_state.current_ts.tv_sec != 0 || + o->vblank_state.current_ts.tv_usec != 0) + return; + + tv.tv_sec = 0; + tv.tv_usec = 1; + timersub(&es->current_received_ts, &tv, &es->current_ts); +} + static void vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec, void *data) { @@ -298,6 +322,7 @@ static void vblank_handler(int fd, unsigned int frame, unsigned int sec, clear_flag(&o->pending_events, EVENT_VBLANK); event_handler(&o->vblank_state, frame, sec, usec); + fixup_premature_vblank_ts(o, &o->vblank_state); } static void check_state(struct test_output *o, struct event_state *es) |