summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSooChan Lim <sc1.lim@samsung.com>2020-08-13 14:01:29 +0900
committerSooChan Lim <sc1.lim@samsung.com>2020-08-13 14:15:54 +0900
commitffe01e304f8c277b2df0267255fff0d18f084fb6 (patch)
tree28ab960186e32b1d0729d87133582ffe948f2b5e
parent3a2f2c9d40c75e625f2f703070d4269594fa94a5 (diff)
downloadlibtdm-sprd-ffe01e304f8c277b2df0267255fff0d18f084fb6.tar.gz
libtdm-sprd-ffe01e304f8c277b2df0267255fff0d18f084fb6.tar.bz2
libtdm-sprd-ffe01e304f8c277b2df0267255fff0d18f084fb6.zip
support the sync(block) mode for wait_vblank
Change-Id: I6b85fa9846f1d6e8585e68cf884cc62e8615f003
-rw-r--r--src/tdm_sprd.h2
-rw-r--r--src/tdm_sprd_display.c18
-rw-r--r--src/tdm_sprd_hwc.c2
3 files changed, 14 insertions, 8 deletions
diff --git a/src/tdm_sprd.h b/src/tdm_sprd.h
index 1d1f482..96da47e 100644
--- a/src/tdm_sprd.h
+++ b/src/tdm_sprd.h
@@ -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);
diff --git a/src/tdm_sprd_display.c b/src/tdm_sprd_display.c
index 90b6393..d7ef6a9 100644
--- a/src/tdm_sprd_display.c
+++ b/src/tdm_sprd_display.c
@@ -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;
diff --git a/src/tdm_sprd_hwc.c b/src/tdm_sprd_hwc.c
index 48ea88d..03698cd 100644
--- a/src/tdm_sprd_hwc.c
+++ b/src/tdm_sprd_hwc.c
@@ -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;