support the sync(block) mode for wait_vblank 40/241140/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 13 Aug 2020 05:01:29 +0000 (14:01 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 13 Aug 2020 05:15:54 +0000 (14:15 +0900)
Change-Id: I6b85fa9846f1d6e8585e68cf884cc62e8615f003

src/tdm_sprd.h
src/tdm_sprd_display.c
src/tdm_sprd_hwc.c

index 1d1f482..96da47e 100644 (file)
@@ -303,7 +303,7 @@ tdm_sprd_display_buffer *tdm_sprd_display_find_buffer(tdm_sprd_data *sprd_data,
 
 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);
index 90b6393..d7ef6a9 100644 (file)
@@ -161,16 +161,22 @@ 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_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;
@@ -1092,7 +1098,7 @@ sprd_output_wait_vblank(tdm_output *output, int interval, int sync, void *user_d
        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;
 
@@ -1147,7 +1153,7 @@ sprd_output_commit(tdm_output *output, int sync, void *user_data)
        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;
index 48ea88d..03698cd 100644 (file)
@@ -585,7 +585,7 @@ sprd_hwc_commit(tdm_hwc *hwc, int sync, void *user_data)
        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;