lib/kms: Track need for vblank wait locally
authorMatt Roper <matthew.d.roper@intel.com>
Mon, 30 Jun 2014 23:44:23 +0000 (16:44 -0700)
committerDamien Lespiau <damien.lespiau@intel.com>
Fri, 4 Jul 2014 11:03:45 +0000 (12:03 +0100)
The need to wait for a vblank after programming is due to the way we
actually program the hardware.  Move need_wait_for_vblank out of the
pipe and into a local variable in preparation for future programming
styles (e.g., atomic pageflip) that will need different logic.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
lib/igt_kms.c
lib/igt_kms.h

index 1e7b901..3f561e9 100644 (file)
@@ -759,13 +759,11 @@ 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_fb_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,
@@ -814,7 +812,6 @@ 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;
@@ -840,6 +837,7 @@ static int igt_output_commit(igt_output_t *output)
        igt_plane_t *primary;
        igt_plane_t *cursor;
        int i;
+       bool need_wait_for_vblank = false;
 
        pipe = igt_output_get_driving_pipe(output);
        primary = igt_pipe_get_plane(pipe, IGT_PLANE_PRIMARY);
@@ -925,17 +923,24 @@ static int igt_output_commit(igt_output_t *output)
                igt_assert(ret == 0);
 
                cursor->fb_changed = false;
+               need_wait_for_vblank = true;
        }
 
        for (i = 0; i < pipe->n_planes; i++) {
                igt_plane_t *plane = &pipe->planes[i];
 
+               if (plane->fb_changed || plane->position_changed)
+                       need_wait_for_vblank = true;
+
                igt_plane_commit(plane, output);
        }
 
-       if (pipe->need_wait_for_vblank) {
+       /*
+        * If the crtc is enabled, wait until the next vblank before returning
+        * if we made changes to any of the planes.
+        */
+       if (need_wait_for_vblank && igt_plane_get_fb_id(primary) != 0) {
                igt_wait_for_vblank(display->drm_fd, pipe->pipe);
-               pipe->need_wait_for_vblank = false;
        }
 
        return 0;
index 88b695a..a9a4236 100644 (file)
@@ -120,7 +120,6 @@ typedef struct {
 struct igt_pipe {
        igt_display_t *display;
        enum pipe pipe;
-       unsigned int need_wait_for_vblank : 1;
 #define IGT_MAX_PLANES 4
        int n_planes;
        igt_plane_t planes[IGT_MAX_PLANES];