summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2016-11-10 16:26:34 -0800
committerCedric BAIL <cedric@osg.samsung.com>2016-11-10 16:26:34 -0800
commit8ee79d0e2101930aa2d0a5d38558132511f133d2 (patch)
treea912951c161c4f06e6e48101fb9637d844b85d5d
parent16723837e98fea11ea2e7a8f2c677802a933764d (diff)
downloadefl-8ee79d0e2101930aa2d0a5d38558132511f133d2.tar.gz
ecore_evas: first frame and animator are defined per canvas
-rw-r--r--src/lib/ecore_evas/ecore_evas.c79
-rw-r--r--src/lib/ecore_evas/ecore_evas_private.h5
2 files changed, 40 insertions, 44 deletions
diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c
index 1874d39259..d48394e8c5 100644
--- a/src/lib/ecore_evas/ecore_evas.c
+++ b/src/lib/ecore_evas/ecore_evas.c
@@ -57,28 +57,23 @@ static int _ecore_evas_init_count = 0;
static Ecore_Fd_Handler *_ecore_evas_async_events_fd = NULL;
static Eina_Bool _ecore_evas_async_events_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
+static Ecore_Idle_Exiter *ecore_evas_idle_exiter = NULL;
static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
static Ecore_Evas *ecore_evases = NULL;
static int _ecore_evas_fps_debug = 0;
//RENDER_SYNC
static int _ecore_evas_render_sync = 1;
-static Ecore_Animator *ecore_evas_animator = NULL;
-static Eina_Bool ecore_evas_animator_ticked = EINA_FALSE;
-static Eina_Bool ecore_evas_first = EINA_TRUE;
-static int overtick = 0;
-static Eina_Bool
-_ecore_evas_animator(void *data EINA_UNUSED)
+static void
+_ecore_evas_animator(void *data, const Efl_Event *ev EINA_UNUSED)
{
- ecore_evas_animator_ticked = EINA_TRUE;
- overtick--;
- if (overtick == 0)
- {
- ecore_evas_animator = NULL;
- return EINA_FALSE;
- }
- return EINA_TRUE;
+ Ecore_Evas *ee = data;
+
+ ee->animator_ticked = EINA_TRUE;
+
+ efl_event_callback_del(ee->evas, EFL_EVENT_ANIMATOR_TICK, _ecore_evas_animator, ee);
+ ee->animator_registered = EINA_FALSE;
}
static Eina_Bool
@@ -95,15 +90,14 @@ _ecore_evas_changes_get(Ecore_Evas *ee)
}
static Eina_Bool
-_ecore_evas_changes_check(void)
+_ecore_evas_idle_exiter(void *data EINA_UNUSED)
{
Ecore_Evas *ee;
EINA_INLIST_FOREACH(ecore_evases, ee)
- {
- if (_ecore_evas_changes_get(ee)) return EINA_TRUE;
- }
- return EINA_FALSE;
+ ee->animator_ran = EINA_FALSE;
+
+ return ECORE_CALLBACK_RENEW;
}
static Eina_Bool
@@ -119,34 +113,34 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED)
if (!ecore_evases) return ECORE_CALLBACK_RENEW;
- if (_ecore_evas_render_sync)
+ if (_ecore_evas_fps_debug)
{
- if (!ecore_evas_first)
+ t1 = ecore_time_get();
+ }
+ EINA_INLIST_FOREACH(ecore_evases, ee)
+ {
+ if (_ecore_evas_render_sync)
{
- if ((!ecore_evas_animator_ticked) &&
- (!ecore_main_loop_animator_ticked_get()))
+ if (!ee->first_frame)
{
- if (_ecore_evas_changes_check())
+ if ((!ee->animator_ticked) &&
+ (!ee->animator_ran))
{
- if (!ecore_evas_animator)
+ if (_ecore_evas_changes_get(ee))
{
- overtick = 1;
- ecore_evas_animator = ecore_animator_add(_ecore_evas_animator, NULL);
+ if (!ee->animator_registered)
+ {
+ efl_event_callback_add(ee->evas, EFL_EVENT_ANIMATOR_TICK, _ecore_evas_animator, ee);
+ ee->animator_registered = EINA_TRUE;
+ }
}
+ continue ;
}
- return ECORE_CALLBACK_RENEW;
+ ee->animator_ticked = EINA_FALSE;
}
- ecore_evas_animator_ticked = EINA_FALSE;
+ ee->first_frame = EINA_FALSE;
}
- ecore_evas_first = EINA_FALSE;
- }
- if (_ecore_evas_fps_debug)
- {
- t1 = ecore_time_get();
- }
- EINA_INLIST_FOREACH(ecore_evases, ee)
- {
#ifdef ECORE_EVAS_ASYNC_RENDER_DEBUG
if ((ee->in_async_render) && (now - ee->async_render_start > 2.0))
{
@@ -406,6 +400,8 @@ ecore_evas_init(void)
ecore_evas_idle_enterer =
ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL);
+ ecore_evas_idle_exiter =
+ ecore_idle_exiter_add(_ecore_evas_idle_exiter, NULL);
if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
if (getenv("ECORE_EVAS_RENDER_NOSYNC")) _ecore_evas_render_sync = 0;
if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
@@ -452,12 +448,6 @@ ecore_evas_shutdown(void)
ecore_idle_enterer_del(ecore_evas_idle_enterer);
ecore_evas_idle_enterer = NULL;
- if (_ecore_evas_render_sync)
- {
- if (ecore_evas_animator) ecore_animator_del(ecore_evas_animator);
- ecore_evas_animator = NULL;
- }
-
_ecore_evas_extn_shutdown();
#ifdef BUILD_ECORE_EVAS_EWS
@@ -2463,6 +2453,7 @@ ecore_evas_animator_tick(Ecore_Evas *ee, Eina_Rectangle *viewport)
a.update_area = *viewport;
}
+ ee->animator_ran = EINA_TRUE;
efl_event_callback_legacy_call(ee->evas, EFL_EVENT_ANIMATOR_TICK, &a);
// FIXME: We do not support partial animator in the subcanvas
@@ -2599,7 +2590,7 @@ _ecore_evas_register(Ecore_Evas *ee)
_ecore_evas_register_animators(ee);
- if (_ecore_evas_render_sync) ecore_evas_first = EINA_TRUE;
+ if (_ecore_evas_render_sync) ee->first_frame = EINA_TRUE;
if (!_general_tick) _ecore_evas_tick_source_find();
}
diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h
index 1b4a510236..432152f8a7 100644
--- a/src/lib/ecore_evas/ecore_evas_private.h
+++ b/src/lib/ecore_evas/ecore_evas_private.h
@@ -343,8 +343,13 @@ struct _Ecore_Evas
unsigned char semi_sync : 1;
unsigned char deleted : 1;
unsigned char profile_supported : 1;
+
unsigned char in_async_render : 1;
unsigned char can_async_render : 1;
+ unsigned char animator_registered : 1;
+ unsigned char animator_ticked : 1;
+ unsigned char animator_ran : 1;
+ unsigned char first_frame : 1;
};
struct _Ecore_Evas_Aux_Hint