cedric pushed a commit to branch master.

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

commit 8ee79d0e2101930aa2d0a5d38558132511f133d2
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Thu Nov 10 16:26:34 2016 -0800

    ecore_evas: first frame and animator are defined per canvas
---
 src/lib/ecore_evas/ecore_evas.c         | 79 +++++++++++++++------------------
 src/lib/ecore_evas/ecore_evas_private.h |  5 +++
 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 1874d39..d48394e 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 1b4a510..432152f 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

-- 


Reply via email to