diff options
author | Matt Roper <matthew.d.roper@intel.com> | 2014-06-30 16:44:23 -0700 |
---|---|---|
committer | Damien Lespiau <damien.lespiau@intel.com> | 2014-07-04 12:03:45 +0100 |
commit | 2a3e212acc01742ac0a0f8bcf969e8a1ae2343b1 (patch) | |
tree | 230cc40560b6f90ba8360bdd779f1067ffe085da /lib | |
parent | 3cc60bab465f6d22b64a7034ce75e47dd2163e6e (diff) |
lib/kms: Track need for vblank wait locally
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>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/igt_kms.c | 15 | ||||
-rw-r--r-- | lib/igt_kms.h | 1 |
2 files changed, 10 insertions, 6 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 1e7b901c..3f561e9a 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -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; diff --git a/lib/igt_kms.h b/lib/igt_kms.h index 88b695ab..a9a42368 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -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]; |