derekf pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=20def4da21e9fcea3d6ab910493b529ab371e3f4
commit 20def4da21e9fcea3d6ab910493b529ab371e3f4 Author: Derek Foreman <[email protected]> Date: Wed Jul 12 15:27:52 2017 -0500 ecore_drm2: Add a query for the next vblank time I guess this is a feature, and we're deep in freeze, but: a) this is critical for fixing T5462 properly without any side effects. b) ecore_drm2 is all beta api c) this should only affect wayland users ref T5462 --- src/lib/ecore_drm2/Ecore_Drm2.h | 14 ++++++++++++++ src/lib/ecore_drm2/ecore_drm2.c | 3 ++- src/lib/ecore_drm2/ecore_drm2_outputs.c | 22 ++++++++++++++++++++++ src/lib/ecore_drm2/ecore_drm2_private.h | 2 +- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/lib/ecore_drm2/Ecore_Drm2.h b/src/lib/ecore_drm2/Ecore_Drm2.h index 2d0779a4c9..4be533bc66 100644 --- a/src/lib/ecore_drm2/Ecore_Drm2.h +++ b/src/lib/ecore_drm2/Ecore_Drm2.h @@ -1075,6 +1075,20 @@ EAPI Eina_Bool ecore_drm2_plane_fb_set(Ecore_Drm2_Plane *plane, Ecore_Drm2_Fb *f * @since 1.20 */ EAPI void ecore_drm2_fb_status_handler_set(Ecore_Drm2_Fb *fb, Ecore_Drm2_Fb_Status_Handler handler, void *data); + +/** + * Get the time of the last vblank + * + * Query the display hardware for the time of the last vblank. + * + * @param output + * @param sec + * @param usec + * + * @since 1.20 + */ +EAPI Eina_Bool ecore_drm2_output_blanktime_get(Ecore_Drm2_Output *output, long *sec, long *usec); + # endif #endif diff --git a/src/lib/ecore_drm2/ecore_drm2.c b/src/lib/ecore_drm2/ecore_drm2.c index a43b11366a..526ea4a523 100644 --- a/src/lib/ecore_drm2/ecore_drm2.c +++ b/src/lib/ecore_drm2/ecore_drm2.c @@ -46,6 +46,7 @@ int (*sym_drmModePageFlip)(int fd, uint32_t crtc_id, uint32_t fb_id, uint32_t fl int (*sym_drmModeDirtyFB)(int fd, uint32_t bufferId, drmModeClipPtr clips, uint32_t num_clips) = NULL; int (*sym_drmModeCrtcSetGamma)(int fd, uint32_t crtc_id, uint32_t size, uint16_t *red, uint16_t *green, uint16_t *blue) = NULL; int (*sym_drmPrimeFDToHandle)(int fd, int prime_fd, uint32_t *handle) = NULL; +int (*sym_drmWaitVBlank)(int fd, drmVBlank *vbl) = NULL; EAPI int ECORE_DRM2_EVENT_OUTPUT_CHANGED = -1; EAPI int ECORE_DRM2_EVENT_ACTIVATE = -1; @@ -82,7 +83,7 @@ _ecore_drm2_link(void) SYM(drm_lib, drmIoctl); /* SYM(drm_lib, drmClose); */ - /* SYM(drm_lib, drmWaitVBlank); */ + SYM(drm_lib, drmWaitVBlank); SYM(drm_lib, drmHandleEvent); SYM(drm_lib, drmGetVersion); SYM(drm_lib, drmFreeVersion); diff --git a/src/lib/ecore_drm2/ecore_drm2_outputs.c b/src/lib/ecore_drm2/ecore_drm2_outputs.c index 11b3c22ae3..d2b3acb54b 100644 --- a/src/lib/ecore_drm2/ecore_drm2_outputs.c +++ b/src/lib/ecore_drm2/ecore_drm2_outputs.c @@ -1582,3 +1582,25 @@ ecore_drm2_output_subpixel_get(const Ecore_Drm2_Output *output) EINA_SAFETY_ON_NULL_RETURN_VAL(output, 0); return output->subpixel; } + +EAPI Eina_Bool +ecore_drm2_output_blanktime_get(Ecore_Drm2_Output *output, long *sec, long *usec) +{ + drmVBlank v; + int ret; + + EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(sec, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(usec, EINA_FALSE); + + memset(&v, 0, sizeof(v)); + v.request.type = DRM_VBLANK_RELATIVE; + ret = sym_drmWaitVBlank(output->fd, &v); + if (ret) return EINA_FALSE; + if (v.reply.tval_sec < 0) return EINA_FALSE; + if (v.reply.tval_usec < 0) return EINA_FALSE; + + *sec = v.reply.tval_sec; + *usec = v.reply.tval_usec; + return EINA_TRUE; +} diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h b/src/lib/ecore_drm2/ecore_drm2_private.h index 4ec2147e76..c8c2bf66c2 100644 --- a/src/lib/ecore_drm2/ecore_drm2_private.h +++ b/src/lib/ecore_drm2/ecore_drm2_private.h @@ -302,7 +302,7 @@ void _ecore_drm2_fb_deref(Ecore_Drm2_Fb *); void _ecore_drm2_fb_buffer_release(Ecore_Drm2_Output *output, Ecore_Drm2_Output_State *s); /* extern int (*sym_drmClose)(int fd); */ -/* extern int (*sym_drmWaitVBlank)(int fd, drmVBlank *vbl); */ +extern int (*sym_drmWaitVBlank)(int fd, drmVBlank *vbl); extern int (*sym_drmHandleEvent)(int fd, drmEventContext *evctx); extern void *(*sym_drmGetVersion)(int fd); extern void (*sym_drmFreeVersion)(void *drmver); --
