lib/display: Wait for a vblank after SetPlane()
authorDamien Lespiau <damien.lespiau@intel.com>
Thu, 6 Feb 2014 21:18:28 +0000 (21:18 +0000)
committerDamien Lespiau <damien.lespiau@intel.com>
Tue, 11 Feb 2014 13:50:16 +0000 (13:50 +0000)
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 <damien.lespiau@intel.com>
lib/igt_kms.c
lib/igt_kms.h

index 54e3cdd..07b0a4e 100644 (file)
@@ -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;
 }
 
index 96dd9e4..8c1c0a7 100644 (file)
@@ -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];