derekf pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0f534dc3bd12daaf7ae840c5a303a5aff0da1acf

commit 0f534dc3bd12daaf7ae840c5a303a5aff0da1acf
Author: Derek Foreman <[email protected]>
Date:   Fri Sep 2 15:38:32 2016 -0500

    ecore_evas_drm: Use pageflips, not vblanks, to drive animation
    
    This should sort some timing problems.
---
 .../ecore_evas/engines/drm/ecore_evas_drm.c        | 49 +++++++---------------
 1 file changed, 15 insertions(+), 34 deletions(-)

diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c 
b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
index 90a3444..d8709d6 100644
--- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
+++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
@@ -55,6 +55,7 @@ typedef struct _Ecore_Evas_Engine_Drm_Data
    Ecore_Fd_Handler *hdlr;
    Ecore_Drm2_Device *dev;
    Ecore_Drm2_Output *output;
+   Eina_Bool pending : 1;
    Eina_Bool ticking : 1;
 } Ecore_Evas_Engine_Drm_Data;
 
@@ -611,55 +612,36 @@ _cb_drm_event(void *data, Ecore_Fd_Handler *hdlr 
EINA_UNUSED)
 }
 
 static void
-_tick_schedule(int fd, Ecore_Evas *ee)
-{
-   Ecore_Evas_Engine_Drm_Data *edata;
-
-   edata = ee->engine.data;
-   if (!edata->ticking) return;
-
-   drmVBlank vbl =
-     {
-        .request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT,
-        .request.sequence = 1,
-        .request.signal = (unsigned long)ee,
-     };
-
-   /* FIXME: On some systems this can fail, breaking ticking forever. */
-   drmWaitVBlank(fd, &vbl);
-}
-
-static void
 _cb_pageflip(int fd EINA_UNUSED, unsigned int frame EINA_UNUSED, unsigned int 
sec EINA_UNUSED, unsigned int usec EINA_UNUSED, void *data)
 {
    Ecore_Evas *ee;
    Ecore_Evas_Engine_Drm_Data *edata;
-   Ecore_Drm2_Fb *next;
+   int ret;
 
    ee = data;
    edata = ee->engine.data;
 
-   ecore_drm2_fb_flip_complete(edata->output);
+   ret = ecore_drm2_fb_flip_complete(edata->output);
+
+   edata->pending = EINA_FALSE;
 
-   next = ecore_drm2_output_next_fb_get(edata->output);
-   if (next)
+   if (edata->ticking)
      {
-        ecore_drm2_output_next_fb_set(edata->output, NULL);
-        ecore_drm2_fb_flip(next, edata->output);
+        ecore_evas_animator_tick(ee, NULL);
+        ecore_drm2_fb_flip(NULL, edata->output);
      }
+   else if (ret) ecore_drm2_fb_flip(NULL, edata->output);
 }
 
 static void
-_cb_vblank(int fd, unsigned int frame EINA_UNUSED, unsigned int sec 
EINA_UNUSED, unsigned int usec EINA_UNUSED, void *data)
+_drm_evas_changed(Ecore_Evas *ee, Eina_Bool changed)
 {
-   Ecore_Evas *ee;
    Ecore_Evas_Engine_Drm_Data *edata;
 
-   ee = data;
-   edata = ee->engine.data;
+   if (changed) return;
 
-   ecore_evas_animator_tick(ee, NULL);
-   if (edata->ticking) _tick_schedule(fd, ee);
+   edata = ee->engine.data;
+   if (edata->ticking && !edata->pending) ecore_drm2_fb_flip(NULL, 
edata->output);
 }
 
 static void
@@ -669,7 +651,7 @@ _drm_animator_register(Ecore_Evas *ee)
 
    edata = ee->engine.data;
    edata->ticking = EINA_TRUE;
-   _tick_schedule(edata->fd, ee);
+   if (!edata->pending) ecore_drm2_fb_flip(NULL, edata->output);
 }
 
 static void
@@ -760,7 +742,7 @@ static Ecore_Evas_Engine_Func _ecore_evas_drm_engine_func =
    _drm_animator_register, // animator_register
    _drm_animator_unregister, // animator_unregister
 
-   NULL // evas_changed
+   _drm_evas_changed, // evas_changed
 };
 
 static Ecore_Evas *
@@ -906,7 +888,6 @@ _ecore_evas_new_internal(const char *device, int x, int y, 
int w, int h, Eina_Bo
    /* setup vblank handler */
    memset(&edata->ctx, 0, sizeof(edata->ctx));
    edata->ctx.version = DRM_EVENT_CONTEXT_VERSION;
-   edata->ctx.vblank_handler = _cb_vblank;
    edata->ctx.page_flip_handler = _cb_pageflip;
 
    edata->hdlr =

-- 


Reply via email to