From fb146aa7825b8f3a1c490f30b4c3912b7fe8eb6d Mon Sep 17 00:00:00 2001 From: Damien Lespiau Date: Thu, 6 Feb 2014 21:18:28 +0000 Subject: [PATCH] lib/display: Wait for a vblank after SetPlane() Let's be testing friendly and gently wait for the next vblank before returning from commit() when needed. After igt_display_commit() one can safely look at the CRC. Signed-off-by: Damien Lespiau --- lib/igt_kms.c | 8 ++++++++ lib/igt_kms.h | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 54e3cdd..07b0a4e 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -1175,11 +1175,13 @@ static int igt_cursor_commit(igt_plane_t *plane, igt_output_t *output) static int igt_drm_plane_commit(igt_plane_t *plane, igt_output_t *output) { igt_display_t *display = output->display; + igt_pipe_t *pipe; uint32_t fb_id, crtc_id; int ret; fb_id = igt_plane_get_fd_id(plane); crtc_id = output->config.crtc->crtc_id; + pipe = igt_output_get_driving_pipe(output); if (plane->fb_changed && fb_id == 0) { LOG(display, @@ -1228,6 +1230,7 @@ static int igt_drm_plane_commit(igt_plane_t *plane, igt_output_t *output) plane->fb_changed = false; plane->position_changed = false; + pipe->need_wait_for_vblank = true; } return 0; @@ -1347,6 +1350,11 @@ static int igt_output_commit(igt_output_t *output) igt_plane_commit(plane, output); } + if (pipe->need_wait_for_vblank) { + igt_wait_for_vblank(display->drm_fd, pipe->pipe); + pipe->need_wait_for_vblank = false; + } + return 0; } diff --git a/lib/igt_kms.h b/lib/igt_kms.h index 96dd9e4..8c1c0a7 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -136,8 +136,9 @@ typedef struct { struct igt_pipe { igt_display_t *display; enum pipe pipe; - unsigned int need_set_crtc : 1; - unsigned int need_set_cursor : 1; + unsigned int need_set_crtc : 1; + unsigned int need_set_cursor : 1; + unsigned int need_wait_for_vblank : 1; #define IGT_MAX_PLANES 4 int n_planes; igt_plane_t planes[IGT_MAX_PLANES]; -- 2.7.4