cedric pushed a commit to branch master.

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

commit e9c2d076965e60349e69eb7e6d842eb711d62f52
Author: Nicolas Aguirre <aguirre.nico...@gmail.com>
Date:   Thu Aug 6 19:05:14 2015 +0200

    ecore_evas_cocoa: use the same render function as ecore_evas_x
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 .../ecore_evas/engines/cocoa/ecore_evas_cocoa.c    | 122 ++++++++++++++++-----
 1 file changed, 95 insertions(+), 27 deletions(-)

diff --git a/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c 
b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
index 21f4e3b..5fe7a73 100644
--- a/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
+++ b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
@@ -42,13 +42,71 @@ static int                      _ecore_evas_init_count = 0;
 // like a rbtree or a dictionnary-based container
 static Eina_List                *ecore_evases = NULL;
 static Ecore_Event_Handler      *ecore_evas_event_handlers[5] = {
-  NULL, NULL, NULL, NULL
+  0
 };
 static Ecore_Idle_Enterer       *ecore_evas_idle_enterer = NULL;
 
 //static const char               *ecore_evas_cocoa_default = "EFL Cocoa";
 
 static int
+_render_updates_process(Ecore_Evas *ee, Eina_List *updates)
+{
+   int rend = 0;
+
+   if (ee->prop.avoid_damage)
+     {
+       if (updates)
+       {
+           _ecore_evas_idle_timeout_update(ee);
+           rend = 1;
+       }
+
+     }
+   else if (((ee->visible) && (ee->draw_ok)) ||
+            ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
+            ((ee->should_be_visible) && (ee->prop.override)))
+     {
+        if (updates)
+          {
+             if (ee->shaped)
+               {
+                 //TODO
+               }
+             if (ee->alpha)
+               {
+                 //TODO
+               }
+             _ecore_evas_idle_timeout_update(ee);
+             rend = 1;
+          }
+     }
+   else
+     evas_norender(ee->evas);
+
+   if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+
+
+   if (rend)
+     {
+        static int frames = 0;
+        static double t0 = 0.0;
+        double t, td;
+
+        t = ecore_time_get();
+        frames++;
+        if ((t - t0) > 1.0)
+          {
+             td = t - t0;
+             printf("FPS: %3.3f\n", (double)frames / td);
+             frames = 0;
+             t0 = t;
+          }
+     }
+
+   return rend;
+}
+
+static int
 _ecore_evas_render(Ecore_Evas *ee)
 {
    Eina_List *updates;
@@ -69,8 +127,16 @@ _ecore_evas_cocoa_render(Ecore_Evas *ee)
    Eina_List *updates = NULL;
    Eina_List *ll;
    Ecore_Evas *ee2;
+   static int render2 = -1;
 
-   DBG("Render");
+   if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync))
+     return 0;
+
+   if (ee->in_async_render)
+     {
+        //EDBG("ee=%p is rendering asynchronously, skip.", ee);
+        return 0;
+     }
 
    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
      {
@@ -81,40 +147,42 @@ _ecore_evas_cocoa_render(Ecore_Evas *ee)
      }
 
    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
-
-   if (ee->prop.avoid_damage)
+   if (render2 == -1)
      {
-        rend = _ecore_evas_render(ee);
+        if (getenv("RENDER2")) render2 = 1;
+        else render2 = 0;
      }
-   else if ((ee->visible) ||
-            ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
-            ((ee->should_be_visible) && (ee->prop.override)))
+   if (render2)
      {
-        rend |= _ecore_evas_render(ee);
+        if (!ee->can_async_render)
+          {
+             Eina_List *updates = evas_render2_updates(ee->evas);
+             rend = _render_updates_process(ee, updates);
+             evas_render_updates_free(updates);
+          }
+        else
+          {
+             ee->in_async_render = EINA_TRUE;
+             if (evas_render2(ee->evas)) rend = 1;
+             else ee->in_async_render = EINA_FALSE;
+          }
      }
    else
-     evas_norender(ee->evas);
-
-   if (updates) rend = 1;
-   if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
-
-   if (rend)
      {
-        static int frames = 0;
-        static double t0 = 0.0;
-        double t, td;
-
-        t = ecore_time_get();
-        frames++;
-        if ((t - t0) > 1.0)
+        if (!ee->can_async_render)
           {
-             td = t - t0;
-             DBG("FPS: %3.3f\n", (double)frames / td);
-             frames = 0;
-             t0 = t;
+             Eina_List *updates = evas_render_updates(ee->evas);
+             rend = _render_updates_process(ee, updates);
+             evas_render_updates_free(updates);
+          }
+        else if (evas_render_async(ee->evas))
+          {
+             //EDBG("ee=%p started asynchronous render.", ee);
+             ee->in_async_render = EINA_TRUE;
+             rend = 1;
           }
+        else if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
      }
-
    return rend;
 }
 

-- 


Reply via email to