ulisses pushed a commit to branch master.

commit 0af10ae93fe0d84c7244e6cc11cdd6afe72c9b22
Author: Ulisses Furquim <[email protected]>
Date:   Tue Sep 3 01:48:08 2013 -0300

    evas/render: improve evas_render_sync()
    
    Tracking only the async rendering canvases and just waiting for the last one
    to finish rendering. This should be enough to sync all canvases since the
    render thread orderly executes the commands.
---
 src/lib/evas/canvas/evas_main.c     |  9 ---------
 src/lib/evas/canvas/evas_render.c   | 24 +++++++++++++++---------
 src/lib/evas/include/evas_private.h |  2 --
 3 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 23d8f32..aefdce5 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -16,8 +16,6 @@ EAPI Eina_Bool lockdebug = EINA_FALSE;
 EAPI int lockmax = 0;
 #endif
 
-Eina_List *all_evases = NULL;
-
 static int _evas_init_count = 0;
 int _evas_log_dom_global = -1;
 
@@ -111,9 +109,6 @@ evas_shutdown(void)
    evas_object_image_load_opts_cow = NULL;
    evas_object_image_state_cow = NULL;
 
-   eina_list_free(all_evases);
-   all_evases = NULL;
-
    evas_thread_shutdown();
    _evas_preload_thread_shutdown();
    evas_async_events_shutdown();
@@ -177,8 +172,6 @@ _constructor(Eo *eo_obj, void *class_data, va_list *list 
EINA_UNUSED)
    EVAS_ARRAY_SET(e, texts_unref_queue);
 
 #undef EVAS_ARRAY_SET
-
-   all_evases = eina_list_append(all_evases, e);
 }
 
 EAPI void
@@ -274,8 +267,6 @@ _destructor(Eo *eo_e, void *_pd, va_list *list EINA_UNUSED)
 
    if (e->engine.module) evas_module_unref(e->engine.module);
 
-   all_evases = eina_list_remove(all_evases, e);
-
    eina_array_flush(&e->delete_objects);
    eina_array_flush(&e->active_objects);
    eina_array_flush(&e->restack_objects);
diff --git a/src/lib/evas/canvas/evas_render.c 
b/src/lib/evas/canvas/evas_render.c
index c350cc6..81b8abc 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -1,6 +1,7 @@
 #include "evas_common_private.h"
 #include "evas_private.h"
 #include <math.h>
+#include <assert.h>
 #ifdef EVAS_CSERVE2
 #include "evas_cs2_private.h"
 #endif
@@ -90,6 +91,8 @@ struct _Render_Updates
 static Eina_Bool
 evas_render_updates_internal(Evas *eo_e, unsigned char make_updates, unsigned 
char do_draw, Evas_Render_Done_Cb done_func, void *done_data, Eina_Bool 
do_async);
 
+static Eina_List *_rendering_evases = NULL;
+
 #ifdef EVAS_RENDER_DEBUG_TIMING
 static double
 _time_get()
@@ -1472,19 +1475,20 @@ evas_render_rendering_wait(Evas_Public_Data *evas)
    while (evas->rendering) evas_async_events_process_blocking();
 }
 
-/* syncs ALL async rendering canvases */
+/*
+ * Syncs ALL async rendering canvases. Must be called in the main thread.
+ */
 void
 evas_render_sync(void)
 {
-   Eina_List *l;
-   void *d;
+   Evas_Public_Data *evas;
 
-   EINA_LIST_FOREACH(all_evases, l, d)
-     {
-        Evas_Public_Data *e = d;
-        if (!e->rendering) continue;
-        evas_render_rendering_wait(e);
-     }
+   if (!_rendering_evases) return;
+
+   evas = eina_list_data_get(eina_list_last(_rendering_evases));
+   evas_render_rendering_wait(evas);
+
+   assert(_rendering_evases == NULL);
 }
 
 static Eina_Bool
@@ -1837,6 +1841,7 @@ evas_render_updates_internal(Evas *eo_e,
           {
              eo_ref(eo_e);
              e->rendering = EINA_TRUE;
+             _rendering_evases = eina_list_append(_rendering_evases, e);
 
              evas_thread_queue_flush((Evas_Thread_Command_Cb)done_func, 
done_data);
           }
@@ -2034,6 +2039,7 @@ evas_render_wakeup(Evas *eo_e)
    eina_array_clean(&e->texts_unref_queue);
 
    /* post rendering */
+   _rendering_evases = eina_list_remove(_rendering_evases, e);
    e->rendering = EINA_FALSE;
 
    post.updated_area = ret_updates;
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index f8daeaf..5a9867b 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -443,8 +443,6 @@ struct _Evas_Public_Data
    Eina_Bool      rendering : 1;
 };
 
-extern Eina_List *all_evases;
-
 struct _Evas_Layer
 {
    EINA_INLIST;

-- 

------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk

Reply via email to