tdm_error tdm_sprd_output_do_commit(tdm_sprd_output_data *output_data);
tdm_error tdm_sprd_output_get_cur_msc(int fd, int pipe, uint *msc);
-tdm_error tdm_sprd_output_wait_vblank(int fd, int pipe, uint *target_msc, void *data);
+tdm_error tdm_sprd_output_wait_vblank(int fd, int pipe, uint *target_msc, int sync, void *data);
tdm_sprd_layer_data *sprd_output_data_get_layer_data(tdm_sprd_output_data *output_data, int layer_zpos);
tdm_error sprd_layer_get_buffer(tdm_layer *layer, tbm_surface_h *surface);
tdm_error sprd_layer_get_zpos(tdm_layer *layer, int *zpos);
}
tdm_error
-tdm_sprd_output_wait_vblank(int fd, int pipe, uint *target_msc, void *data)
+tdm_sprd_output_wait_vblank(int fd, int pipe, uint *target_msc, int sync, void *data)
{
drmVBlank vbl;
- vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
if (pipe > 0)
vbl.request.type |= DRM_VBLANK_SECONDARY;
- vbl.request.sequence = *target_msc;
- vbl.request.signal = (unsigned long) (uintptr_t) data;
+ if (sync) {
+ vbl.request.type = DRM_VBLANK_RELATIVE;
+ vbl.request.sequence = 1;
+ vbl.request.signal = (unsigned long) (uintptr_t) data;
+ } else {
+ vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
+ vbl.request.sequence = *target_msc;
+ vbl.request.signal = (unsigned long) (uintptr_t) data;
+ }
if (_localdrmWaitVBlank(fd, &vbl)) {
*target_msc = 0;
vblank_data->output_data = output_data;
vblank_data->user_data = user_data;
- ret = tdm_sprd_output_wait_vblank(sprd_data->drm_fd, output_data->pipe, &target_msc, vblank_data);
+ ret = tdm_sprd_output_wait_vblank(sprd_data->drm_fd, output_data->pipe, &target_msc, sync, vblank_data);
if (ret != TDM_ERROR_NONE)
goto failed_vblank;
vblank_data->output_data = output_data;
vblank_data->user_data = user_data;
- ret = tdm_sprd_output_wait_vblank(sprd_data->drm_fd, output_data->pipe, &target_msc, vblank_data);
+ ret = tdm_sprd_output_wait_vblank(sprd_data->drm_fd, output_data->pipe, &target_msc, sync, vblank_data);
if (ret != TDM_ERROR_NONE) {
free(vblank_data);
return ret;
vblank_data->output_data = output_data;
vblank_data->user_data = user_data;
- ret = tdm_sprd_output_wait_vblank(sprd_data->drm_fd, output_data->pipe, &target_msc, vblank_data);
+ ret = tdm_sprd_output_wait_vblank(sprd_data->drm_fd, output_data->pipe, &target_msc, sync, vblank_data);
if (ret != TDM_ERROR_NONE) {
free(vblank_data);
return ret;