summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMatt Roper <matthew.d.roper@intel.com>2014-06-30 16:44:23 -0700
committerDamien Lespiau <damien.lespiau@intel.com>2014-07-04 12:03:45 +0100
commit2a3e212acc01742ac0a0f8bcf969e8a1ae2343b1 (patch)
tree230cc40560b6f90ba8360bdd779f1067ffe085da /lib
parent3cc60bab465f6d22b64a7034ce75e47dd2163e6e (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.c15
-rw-r--r--lib/igt_kms.h1
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];