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);

-- 


Reply via email to