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,
plane->fb_changed = false;
plane->position_changed = false;
+ pipe->need_wait_for_vblank = true;
}
return 0;
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;
}
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];