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