raster pushed a commit to branch master.

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

commit da04400c5d22aac0888ceb945c0afe28459af06c
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Fri Oct 28 13:58:56 2016 +0900

    ecore-animator allow for animator to skip queued animator ticks
    
    set ECORE_ANIMATOR_SKIP to skip queued animtor ticks if multiple are
    in the pipeline. optional and not on by default. i would think its not
    a good idea to skip these animator ticks and skipping/deferring is a
    job higher up.
    
    @feature
---
 src/lib/ecore/ecore_anim.c           | 24 ++++++++++++++++++++++--
 src/lib/ecore_x/xlib/ecore_x_vsync.c | 23 +++++++++++++++++++++--
 2 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/src/lib/ecore/ecore_anim.c b/src/lib/ecore/ecore_anim.c
index 70c2f89..c069c96 100644
--- a/src/lib/ecore/ecore_anim.c
+++ b/src/lib/ecore/ecore_anim.c
@@ -69,6 +69,9 @@ static volatile int timer_fd_read = -1;
 static volatile int timer_fd_write = -1;
 static Ecore_Thread *timer_thread = NULL;
 static volatile int timer_event_is_busy = 0;
+static Eina_Spinlock tick_queue_lock;
+static int           tick_queue_count = 0;
+static Eina_Bool     tick_skip = EINA_FALSE;
 
 static void
 _tick_send(signed char val)
@@ -88,6 +91,9 @@ _timer_send_time(double t)
      {
         *tim = t;
         DBG("   ... send %1.8f", t);
+        eina_spinlock_take(&tick_queue_lock);
+        tick_queue_count++;
+        eina_spinlock_release(&tick_queue_lock);
         ecore_thread_feedback(timer_thread, tim);
      }
 }
@@ -150,6 +156,12 @@ done:
 static void
 _timer_tick_notify(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED, 
void *msg)
 {
+   int tick_queued;
+
+   eina_spinlock_take(&tick_queue_lock);
+   tick_queued = tick_queue_count;
+   tick_queue_count--;
+   eina_spinlock_release(&tick_queue_lock);
    DBG("notify.... %3.3f %i", *((double *)msg), timer_event_is_busy);
    if (timer_event_is_busy)
      {
@@ -157,8 +169,11 @@ _timer_tick_notify(void *data EINA_UNUSED, Ecore_Thread 
*thread EINA_UNUSED, voi
         static double pt = 0.0;
 
         DBG("VSYNC %1.8f = delt %1.8f", *t, *t - pt);
-        ecore_loop_time_set(*t);
-        _do_tick();
+        if ((!tick_skip) || (tick_queued == 1))
+          {
+             ecore_loop_time_set(*t);
+             _do_tick();
+          }
         pt = *t;
      }
    free(msg);
@@ -167,7 +182,9 @@ _timer_tick_notify(void *data EINA_UNUSED, Ecore_Thread 
*thread EINA_UNUSED, voi
 static void
 _timer_tick_finished(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED)
 {
+   eina_spinlock_free(&tick_queue_lock);
    timer_thread = NULL;
+   tick_queue_count = 0;
    if (timer_fd_read >= 0)
      {
         pipe_close(timer_fd_read);
@@ -190,6 +207,9 @@ _timer_tick_begin(void)
         if (pipe(fds) != 0) return;
         timer_fd_read = fds[0];
         timer_fd_write = fds[1];
+        if (getenv("ECORE_ANIMATOR_SKIP")) tick_skip = EINA_TRUE;
+        tick_queue_count = 0;
+        eina_spinlock_new(&tick_queue_lock);
         timer_thread = ecore_thread_feedback_run(_timer_tick_core,
                                                  _timer_tick_notify,
                                                  _timer_tick_finished,
diff --git a/src/lib/ecore_x/xlib/ecore_x_vsync.c 
b/src/lib/ecore_x/xlib/ecore_x_vsync.c
index 34eb605..436645e 100644
--- a/src/lib/ecore_x/xlib/ecore_x_vsync.c
+++ b/src/lib/ecore_x/xlib/ecore_x_vsync.c
@@ -147,6 +147,10 @@ static void *drm_lib = NULL;
 
 static Eina_Thread_Queue *thq = NULL;
 static Ecore_Thread *drm_thread = NULL;
+static Eina_Spinlock tick_queue_lock;
+static int           tick_queue_count = 0;
+static Eina_Bool     tick_skip = EINA_FALSE;
+
 typedef struct
 {
    Eina_Thread_Queue_Msg head;
@@ -208,6 +212,9 @@ _drm_send_time(double t)
         *tim = t;
         DBG("   ... send %1.8f", t);
         D("    @%1.5f   ... send %1.8f\n", ecore_time_get(), t);
+        eina_spinlock_take(&tick_queue_lock);
+        tick_queue_count++;
+        eina_spinlock_release(&tick_queue_lock);
         ecore_thread_feedback(drm_thread, tim);
      }
 }
@@ -363,6 +370,12 @@ _drm_tick_core(void *data EINA_UNUSED, Ecore_Thread 
*thread)
 static void
 _drm_tick_notify(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED, 
void *msg)
 {
+   int tick_queued;
+
+   eina_spinlock_take(&tick_queue_lock);
+   tick_queued = tick_queue_count;
+   tick_queue_count--;
+   eina_spinlock_release(&tick_queue_lock);
    DBG("notify.... %3.3f %i", *((double *)msg), drm_event_is_busy);
    D("notify.... %3.3f %i\n", *((double *)msg), drm_event_is_busy);
    if (drm_event_is_busy)
@@ -372,8 +385,11 @@ _drm_tick_notify(void *data EINA_UNUSED, Ecore_Thread 
*thread EINA_UNUSED, void
 
         DBG("VSYNC %1.8f = delt %1.8f", *t, *t - pt);
         D("VSYNC %1.8f = delt %1.8f\n", *t, *t - pt);
-        ecore_loop_time_set(*t);
-        ecore_animator_custom_tick();
+        if ((!tick_skip) || (tick_queued == 1))
+          {
+             ecore_loop_time_set(*t);
+             ecore_animator_custom_tick();
+          }
         pt = *t;
      }
    free(msg);
@@ -666,6 +682,9 @@ checkdone:
         return 0;
      }
 
+   if (getenv("ECORE_ANIMATOR_SKIP")) tick_skip = EINA_TRUE;
+   tick_queue_count = 0;
+   eina_spinlock_new(&tick_queue_lock);
    thq = eina_thread_queue_new();
    drm_thread = ecore_thread_feedback_run(_drm_tick_core, _drm_tick_notify,
                                           NULL, NULL, NULL, EINA_TRUE);

-- 


Reply via email to