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
This commit is contained in:
Carsten Haitzler 2016-10-28 13:58:56 +09:00
parent d80de732d1
commit da04400c5d
2 changed files with 43 additions and 4 deletions

View File

@ -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,

View File

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