evas: refactor setup stage and reduce complexity for engine.
authorCedric BAIL <cedric@osg.samsung.com>
Fri, 2 Dec 2016 23:30:02 +0000 (15:30 -0800)
committerCedric BAIL <cedric@osg.samsung.com>
Wed, 7 Dec 2016 23:47:56 +0000 (15:47 -0800)
20 files changed:
src/lib/evas/canvas/evas_main.c
src/lib/evas/include/evas_private.h
src/modules/evas/engines/buffer/evas_engine.c
src/modules/evas/engines/drm/evas_engine.c
src/modules/evas/engines/eglfs/evas_engine.c
src/modules/evas/engines/fb/evas_engine.c
src/modules/evas/engines/gl_cocoa/evas_engine.c
src/modules/evas/engines/gl_drm/evas_engine.c
src/modules/evas/engines/gl_drm/evas_engine.h
src/modules/evas/engines/gl_sdl/evas_engine.c
src/modules/evas/engines/gl_x11/evas_engine.c
src/modules/evas/engines/gl_x11/evas_engine.h
src/modules/evas/engines/gl_x11/evas_x_main.c
src/modules/evas/engines/psl1ght/evas_engine.c
src/modules/evas/engines/software_ddraw/evas_engine.c
src/modules/evas/engines/software_gdi/evas_engine.c
src/modules/evas/engines/software_generic/evas_engine.c
src/modules/evas/engines/software_x11/evas_engine.c
src/modules/evas/engines/wayland_egl/evas_engine.c
src/modules/evas/engines/wayland_shm/evas_engine.c

index 269d329..b499dcf 100644 (file)
@@ -420,22 +420,44 @@ _evas_canvas_engine_info_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
 }
 
 EOLIAN static Eina_Bool
-_evas_canvas_engine_info_set(Eo *eo_e, Evas_Public_Data *e, Evas_Engine_Info *info)
+_evas_canvas_engine_info_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Evas_Engine_Info *info)
 {
-   Eina_Bool res;
-
    if (!info) return EINA_FALSE;
    if (info != e->engine.info) return EINA_FALSE;
    if (info->magic != e->engine.info_magic) return EINA_FALSE;
 
    evas_canvas_async_block(e);
-   if (!e->common_init)
+
+   if (e->engine.data.output)
      {
-        e->common_init = 1;
-        evas_common_init();
+        if (e->engine.func->update)
+          {
+             e->engine.func->update(e->engine.data.output, info, e->output.w, e->output.h);
+          }
+        else
+          {
+             // For engine who do not provide an update function
+             e->engine.func->output_free(e->engine.data.output);
+
+             goto setup;
+          }
      }
-   res = e->engine.func->setup(eo_e, info);
-   return res;
+   else
+     {
+        if (!e->common_init)
+          {
+             e->common_init = 1;
+             evas_common_init();
+          }
+
+     setup:
+        e->engine.data.output = e->engine.func->setup(info, e->output.w, e->output.h);
+     }
+
+   if (!e->engine.data.context)
+     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   return !!e->engine.data.output;
 }
 
 EOLIAN static Evas_Coord
index 26ea5c5..d5645fc 100644 (file)
@@ -1339,7 +1339,8 @@ struct _Evas_Func
 {
    void *(*info)                           (Evas *e);
    void (*info_free)                       (Evas *e, void *info);
-   int  (*setup)                           (Evas *e, void *info);
+   void *(*setup)                          (void *info, unsigned int w, unsigned int h);
+   int  (*update)                          (void *data, void *info, unsigned int w, unsigned int h);
 
    void (*output_free)                     (void *data);
    void (*output_resize)                   (void *data, int w, int h);
index fcdd184..b838d99 100644 (file)
@@ -29,7 +29,6 @@ static void *_output_setup(int w, int h, void *dest_buffer, int dest_buffer_row_
 
 static void *eng_info(Evas *eo_e EINA_UNUSED);
 static void eng_info_free(Evas *eo_e EINA_UNUSED, void *info);
-static int eng_setup(Evas *eo_e, void *info);
 static void eng_output_free(void *data);
 
 /* internal engine routines */
@@ -132,35 +131,25 @@ eng_info_free(Evas *eo_e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
-   Render_Engine *re;
-   Evas_Engine_Info_Buffer *info;
-
-   info = (Evas_Engine_Info_Buffer *)in;
-   re = _output_setup(e->output.w,
-                     e->output.h,
-                     info->info.dest_buffer,
-                     info->info.dest_buffer_row_bytes,
-                     info->info.depth_type,
-                     info->info.use_color_key,
-                     info->info.alpha_threshold,
-                     info->info.color_key_r,
-                     info->info.color_key_g,
-                     info->info.color_key_b,
-                     info->info.func.new_update_region,
-                     info->info.func.free_update_region,
-                      info->info.func.switch_buffer,
-                      info->info.switch_data);
-   if (e->engine.data.output)
-     eng_output_free(e->engine.data.output);
-   e->engine.data.output = re;
-   if (!e->engine.data.output) return 0;
-   if (!e->engine.data.context)
-     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
-   return 1;
+   Evas_Engine_Info_Buffer *info = in;
+
+   return _output_setup(w,
+                        h,
+                        info->info.dest_buffer,
+                        info->info.dest_buffer_row_bytes,
+                        info->info.depth_type,
+                        info->info.use_color_key,
+                        info->info.alpha_threshold,
+                        info->info.color_key_r,
+                        info->info.color_key_g,
+                        info->info.color_key_b,
+                        info->info.func.new_update_region,
+                        info->info.func.free_update_region,
+                        info->info.func.switch_buffer,
+                        info->info.switch_data);
 }
 
 static void
index 4c6ff0f..6cbc067 100644 (file)
@@ -72,45 +72,28 @@ eng_info_free(Evas *evas EINA_UNUSED, void *einfo)
    free(info);
 }
 
-static int
-eng_setup(Evas *evas, void *einfo)
+static void *
+eng_setup(void *einfo, unsigned int w, unsigned int h)
 {
    Render_Engine *re;
-   Evas_Public_Data *epd;
-   Evas_Engine_Info_Drm *info;
-
-   info = (Evas_Engine_Info_Drm *)einfo;
-   if (!info) return 0;
+   Evas_Engine_Info_Drm *info = einfo;
 
-   epd = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
-   if (!epd) return 0;
-
-   re = epd->engine.data.output;
-   if (!re)
-     {
-
-        re = _render_engine_setup(info, epd->output.w, epd->output.h);
-        if (!re) return 0;
-     }
-   else
-     {
-        _outbuf_reconfigure(re->generic.ob, epd->output.w, epd->output.h,
-                            info->info.rotation, info->info.depth);
+   return _render_engine_setup(info, w, h);
+}
 
-        evas_render_engine_software_generic_update(&re->generic,
-                                                   re->generic.ob,
-                                                   epd->output.w,
-                                                   epd->output.h);
-     }
+static int
+eng_update(void *data, void *einfo, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_Drm *info = einfo;
+   Render_Engine *re = data;
+   Outbuf *ob;
 
-   epd->engine.data.output = re;
-   if (!epd->engine.data.output) return 0;
+   _outbuf_reconfigure(re->generic.ob, w, h,
+                       info->info.rotation, info->info.depth);
+   if (!ob) return 0;
 
-   if (!epd->engine.data.context)
-     {
-        epd->engine.data.context =
-          epd->engine.func->context_new(epd->engine.data.output);
-     }
+   evas_render_engine_software_generic_update(&re->generic, ob,
+                                              ob->w, ob->h);
 
    return 1;
 }
@@ -157,6 +140,7 @@ module_open(Evas_Module *em)
    EVAS_API_OVERRIDE(info, &func, eng_);
    EVAS_API_OVERRIDE(info_free, &func, eng_);
    EVAS_API_OVERRIDE(setup, &func, eng_);
+   EVAS_API_OVERRIDE(update, &func, eng_);
    EVAS_API_OVERRIDE(output_free, &func, eng_);
 
    /* advertise our engine functions */
index 1c0e108..d4eb3de 100644 (file)
@@ -690,21 +690,12 @@ eng_info_free(Evas *eo_e EINA_UNUSED, void *in)
      free(info);
 }
 
-static int
-eng_setup(Evas *evas, void *in)
+static Render_Engine_Swap_Mode
+_eng_swapmode_get(void)
 {
-   Evas_Engine_Info_Eglfs *info;
-   Evas_Public_Data *epd;
-   Render_Engine *re;
    Render_Engine_Swap_Mode swap_mode = MODE_FULL;
    const char *s = NULL;
 
-   /* try to cast to our engine info structure */
-   if (!(info = (Evas_Engine_Info_Eglfs *)in)) return 0;
-
-   /* try to get the evas public data */
-   if (!(epd = efl_data_scope_get(evas, EVAS_CANVAS_CLASS))) return 0;
-
    s = getenv("EVAS_GL_SWAP_MODE");
    if (s)
      {
@@ -759,139 +750,143 @@ eng_setup(Evas *evas, void *in)
           }
      }
 
-   if (!(re = epd->engine.data.output))
-     {
-        Outbuf *ob;
-        Render_Engine_Merge_Mode merge_mode = MERGE_BOUNDING;
+   return swap_mode;
+}
 
-        if (!initted)
-          {
-             glsym_evas_gl_preload_init();
-          }
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_Eglfs *info = in;
+   Render_Engine *re = NULL;
+   Outbuf *ob = NULL;
+   Render_Engine_Merge_Mode merge_mode = MERGE_BOUNDING;
+   Render_Engine_Swap_Mode swap_mode;
 
-        if (!(re = calloc(1, sizeof(Render_Engine)))) return 0;
+   swap_mode = _eng_swapmode_get();
 
-        /* try to create new outbuf */
-        ob = evas_outbuf_new(info, epd->output.w, epd->output.h, swap_mode);
-        if (!ob)
-          {
-             free(re);
-             return 0;
-          }
+   if (!initted)
+     {
+        glsym_evas_gl_preload_init();
+     }
 
-        ob->evas = evas;
-
-        if (!evas_render_engine_gl_generic_init(&re->generic, ob,
-                                                evas_outbuf_buffer_state_get,
-                                                evas_outbuf_rot_get,
-                                                evas_outbuf_reconfigure,
-                                                evas_outbuf_update_region_first_rect,
-                                                NULL,
-                                                evas_outbuf_update_region_new,
-                                                evas_outbuf_update_region_push,
-                                                evas_outbuf_update_region_free,
-                                                NULL,
-                                                evas_outbuf_flush,
-                                                NULL,
-                                                evas_outbuf_free,
-                                                evas_outbuf_use,
-                                                evas_outbuf_gl_context_get,
-                                                evas_outbuf_egl_display_get,
-                                                evas_outbuf_gl_context_new,
-                                                evas_outbuf_gl_context_use,
-                                                &evgl_funcs, ob->w, ob->h))
-          {
-             /* free outbuf */
+   if (!(re = calloc(1, sizeof(Render_Engine)))) return NULL;
+
+   /* try to create new outbuf */
+   ob = evas_outbuf_new(info, w, h, swap_mode);
+   if (!ob) goto on_error;
+
+   ob->evas = evas;
+
+   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+                                           evas_outbuf_buffer_state_get,
+                                           evas_outbuf_rot_get,
+                                           evas_outbuf_reconfigure,
+                                           evas_outbuf_update_region_first_rect,
+                                           NULL,
+                                           evas_outbuf_update_region_new,
+                                           evas_outbuf_update_region_push,
+                                           evas_outbuf_update_region_free,
+                                           NULL,
+                                           evas_outbuf_flush,
+                                           NULL,
+                                           evas_outbuf_free,
+                                           evas_outbuf_use,
+                                           evas_outbuf_gl_context_get,
+                                           evas_outbuf_egl_display_get,
+                                           evas_outbuf_gl_context_new,
+                                           evas_outbuf_gl_context_use,
+                                           &evgl_funcs, ob->w, ob->h))
+     goto on_error;
+
+   gl_wins++;
+
+   s = getenv("EVAS_GL_PARTIAL_MERGE");
+   if (s)
+     {
+        if ((!strcmp(s, "bounding")) || (!strcmp(s, "b")))
+          merge_mode = MERGE_BOUNDING;
+        else if ((!strcmp(s, "full")) || (!strcmp(s, "f")))
+          merge_mode = MERGE_FULL;
+     }
 
-             evas_outbuf_free(ob);
-             free(re);
-             return 0;
-          }
+   evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode);
 
-        epd->engine.data.output = re;
-        gl_wins++;
+   if (re->generic.software.tb)
+     evas_common_tilebuf_free(re->generic.software.tb);
+   re->generic.software.tb =
+     evas_common_tilebuf_new(w, h);
+   if (re->generic.software.tb)
+     evas_common_tilebuf_set_tile_size(re->generic.software.tb,
+                                       TILESIZE, TILESIZE);
 
-        s = getenv("EVAS_GL_PARTIAL_MERGE");
-        if (s)
-          {
-             if ((!strcmp(s, "bounding")) || (!strcmp(s, "b")))
-               merge_mode = MERGE_BOUNDING;
-             else if ((!strcmp(s, "full")) || (!strcmp(s, "f")))
-               merge_mode = MERGE_FULL;
-          }
+   if (re->generic.software.tb)
+     evas_render_engine_software_generic_tile_strict_set(&re->generic.software, EINA_TRUE);
 
-        evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode);
+   evas_outbuf_use(eng_get_ob(re));
 
-        if (!initted)
-          {
-             gl_extn_veto(re);
-             initted = EINA_TRUE;
-          }
-     }
-   else
+   if (!initted)
      {
-        if (eng_get_ob(re) && _re_wincheck(eng_get_ob(re)))
-          {
-             if ((info->info.depth != eng_get_ob(re)->depth) ||
-                 (info->info.destination_alpha != eng_get_ob(re)->destination_alpha))
-               {
-                  Outbuf *ob, *ob_old;
+        gl_extn_veto(re);
+        initted = EINA_TRUE;
+     }
 
-                  ob_old = re->generic.software.ob;
-                  re->generic.software.ob = NULL;
-                  gl_wins--;
+   return re;
 
-                  ob = evas_outbuf_new(info, epd->output.w, epd->output.h, swap_mode);
-                  if (!ob)
-                    {
-                       if (ob_old) evas_outbuf_free(ob_old);
-                       free(re);
-                       return 0;
-                    }
+ on_error:
+   /* free outbuf */
+   evas_outbuf_free(ob);
+   free(re);
+   return NULL;
+}
 
-                  evas_outbuf_use(ob);
-                  if (ob_old) evas_outbuf_free(ob_old);
+static int
+eng_update(void *data, void *info, unsigned int w, unsigned int h)
+{
+   Render_Engine *re = data;
 
-                  ob->evas = evas;
+   if (eng_get_ob(re) && _re_wincheck(eng_get_ob(re)))
+     {
+        if ((info->info.depth != eng_get_ob(re)->depth) ||
+            (info->info.destination_alpha != eng_get_ob(re)->destination_alpha))
+          {
+             Outbuf *ob, *ob_old;
 
-                  evas_render_engine_software_generic_update(&re->generic.software, ob,
-                                                             epd->output.w, epd->output.h);
+             ob_old = re->generic.software.ob;
+             re->generic.software.ob = NULL;
+             gl_wins--;
 
-                  gl_wins++;
-               }
-             else if ((eng_get_ob(re)->w != epd->output.w) ||
-                      (eng_get_ob(re)->h != epd->output.h) ||
-                      (info->info.rotation != eng_get_ob(re)->rotation))
+             ob = evas_outbuf_new(info, w, h, swap_mode);
+             if (!ob)
                {
-                  evas_outbuf_reconfigure(eng_get_ob(re),
-                                          epd->output.w, epd->output.h,
-                                          info->info.rotation,
-                                          info->info.depth);
+                  if (ob_old) evas_outbuf_free(ob_old);
+                  return 0;
                }
-          }
-     }
 
-   if (!eng_get_ob(re))
-     {
-        free(re);
-        return 0;
-     }
+             evas_outbuf_use(ob);
+             if (ob_old) evas_outbuf_free(ob_old);
 
-   if (!epd->engine.data.output)
-     {
-        if (eng_get_ob(re))
+             ob->evas = evas;
+
+             evas_render_engine_software_generic_update(&re->generic.software, ob,
+                                                        w, h);
+
+             gl_wins++;
+          }
+        else if ((eng_get_ob(re)->w != w) ||
+                 (eng_get_ob(re)->h != h) ||
+                 (info->info.rotation != eng_get_ob(re)->rotation))
           {
-             evas_outbuf_free(eng_get_ob(re));
-             gl_wins--;
+             evas_outbuf_reconfigure(eng_get_ob(re),
+                                     w, h,
+                                     info->info.rotation,
+                                     info->info.depth);
           }
-        free(re);
-        return 0;
      }
 
    if (re->generic.software.tb)
      evas_common_tilebuf_free(re->generic.software.tb);
    re->generic.software.tb =
-     evas_common_tilebuf_new(epd->output.w, epd->output.h);
+     evas_common_tilebuf_new(w, h);
    if (re->generic.software.tb)
      evas_common_tilebuf_set_tile_size(re->generic.software.tb,
                                        TILESIZE, TILESIZE);
@@ -899,12 +894,6 @@ eng_setup(Evas *evas, void *in)
    if (re->generic.software.tb)
      evas_render_engine_software_generic_tile_strict_set(&re->generic.software, EINA_TRUE);
 
-   if (!epd->engine.data.context)
-     {
-        epd->engine.data.context =
-           epd->engine.func->context_new(epd->engine.data.output);
-     }
-
    evas_outbuf_use(eng_get_ob(re));
 
    return 1;
@@ -1219,6 +1208,7 @@ module_open(Evas_Module *em)
    EVAS_API_OVERRIDE(info, &func, eng_);
    EVAS_API_OVERRIDE(info_free, &func, eng_);
    EVAS_API_OVERRIDE(setup, &func, eng_);
+   EVAS_API_OVERRIDE(update, &func, eng_);
    EVAS_API_OVERRIDE(canvas_alpha_get, &func, eng_);
    EVAS_API_OVERRIDE(output_free, &func, eng_);
    EVAS_API_OVERRIDE(output_dump, &func, eng_);
index 4917113..79e670e 100644 (file)
@@ -37,7 +37,6 @@ static void *_output_setup(Evas *eo_e, int w, int h, int rot, int vt, int dev, i
 
 static void *eng_info(Evas *eo_e);
 static void eng_info_free(Evas *eo_e, void *info);
-static int eng_setup(Evas *eo_e, void *info);
 static void eng_output_free(void *data);
 
 static void
@@ -154,25 +153,18 @@ eng_info_free(Evas *eo_e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
-   Render_Engine *re;
-   Evas_Engine_Info_FB *info;
-
-   info = (Evas_Engine_Info_FB *)in;
-   re = _output_setup(eo_e, e->output.w,
-                     e->output.h,
-                     info->info.rotation,
-                     info->info.virtual_terminal,
-                     info->info.device_number,
-                     info->info.refresh, info->func.region_push_hook);
-   e->engine.data.output = re;
-   if (!e->engine.data.output) return 0;
-   e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
-
-   return 1;
+   Evas_Engine_Info_FB *info = in;
+
+   return _output_setup(w,
+                        h,
+                        info->info.rotation,
+                        info->info.virtual_terminal,
+                        info->info.device_number,
+                        info->info.refresh,
+                        info->func.region_push_hook);
 }
 
 static void
index f3f684b..616525c 100644 (file)
@@ -148,101 +148,79 @@ eng_info_free(Evas *e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *evas, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsinged int h)
 {
-   EINA_SAFETY_ON_NULL_RETURN_VAL(in, 0);
-
    Evas_Engine_Info_GL_Cocoa *const info = in;
-   Evas_Public_Data *e;
-   Render_Engine *re = NULL;
+   Render_Engine *re;
    Outbuf *ob;
    Eina_Bool chk;
 
-   e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
-   if (EINA_UNLIKELY(!e))
-     {
-        CRI("Failed to get evas public data");
-        goto err;
-     }
-
    // TODO SWAP MODE
 
-   if (!e->engine.data.output)
+   if (!_initted)
      {
-        if (!_initted)
-          {
-             glsym_evas_gl_preload_init();
-             _initted = EINA_TRUE;
-          }
-
-       re = calloc(1, sizeof(*re));
-       if (EINA_UNLIKELY(!re))
-          {
-             CRI("Failed to allocate memory");
-             goto err;
-          }
+        glsym_evas_gl_preload_init();
+        _initted = EINA_TRUE;
+     }
 
-        ob = evas_outbuf_new(info,
-                             e->output.w,
-                             e->output.h);
-       if (EINA_UNLIKELY(!ob))
-         {
-             CRI("Failed to create outbuf");
-            goto err;
-         }
-
-        ob->evas = evas;
-       info->view = ob->ns_gl_view;
-
-        chk = evas_render_engine_gl_generic_init(&re->generic, ob,
-                                                evas_outbuf_buffer_state_get,
-                                                evas_outbuf_rot_get,
-                                                evas_outbuf_reconfigure,
-                                                evas_outbuf_update_region_first_rect,
-                                                NULL,
-                                                evas_outbuf_update_region_new,
-                                                evas_outbuf_update_region_push,
-                                                evas_outbuf_update_region_free,
-                                                NULL,
-                                                evas_outbuf_flush,
-                                                NULL,
-                                                evas_outbuf_free,
-                                                evas_outbuf_use,
-                                                evas_outbuf_gl_context_get,
-                                                evas_outbuf_egl_display_get,
-                                                evas_outbuf_gl_context_new,
-                                                evas_outbuf_gl_context_use,
-                                                &evgl_funcs, ob->w, ob->h);
-        if (EINA_UNLIKELY(!ob))
-          {
-             CRI("Failed to initialize gl_generic");
-             evas_outbuf_free(re->win);
-             goto err;
-          }
-        re->win = ob;
-        e->engine.data.output = re;
-        _gl_wins++;
+   re = calloc(1, sizeof(*re));
+   if (EINA_UNLIKELY(!re))
+     {
+        CRI("Failed to allocate memory");
+        goto err;
      }
-   else
+
+   ob = evas_outbuf_new(info, w, h);
+   if (EINA_UNLIKELY(!ob))
      {
-        CRI("ALREADY A DATA OUTPUT. THIS PART IS NOT IMPLEMENTED YET. PLEASE REPORT.");
-        return 0;
+        CRI("Failed to create outbuf");
+        goto err;
      }
-   if (EINA_UNLIKELY(!e->engine.data.output))
+
+   ob->evas = evas;
+   info->view = ob->ns_gl_view;
+
+   chk = evas_render_engine_gl_generic_init(&re->generic, ob,
+                                            evas_outbuf_buffer_state_get,
+                                            evas_outbuf_rot_get,
+                                            evas_outbuf_reconfigure,
+                                            evas_outbuf_update_region_first_rect,
+                                            NULL,
+                                            evas_outbuf_update_region_new,
+                                            evas_outbuf_update_region_push,
+                                            evas_outbuf_update_region_free,
+                                            NULL,
+                                            evas_outbuf_flush,
+                                            NULL,
+                                            evas_outbuf_free,
+                                            evas_outbuf_use,
+                                            evas_outbuf_gl_context_get,
+                                            evas_outbuf_egl_display_get,
+                                            evas_outbuf_gl_context_new,
+                                            evas_outbuf_gl_context_use,
+                                            &evgl_funcs, ob->w, ob->h);
+   if (EINA_UNLIKELY(!ob))
      {
-        CRI("Failed to create a data output");
-        return 0;
+        CRI("Failed to initialize gl_generic");
+        evas_outbuf_free(re->win);
+        goto err;
      }
+   re->win = ob;
+   _gl_wins++;
 
-   if (!e->engine.data.context)
-     e->engine.data.context =
-       e->engine.func->context_new(e->engine.data.output);
    evas_outbuf_use(re->win);
 
-   return 1;
-err:
-   free(re);
+   return NULL;
+}
+
+static int
+eng_update(void *data, void *info, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_GL_Cocoa *const info = in;
+   Render_Engine *re = data;
+
+   CRI("ALREADY A DATA OUTPUT. THIS PART IS NOT IMPLEMENTED YET. PLEASE REPORT.");
    return 0;
 }
 
@@ -325,6 +303,7 @@ module_open(Evas_Module *em)
    ORD(info);
    ORD(info_free);
    ORD(setup);
+   ORD(update);
    ORD(canvas_alpha_get);
    ORD(output_free);
 
index be082d6..18ac39d 100644 (file)
@@ -827,20 +827,11 @@ eng_info_free(Evas *eo_e EINA_UNUSED, void *in)
      free(info);
 }
 
-static int
-eng_setup(Evas *evas, void *in)
+static Render_Engine_Swap_Mode
+_eng_swap_mode_get(Evas_Engine_Info_GL_Drm_Swap_Mode info_swap_mode)
 {
-   Evas_Engine_Info_GL_Drm *info;
-   Evas_Public_Data *epd;
-   Render_Engine *re;
    Render_Engine_Swap_Mode swap_mode = MODE_FULL;
-   const char *s = NULL;
-
-   /* try to cast to our engine info structure */
-   if (!(info = (Evas_Engine_Info_GL_Drm *)in)) return 0;
-
-   /* try to get the evas public data */
-   if (!(epd = efl_data_scope_get(evas, EVAS_CANVAS_CLASS))) return 0;
+   const char *s;
 
    s = getenv("EVAS_GL_SWAP_MODE");
    if (s)
@@ -873,7 +864,7 @@ eng_setup(Evas *evas, void *in)
 //        re->mode = MODE_TRIPLE;
 // XXX: note - the above seems to break on some older intel chipsets and
 // drivers. it seems we CANT depend on backbuffer staying around. bugger!
-        switch (info->info.swap_mode)
+        switch (info_swap_mode)
           {
            case EVAS_ENGINE_GL_DRM_SWAP_MODE_FULL:
              swap_mode = MODE_FULL;
@@ -896,155 +887,173 @@ eng_setup(Evas *evas, void *in)
           }
      }
 
-   if (!(re = epd->engine.data.output))
+   return swap_mode;
+}
+
+static Render_Engine_Merge_Mode
+_eng_merge_mode_get(void)
+{
+   Render_Engine_Merge_Mode merge_mode = MERGE_SMART;
+   const char *s;
+
+   s = getenv("EVAS_GL_PARTIAL_MERGE");
+   if (s)
      {
-        Outbuf *ob;
-        Render_Engine_Merge_Mode merge_mode = MERGE_SMART;
+        if ((!strcmp(s, "bounding")) || (!strcmp(s, "b")))
+          merge_mode = MERGE_BOUNDING;
+        else if ((!strcmp(s, "full")) || (!strcmp(s, "f")))
+          merge_mode = MERGE_FULL;
+        else if ((!strcmp(s, "smart")) || (!strcmp(s, "s")))
+          merge_mode = MERGE_SMART;
+     }
 
-        if (!initted)
-          {
-             glsym_evas_gl_preload_init();
-          }
+   return merge_mode;
+}
 
-        if (!(re = calloc(1, sizeof(Render_Engine)))) return 0;
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_GL_Drm *info = in;
+   Render_Engine *re = NULL;
+   Outbuf *ob;
+   Render_Engine_Swap_Mode swap_mode;
+   Render_Engine_Merge_Mode merge_mode;
 
-        if (!eng_gbm_init(info))
-          {
-             free(re);
-             return 0;
-          }
+   swap_mode = _eng_swap_mode_get(info->info.swap_mode);
+   merge_mode = _eng_merge_mode_get(void);
 
-        re->fd = info->info.fd;
 
-        /* try to create new outbuf */
-        ob = evas_outbuf_new(info, epd->output.w, epd->output.h, swap_mode);
-        if (!ob)
-          {
-             eng_gbm_shutdown(info);
-             free(re);
-             return 0;
-          }
+   if (!initted)
+     {
+        glsym_evas_gl_preload_init();
+     }
 
-        ob->evas = evas;
-
-        if (!evas_render_engine_gl_generic_init(&re->generic, ob,
-                                                evas_outbuf_buffer_state_get,
-                                                evas_outbuf_rot_get,
-                                                evas_outbuf_reconfigure,
-                                                evas_outbuf_update_region_first_rect,
-                                                NULL,
-                                                evas_outbuf_update_region_new,
-                                                evas_outbuf_update_region_push,
-                                                evas_outbuf_update_region_free,
-                                                NULL,
-                                                evas_outbuf_flush,
-                                                NULL,
-                                                evas_outbuf_free,
-                                                evas_outbuf_use,
-                                                evas_outbuf_gl_context_get,
-                                                evas_outbuf_egl_display_get,
-                                                evas_outbuf_gl_context_new,
-                                                evas_outbuf_gl_context_use,
-                                                &evgl_funcs, ob->w, ob->h))
-          {
-             /* free outbuf */
-             evas_outbuf_free(ob);
-             eng_gbm_shutdown(info);
-             free(re);
-             return 0;
-          }
+   if (!(re = calloc(1, sizeof(Render_Engine)))) return 0;
 
-        epd->engine.data.output = re;
-        gl_wins++;
+   if (!eng_gbm_init(info))
+     {
+        free(re);
+        return NULL;
+     }
 
-        s = getenv("EVAS_GL_PARTIAL_MERGE");
-        if (s)
-          {
-             if ((!strcmp(s, "bounding")) || (!strcmp(s, "b")))
-               merge_mode = MERGE_BOUNDING;
-             else if ((!strcmp(s, "full")) || (!strcmp(s, "f")))
-               merge_mode = MERGE_FULL;
-             else if ((!strcmp(s, "smart")) || (!strcmp(s, "s")))
-               merge_mode = MERGE_SMART;
-          }
+   re->fd = info->info.fd;
 
-        evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode);
+   /* try to create new outbuf */
+   ob = evas_outbuf_new(info, w, h, swap_mode);
+   if (!ob)
+     {
+        eng_gbm_shutdown(info);
+        free(re);
+        return NULL;
+     }
 
-        if (!initted)
-          {
-             gl_extn_veto(re);
-             initted = EINA_TRUE;
-          }
+   ob->evas = evas;
+
+   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+                                           evas_outbuf_buffer_state_get,
+                                           evas_outbuf_rot_get,
+                                           evas_outbuf_reconfigure,
+                                           evas_outbuf_update_region_first_rect,
+                                           NULL,
+                                           evas_outbuf_update_region_new,
+                                           evas_outbuf_update_region_push,
+                                           evas_outbuf_update_region_free,
+                                           NULL,
+                                           evas_outbuf_flush,
+                                           NULL,
+                                           evas_outbuf_free,
+                                           evas_outbuf_use,
+                                           evas_outbuf_gl_context_get,
+                                           evas_outbuf_egl_display_get,
+                                           evas_outbuf_gl_context_new,
+                                           evas_outbuf_gl_context_use,
+                                           &evgl_funcs, ob->w, ob->h))
+     {
+        /* free outbuf */
+        evas_outbuf_free(ob);
+        eng_gbm_shutdown(info);
+        free(re);
+        return NULL;
      }
-   else
+
+   gl_wins++;
+
+   evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode);
+
+   if (!initted)
      {
-        if (eng_get_ob(re) && _re_wincheck(eng_get_ob(re)))
-          {
-             if ((info->info.depth != eng_get_ob(re)->depth) ||
-                 (info->info.destination_alpha != eng_get_ob(re)->destination_alpha))
-               {
-                  Outbuf *ob, *ob_old;
+        gl_extn_veto(re);
+        initted = EINA_TRUE;
+     }
 
-                  ob_old = re->generic.software.ob;
-                  re->generic.software.ob = NULL;
-                  gl_wins--;
+   if (re->generic.software.tb)
+     evas_common_tilebuf_free(re->generic.software.tb);
+   re->generic.software.tb = evas_common_tilebuf_new(w, h);
+   if (re->generic.software.tb)
+     evas_common_tilebuf_set_tile_size(re->generic.software.tb,
+                                       TILESIZE, TILESIZE);
 
-                  if (ob_old) evas_outbuf_free(ob_old);
+   if (re->generic.software.tb)
+     evas_render_engine_software_generic_tile_strict_set(&re->generic.software, EINA_TRUE);
 
-                  ob = evas_outbuf_new(info, epd->output.w, epd->output.h, swap_mode);
-                  if (!ob)
-                    {
-                       free(re);
-                       return 0;
-                    }
+   evas_outbuf_use(eng_get_ob(re));
 
-                  evas_outbuf_use(ob);
+   return re;
+}
 
-                  ob->evas = evas;
+static int
+eng_update(void *data, void *info, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_GL_Drm *info = in;
+   Render_Engine *re = data;
 
-                  evas_render_engine_software_generic_update(&re->generic.software, ob,
-                                                             epd->output.w, epd->output.h);
+   if (eng_get_ob(re) && _re_wincheck(eng_get_ob(re)))
+     {
+        if ((info->info.depth != eng_get_ob(re)->depth) ||
+            (info->info.destination_alpha != eng_get_ob(re)->destination_alpha))
+          {
+             Outbuf *ob, *ob_old;
 
-                  gl_wins++;
-               }
-             else if ((eng_get_ob(re)->w != epd->output.w) ||
-                      (eng_get_ob(re)->h != epd->output.h) ||
-                      (info->info.rotation != eng_get_ob(re)->rotation))
+             ob_old = re->generic.software.ob;
+             re->generic.software.ob = NULL;
+             gl_wins--;
+
+             if (ob_old) evas_outbuf_free(ob_old);
+
+             ob = evas_outbuf_new(info, w, h, swap_mode);
+             if (!ob)
                {
-                  evas_outbuf_reconfigure(eng_get_ob(re),
-                                          epd->output.w, epd->output.h,
-                                          info->info.rotation,
-                                          info->info.depth);
-                  evas_render_engine_software_generic_update(&re->generic.software,
-                                                             re->generic.software.ob,
-                                                             epd->output.w,
-                                                             epd->output.h);
+                  free(re);
+                  return 0;
                }
-          }
-     }
 
-   if (!eng_get_ob(re))
-     {
-        free(re);
-        return 0;
-     }
+             evas_outbuf_use(ob);
 
-   if (!epd->engine.data.output)
-     {
-        if (eng_get_ob(re))
+             ob->evas = evas;
+
+             evas_render_engine_software_generic_update(&re->generic.software, ob,
+                                                        w, h);
+
+             gl_wins++;
+          }
+        else if ((eng_get_ob(re)->w != w) ||
+                 (eng_get_ob(re)->h != h) ||
+                 (info->info.rotation != eng_get_ob(re)->rotation))
           {
-             evas_outbuf_free(eng_get_ob(re));
-             gl_wins--;
-             eng_gbm_shutdown(info);
+             evas_outbuf_reconfigure(eng_get_ob(re),
+                                     w, h,
+                                     info->info.rotation,
+                                     info->info.depth);
+             evas_render_engine_software_generic_update(&re->generic.software,
+                                                        re->generic.software.ob,
+                                                        w,
+                                                        h);
           }
-        free(re);
-        return 0;
      }
 
    if (re->generic.software.tb)
      evas_common_tilebuf_free(re->generic.software.tb);
-   re->generic.software.tb =
-     evas_common_tilebuf_new(epd->output.w, epd->output.h);
+   re->generic.software.tb = evas_common_tilebuf_new(w, h);
    if (re->generic.software.tb)
      evas_common_tilebuf_set_tile_size(re->generic.software.tb,
                                        TILESIZE, TILESIZE);
@@ -1052,12 +1061,6 @@ eng_setup(Evas *evas, void *in)
    if (re->generic.software.tb)
      evas_render_engine_software_generic_tile_strict_set(&re->generic.software, EINA_TRUE);
 
-   if (!epd->engine.data.context)
-     {
-        epd->engine.data.context =
-           epd->engine.func->context_new(epd->engine.data.output);
-     }
-
    evas_outbuf_use(eng_get_ob(re));
 
    return 1;
index 5ecb4eb..3b70cfd 100644 (file)
@@ -85,8 +85,6 @@ struct _Outbuf
    Evas_Engine_Info_GL_Drm *info;
    Evas_Engine_GL_Context *gl_context;
 
-   Evas *evas; // used for pre_swap, post_swap
-
    int fd, w, h, bpp;
    unsigned int rotation, depth, format;
    int prev_age;
index 0c7da91..0bc8681 100644 (file)
@@ -286,17 +286,14 @@ eng_info_free(Evas *e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
    Render_Engine *re = NULL;
    Outbuf *ob = NULL;
-   Evas_Engine_Info_GL_SDL *info;
+   Evas_Engine_Info_GL_SDL *info = in;
 
-   info = (Evas_Engine_Info_GL_SDL *)in;
-
-   ob = _sdl_output_setup(e->output.w, e->output.h,
+   ob = _sdl_output_setup(w, h,
                           info->flags.fullscreen,
                           info->flags.noframe,
                           info);
@@ -323,24 +320,16 @@ eng_setup(Evas *eo_e, void *in)
                                            _window_gl_context_new,
                                            _window_gl_context_use,
                                            &evgl_funcs,
-                                           e->output.w, e->output.h))
+                                           w, h))
      goto on_error;
 
-   e->engine.data.output = re;
-   if (!e->engine.data.output)
-     return 0;
-   e->engine.func = &func;
-   e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
-
-   /* if we haven't initialized - init (automatic abort if already done) */
-
-   return 1;
+   return re;
 
  on_error:
    if (ob) _outbuf_free(ob);
    free(ob);
    free(re);
-   return 0;
+   return NULL;
 }
 
 static void
index 3a8650b..df29103 100644 (file)
@@ -1614,17 +1614,12 @@ _re_winfree(Render_Engine *re)
    eng_window_unsurf(eng_get_ob(re));
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static Render_Engine_Swap_Mode
+_eng_swap_mode_get(Evas_Engine_Info_GL_X11_Swap_Mode info_swap_mode)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
-   Render_Engine *re;
-   Evas_Engine_Info_GL_X11 *info;
    Render_Engine_Swap_Mode swap_mode = MODE_FULL;
    const char *s;
 
-   info = (Evas_Engine_Info_GL_X11 *)in;
-
    if ((s = getenv("EVAS_GL_SWAP_MODE")))
      {
         if ((!strcasecmp(s, "full")) ||
@@ -1660,7 +1655,7 @@ eng_setup(Evas *eo_e, void *in)
 //        re->mode = MODE_TRIPLE;
 // XXX: note - the above seems to break on some older intel chipsets and
 // drivers. it seems we CANT depend on backbuffer staying around. bugger!
-        switch (info->swap_mode)
+        switch (info_swap_mode)
           {
            case EVAS_ENGINE_GL_X11_SWAP_MODE_FULL:
              swap_mode = MODE_FULL;
@@ -1683,6 +1678,21 @@ eng_setup(Evas *eo_e, void *in)
           }
      }
 
+   return swap_mode;
+}
+
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_GL_X11 *info = in;
+   Render_Engine *re = NULL;
+   Outbuf *ob = NULL;
+   Render_Engine_Merge_Mode merge_mode = MERGE_SMART;
+   Render_Engine_Swap_Mode swap_mode;
+   const char *s;
+
+   swap_mode = _eng_swap_mode_get(info->swap_mode);
+
    // Set this env var to dump files every frame
    // Or set the global var in gdb to 1|0 to turn it on and off
    if (getenv("EVAS_GL_SWAP_BUFFER_DEBUG_ALWAYS"))
@@ -1706,189 +1716,170 @@ eng_setup(Evas *eo_e, void *in)
      }
 
 
-   if (!e->engine.data.output)
+   if (!initted)
      {
-        Outbuf *ob;
-        Render_Engine_Merge_Mode merge_mode = MERGE_SMART;
-
-        if (!initted)
-          {
-             glsym_evas_gl_preload_init();
-          }
+        glsym_evas_gl_preload_init();
+     }
 
 #ifdef GL_GLES
 #else
-        int eb, evb;
-
-        if (!glXQueryExtension(info->info.display, &eb, &evb)) return 0;
-#endif
-        re = calloc(1, sizeof(Render_Engine));
-        if (!re) return 0;
-        ob = eng_window_new(info, eo_e,
-                            info->info.display,
-                            info->info.drawable,
-                            info->info.screen,
-                            info->info.visual,
-                            info->info.colormap,
-                            info->info.depth,
-                            e->output.w, e->output.h,
-                            info->indirect,
-                            info->info.destination_alpha,
-                            info->info.rotation,
-                            swap_mode,
-                            info->depth_bits,
-                            info->stencil_bits,
-                            info->msaa_bits);
-        if (!ob)
-          {
-             free(re);
-             return 0;
-          }
+   int eb, evb;
 
-        if (!evas_render_engine_gl_generic_init(&re->generic, ob,
-                                                eng_outbuf_swap_mode,
-                                                eng_outbuf_get_rot,
-                                                eng_outbuf_reconfigure,
-                                                eng_outbuf_region_first_rect,
+   if (!glXQueryExtension(info->info.display, &eb, &evb)) return 0;
+#endif
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re) return NULL;
+
+   ob = eng_window_new(info,
+                       info->info.display,
+                       info->info.drawable,
+                       info->info.screen,
+                       info->info.visual,
+                       info->info.colormap,
+                       info->info.depth,
+                       w, h,
+                       info->indirect,
+                       info->info.destination_alpha,
+                       info->info.rotation,
+                       swap_mode,
+                       info->depth_bits,
+                       info->stencil_bits,
+                       info->msaa_bits);
+   if (!ob) goto on_error;
+
+   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+                                           eng_outbuf_swap_mode,
+                                           eng_outbuf_get_rot,
+                                           eng_outbuf_reconfigure,
+                                           eng_outbuf_region_first_rect,
 #ifdef GL_GLES
-                                                eng_outbuf_damage_region_set,
+                                           eng_outbuf_damage_region_set,
 #else
-                                                NULL,
-#endif
-                                                eng_outbuf_new_region_for_update,
-                                                eng_outbuf_push_updated_region,
-                                                eng_outbuf_push_free_region_for_update,
-                                                eng_outbuf_idle_flush,
-                                                eng_outbuf_flush,
-                                                NULL,
-                                                eng_window_free,
-                                                eng_window_use,
-                                                eng_outbuf_gl_context_get,
-                                                eng_outbuf_egl_display_get,
-                                                eng_gl_context_new,
-                                                eng_gl_context_use,
-                                                &evgl_funcs,
-                                                e->output.w, e->output.h))
-          {
-             eng_window_free(ob);
-             free(re);
-             return 0;
-          }
-
-        e->engine.data.output = re;
-        gl_wins++;
+                                           NULL,
+#endif
+                                           eng_outbuf_new_region_for_update,
+                                           eng_outbuf_push_updated_region,
+                                           eng_outbuf_push_free_region_for_update,
+                                           eng_outbuf_idle_flush,
+                                           eng_outbuf_flush,
+                                           NULL,
+                                           eng_window_free,
+                                           eng_window_use,
+                                           eng_outbuf_gl_context_get,
+                                           eng_outbuf_egl_display_get,
+                                           eng_gl_context_new,
+                                           eng_gl_context_use,
+                                           &evgl_funcs,
+                                           w, h))
+     goto on_error;
 
-        if ((s = getenv("EVAS_GL_PARTIAL_MERGE")))
-          {
-             if ((!strcmp(s, "bounding")) ||
-                 (!strcmp(s, "b")))
-               merge_mode = MERGE_BOUNDING;
-             else if ((!strcmp(s, "full")) ||
-                      (!strcmp(s, "f")))
-               merge_mode = MERGE_FULL;
-             else if ((!strcmp(s, "smart")) ||
-                      (!strcmp(s, "s")))
-               merge_mode = MERGE_SMART;
-          }
+   gl_wins++;
 
-        evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode);
+   if ((s = getenv("EVAS_GL_PARTIAL_MERGE")))
+     {
+        if ((!strcmp(s, "bounding")) ||
+            (!strcmp(s, "b")))
+          merge_mode = MERGE_BOUNDING;
+        else if ((!strcmp(s, "full")) ||
+                 (!strcmp(s, "f")))
+          merge_mode = MERGE_FULL;
+        else if ((!strcmp(s, "smart")) ||
+                 (!strcmp(s, "s")))
+          merge_mode = MERGE_SMART;
+     }
 
-        if (!initted)
-          {
-             gl_extn_veto(re);
-//             evgl_engine_init(re, &evgl_funcs);
-             initted = 1;
-          }
+   evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode);
 
-     }
-   else
+   if (!initted)
      {
-        re = e->engine.data.output;
-        if (eng_get_ob(re) && _re_wincheck(eng_get_ob(re)))
+        gl_extn_veto(re);
+        //             evgl_engine_init(re, &evgl_funcs);
+        initted = 1;
+     }
+
+   if (re->generic.software.tb)
+     evas_render_engine_software_generic_tile_strict_set
+       (&re->generic.software, EINA_TRUE);
+
+   eng_window_use(eng_get_ob(re));
+
+   return re;
+
+ on_error:
+   if (ob) eng_window_free(ob);
+   free(re);
+   return NULL;
+}
+
+static int
+eng_update(void *data, void *in, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_GL_X11 *info = in;
+   Render_Engine *re = data;
+   Render_Engine_Swap_Mode swap_mode;
+
+   swap_mode = _eng_swap_mode_get(info->swap_mode);
+
+   if (eng_get_ob(re) && _re_wincheck(eng_get_ob(re)))
+     {
+        if ((info->info.display != eng_get_ob(re)->disp) ||
+            (info->info.drawable != eng_get_ob(re)->win) ||
+            (info->info.screen != eng_get_ob(re)->screen) ||
+            (info->info.visual != eng_get_ob(re)->visual) ||
+            (info->info.colormap != eng_get_ob(re)->colormap) ||
+            (info->info.depth != eng_get_ob(re)->depth) ||
+            (info->depth_bits != eng_get_ob(re)->depth_bits) ||
+            (info->stencil_bits != eng_get_ob(re)->stencil_bits) ||
+            (info->msaa_bits != eng_get_ob(re)->msaa_bits) ||
+            (info->info.destination_alpha != eng_get_ob(re)->alpha))
           {
-             if ((info->info.display != eng_get_ob(re)->disp) ||
-                 (info->info.drawable != eng_get_ob(re)->win) ||
-                 (info->info.screen != eng_get_ob(re)->screen) ||
-                 (info->info.visual != eng_get_ob(re)->visual) ||
-                 (info->info.colormap != eng_get_ob(re)->colormap) ||
-                 (info->info.depth != eng_get_ob(re)->depth) ||
-                 (info->depth_bits != eng_get_ob(re)->depth_bits) ||
-                 (info->stencil_bits != eng_get_ob(re)->stencil_bits) ||
-                 (info->msaa_bits != eng_get_ob(re)->msaa_bits) ||
-                 (info->info.destination_alpha != eng_get_ob(re)->alpha))
-               {
-                  Outbuf *ob, *ob_old;
-
-                  ob_old = re->generic.software.ob;
-                  re->generic.software.ob = NULL;
-                  gl_wins--;
-
-                  ob = eng_window_new(info, eo_e,
-                                      info->info.display,
-                                      info->info.drawable,
-                                      info->info.screen,
-                                      info->info.visual,
-                                      info->info.colormap,
-                                      info->info.depth,
-                                      e->output.w, e->output.h,
-                                      info->indirect,
-                                      info->info.destination_alpha,
-                                      info->info.rotation,
-                                      swap_mode,
-                                      info->depth_bits,
-                                      info->stencil_bits,
-                                      info->msaa_bits);
-                  if (!ob)
-                    {
-                       if (ob_old) eng_window_free(ob_old);
-                       free(re);
-                       return 0;
-                    }
-                  eng_window_use(ob);
-                  if (ob_old) eng_window_free(ob_old);
-                  evas_render_engine_software_generic_update(&re->generic.software, ob,
-                                                             e->output.w, e->output.h);
+             Outbuf *ob, *ob_old;
 
-                  gl_wins++;
-               }
-             else if ((eng_get_ob(re)->w != e->output.w) ||
-                      (eng_get_ob(re)->h != e->output.h) ||
-                      (eng_get_ob(re)->info->info.rotation != eng_get_ob(re)->rot))
+             ob_old = re->generic.software.ob;
+             re->generic.software.ob = NULL;
+             gl_wins--;
+
+             ob = eng_window_new(info,
+                                 info->info.display,
+                                 info->info.drawable,
+                                 info->info.screen,
+                                 info->info.visual,
+                                 info->info.colormap,
+                                 info->info.depth,
+                                 w, h,
+                                 info->indirect,
+                                 info->info.destination_alpha,
+                                 info->info.rotation,
+                                 swap_mode,
+                                 info->depth_bits,
+                                 info->stencil_bits,
+                                 info->msaa_bits);
+             if (!ob)
                {
-                  eng_outbuf_reconfigure(eng_get_ob(re), e->output.w, e->output.h, eng_get_ob(re)->info->info.rotation, 0);
-                  if (re->generic.software.tb)
-                    evas_common_tilebuf_free(re->generic.software.tb);
-                  re->generic.software.tb = evas_common_tilebuf_new(e->output.w, e->output.h);
-                  if (re->generic.software.tb)
-                    evas_common_tilebuf_set_tile_size(re->generic.software.tb,
-                                                      TILESIZE, TILESIZE);
+                  if (ob_old) eng_window_free(ob_old);
+                  return 0;
                }
-          }
-     }
-   if (!eng_get_ob(re))
-     {
-        free(re);
-        return 0;
-     }
 
-   if (!e->engine.data.output)
-     {
-        if (eng_get_ob(re))
+             eng_window_use(ob);
+             if (ob_old) eng_window_free(ob_old);
+             evas_render_engine_software_generic_update(&re->generic.software, ob,
+                                                        w, h);
+             gl_wins++;
+          }
+        else if ((eng_get_ob(re)->w != w) ||
+                 (eng_get_ob(re)->h != h) ||
+                 (eng_get_ob(re)->info->info.rotation != eng_get_ob(re)->rot))
           {
-             eng_window_free(eng_get_ob(re));
-             gl_wins--;
+             eng_outbuf_reconfigure(eng_get_ob(re), w, h, eng_get_ob(re)->info->info.rotation, 0);
+             if (re->generic.software.tb)
+               evas_common_tilebuf_free(re->generic.software.tb);
+             re->generic.software.tb = evas_common_tilebuf_new(w, h);
+             if (re->generic.software.tb)
+               evas_common_tilebuf_set_tile_size(re->generic.software.tb,
+                                                 TILESIZE, TILESIZE);
           }
-        free(re);
-        return 0;
      }
 
-   if (re->generic.software.tb)
-     evas_render_engine_software_generic_tile_strict_set
-       (&re->generic.software, EINA_TRUE);
-
-   if (!e->engine.data.context)
-     e->engine.data.context =
-     e->engine.func->context_new(e->engine.data.output);
    eng_window_use(eng_get_ob(re));
 
    return 1;
@@ -3160,6 +3151,7 @@ module_open(Evas_Module *em)
    ORD(info);
    ORD(info_free);
    ORD(setup);
+   ORD(update);
    ORD(canvas_alpha_get);
    ORD(output_free);
    ORD(output_dump);
index 5f18dc6..9c0ee4d 100644 (file)
@@ -93,7 +93,7 @@ struct _Outbuf
    Render_Engine_Swap_Mode swap_mode;
    Colormap         colormap;
    Window           win;
-   int              w, h;
+   unsigned int     w, h;
    int              screen;
    int              depth;
    int              alpha;
@@ -164,10 +164,10 @@ extern int      (*glsym_glXWaitVideoSync)   (int a, int b, unsigned int *c);
 
 #endif
 
-Outbuf *eng_window_new(Evas_Engine_Info_GL_X11 *info, Evas *e,
+Outbuf *eng_window_new(Evas_Engine_Info_GL_X11 *info,
                        Display *disp, Window win, int screen,
                        Visual *vis, Colormap cmap,
-                       int depth, int w, int h, int indirect,
+                       int depth, unsigned int w, unsigned int h, int indirect,
                        int alpha, int rot,
                        Render_Engine_Swap_Mode swap_mode,
                        int depth_bits, int stencil_bits, int msaa_bits);
index e0a8052..4261caa 100644 (file)
@@ -181,15 +181,14 @@ _x11_eglGetDisplay(Display *x11_display)
 
 Outbuf *
 eng_window_new(Evas_Engine_Info_GL_X11 *info,
-               Evas *e,
                Display *disp,
                Window   win,
                int      screen,
                Visual  *vis,
                Colormap cmap,
                int      depth,
-               int      w,
-               int      h,
+               unsigned int w,
+               unsigned int h,
                int      indirect EINA_UNUSED,
                int      alpha,
                int      rot,
@@ -241,7 +240,6 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info,
    gw->rot = rot;
    gw->swap_mode = swap_mode;
    gw->info = info;
-   gw->evas = e;
    gw->depth_bits = depth_bits;
    gw->stencil_bits = stencil_bits;
    gw->msaa_bits = msaa_bits;
@@ -1549,7 +1547,7 @@ eng_outbuf_new_region_for_update(Outbuf *ob,
                                  int *cx EINA_UNUSED, int *cy EINA_UNUSED,
                                  int *cw EINA_UNUSED, int *ch EINA_UNUSED)
 {
-   if (w == ob->w && h == ob->h)
+   if (w == (int) ob->w && h == (int) ob->h)
      {
         ob->gl_context->master_clip.enabled = EINA_FALSE;
      }
@@ -1621,10 +1619,6 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *surface_damage EINA_UNUSED, Tilebuf_R
         else eglSwapInterval(ob->egl_disp, 0);
         ob->vsync = 1;
      }
-   if (ob->info->callback.pre_swap)
-     {
-        ob->info->callback.pre_swap(ob->info->callback.data, ob->evas);
-     }
    if ((glsym_eglSwapBuffersWithDamage) && (rects) &&
        (ob->swap_mode != MODE_FULL))
      {
@@ -1650,10 +1644,6 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *surface_damage EINA_UNUSED, Tilebuf_R
      eglSwapBuffers(ob->egl_disp, ob->egl_surface[0]);
 
 //xx   if (!safe_native) eglWaitGL();
-   if (ob->info->callback.post_swap)
-     {
-        ob->info->callback.post_swap(ob->info->callback.data, ob->evas);
-     }
 //   if (eglGetError() != EGL_SUCCESS)
 //     {
 //        printf("Error:  eglSwapBuffers() fail.\n");
@@ -1693,18 +1683,10 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *surface_damage EINA_UNUSED, Tilebuf_R
           }
      }
 #endif
-   if (ob->info->callback.pre_swap)
-     {
-        ob->info->callback.pre_swap(ob->info->callback.data, ob->evas);
-     }
    // XXX: if partial swaps can be done use re->rects
 //   measure(0, "swap");
    glXSwapBuffers(ob->disp, ob->glxwin);
 //   measure(1, "swap");
-   if (ob->info->callback.post_swap)
-     {
-        ob->info->callback.post_swap(ob->info->callback.data, ob->evas);
-     }
 #endif
    // clear out rects after swap as we may use them during swap
 
index d119139..31fd1de 100644 (file)
@@ -43,8 +43,6 @@ static void *_output_setup(int w, int h);
 static void *eng_info(Evas *e);
 static void
              eng_info_free(Evas *e, void *info);
-static int
-             eng_setup(Evas *e, void *info);
 static void
              eng_output_free(void *data);
 static void
@@ -149,23 +147,14 @@ eng_info_free(Evas *e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
-   Evas_Engine_Info_PSL1GHT *info;
+   Evas_Engine_Info_PSL1GHT *info = in;
 
    printf ("eng_setup called\n");
-   info = (Evas_Engine_Info_PSL1GHT *)in;
 
-   e->engine.data.output = _output_setup(e->output.w, e->output.h);
-   if (!e->engine.data.output)
-     return 0;
-
-   e->engine.func = &func;
-   e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
-
-   return 1;
+   return _output_setup(w, h);
 }
 
 static void
index b8fb1ce..9c4314c 100644 (file)
@@ -87,48 +87,16 @@ eng_info_free(Evas *e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
-   Render_Engine *re;
-   Evas_Engine_Info_Software_DDraw *info;
+   Evas_Engine_Info_Software_DDraw *info = in;
 
-   info = (Evas_Engine_Info_Software_DDraw *)in;
-   if (!e->engine.data.output)
-     e->engine.data.output = _output_setup(e->output.w,
-                                           e->output.h,
-                                           info->info.rotation,
-                                           info->info.window,
-                                           info->info.depth,
-                                           info->info.fullscreen);
-   else
-     {
-        Outbuf *ob;
-        int ponebuf = 0;
-
-        re = e->engine.data.output;
-        ponebuf = re->generic.ob->onebuf;
-
-        ob = evas_software_ddraw_outbuf_setup(e->output.w,
-                                              e->output.h,
-                                              info->info.rotation,
-                                              OUTBUF_DEPTH_INHERIT,
-                                              info->info.window,
-                                              info->info.depth,
-                                              info->info.fullscreen);
-        if (!ob) return 0;
-        evas_render_engine_software_generic_update(&re->generic, ob, e->output.w, e->output.h);
-
-        re->generic.ob->onebuf = ponebuf;
-     }
-   if (!e->engine.data.output) return 0;
-   if (!e->engine.data.context)
-     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
-
-   re = e->engine.data.output;
-
-   return 1;
+   return _output_setup(w, h,
+                        info->info.rotation,
+                        info->info.window,
+                        info->info.depth,
+                        info->info.fullscreen);
 }
 
 static void
index 4cb2fa1..1e156f7 100644 (file)
@@ -90,51 +90,46 @@ eng_info_free(Evas *e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
-   Render_Engine                 *re;
    Evas_Engine_Info_Software_Gdi *info;
+   Render_Engine *re;
 
    info = (Evas_Engine_Info_Software_Gdi *)in;
-   if (!e->engine.data.output)
-     e->engine.data.output = _output_setup(e->output.w,
-                                           e->output.h,
-                                           info->info.rotation,
-                                           info->info.window,
-                                           info->info.depth,
-                                           info->info.borderless,
-                                           info->info.fullscreen,
-                                           info->info.region);
-   else
-     {
-        Outbuf *ob;
-        int ponebuf = 0;
-
-        re = e->engine.data.output;
-        ponebuf = re->generic.ob->onebuf;
-
-        ob = evas_software_gdi_outbuf_setup(e->output.w,
-                                            e->output.h,
-                                            info->info.rotation,
-                                            OUTBUF_DEPTH_INHERIT,
-                                            info->info.window,
-                                            info->info.depth,
-                                            info->info.borderless,
-                                            info->info.fullscreen,
-                                            info->info.region,
-                                            0, 0);
-        if (!ob) return 0;
-
-        evas_render_engine_software_generic_update(&re->generic, ob, e->output.w, e->output.h);
-        re->generic.ob->onebuf = ponebuf;
-     }
-   if (!e->engine.data.output) return 0;
-   if (!e->engine.data.context)
-     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+   return _output_setup(w,
+                        h,
+                        info->info.rotation,
+                        info->info.window,
+                        info->info.depth,
+                        info->info.borderless,
+                        info->info.fullscreen,
+                        info->info.region);
+}
+
+static int
+eng_update(void *data, void *in, unsigned int w, unsigned int h)
+{
+   Render_Engine *re = data;
+   Outbuf *ob;
+   int ponebuf = 0;
+
+   ponebuf = re->generic.ob->onebuf;
+
+   ob = evas_software_gdi_outbuf_setup(w,
+                                       h,
+                                       info->info.rotation,
+                                       OUTBUF_DEPTH_INHERIT,
+                                       info->info.window,
+                                       info->info.depth,
+                                       info->info.borderless,
+                                       info->info.fullscreen,
+                                       info->info.region,
+                                       0, 0);
+   if (!ob) return 0;
 
-   re = e->engine.data.output;
+   evas_render_engine_software_generic_update(&re->generic, ob, w, h);
+   re->generic.ob->onebuf = ponebuf;
 
    return 1;
 }
@@ -180,6 +175,7 @@ module_open(Evas_Module *em)
    ORD(info);
    ORD(info_free);
    ORD(setup);
+   ORD(update);
    ORD(canvas_alpha_get);
    ORD(output_free);
    /* now advertise out own api */
index 611ee14..66ae3d2 100644 (file)
@@ -4613,9 +4613,10 @@ eng_ector_end(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *
 
 static Evas_Func func =
 {
-   NULL, // eng_info
+     NULL, // eng_info
      NULL, // eng_info_free
      NULL, // eng_setup
+     NULL, // eng_update
      NULL, // eng_output_free
      eng_output_resize,
      eng_output_tile_size_set,
index c5ef57d..3adf0cf 100644 (file)
@@ -65,7 +65,6 @@ static int _best_depth_get(int backend, void *connection, int screen);
 
 static void *eng_info(Evas *eo_e);
 static void eng_info_free(Evas *eo_e, void *info);
-static int eng_setup(Evas *eo_e, void *info);
 static void eng_output_free(void *data);
 
 static Eina_List *_outbufs = NULL;
@@ -317,127 +316,115 @@ eng_info_free(Evas *eo_e EINA_UNUSED, void *info)
    free(in);
 }
 
-static int
-eng_setup(Evas *eo_e, void *in)
+static void *
+eng_setup(void *in, unsigned int w, unsigned int h)
 {
-   Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
-   Evas_Engine_Info_Software_X11 *info;
+   Evas_Engine_Info_Software_X11 *info = in;
    Render_Engine *re = NULL;
+   static int try_swapbuf = -1;
+   char* s;
 
-   info = (Evas_Engine_Info_Software_X11 *)in;
-   if (!e->engine.data.output)
-     {
-        /* if we haven't initialized - init (automatic abort if already done) */
+   if (info->info.backend != EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+     return NULL;
 
-        if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+   if (try_swapbuf == -1)
+     {
+        if ((s = getenv("EVAS_NO_DRI_SWAPBUF")) != NULL)
           {
-             static int try_swapbuf = -1;
-             char* s;
-
-             if (try_swapbuf == -1)
-               {
-                  if ((s = getenv("EVAS_NO_DRI_SWAPBUF")) != NULL)
-                    {
-                       if (atoi(s) == 1) try_swapbuf = 0;
-                       else try_swapbuf = 1;
-                    }
-                  else try_swapbuf = 1;
-               }
-             if (try_swapbuf)
-               re = _output_swapbuf_setup(e->output.w, e->output.h,
-                                          info->info.rotation, info->info.connection,
-                                          info->info.drawable, info->info.visual,
-                                          info->info.colormap,
-                                          info->info.depth, info->info.debug,
-                                          info->info.alloc_grayscale,
-                                          info->info.alloc_colors_max,
-                                          info->info.mask, info->info.shape_dither,
-                                          info->info.destination_alpha);
-             if (re) re->outbuf_alpha_get = evas_software_xlib_swapbuf_alpha_get;
-             else
-               {
-                  re = _output_xlib_setup(e->output.w, e->output.h,
-                                          info->info.rotation, info->info.connection,
-                                          info->info.drawable, info->info.visual,
-                                          info->info.colormap,
-                                          info->info.depth, info->info.debug,
-                                          info->info.alloc_grayscale,
-                                          info->info.alloc_colors_max,
-                                          info->info.mask, info->info.shape_dither,
-                                          info->info.destination_alpha);
-                  re->outbuf_alpha_get = evas_software_xlib_outbuf_alpha_get;
-               }
-             re->generic.ob->region_push_hook.cb = info->func.region_push_hook;
-             re->generic.ob->region_push_hook.evas = eo_e;
+             if (atoi(s) == 1) try_swapbuf = 0;
+             else try_swapbuf = 1;
           }
-        e->engine.data.output = re;
+        else try_swapbuf = 1;
      }
+
+   if (try_swapbuf)
+     re = _output_swapbuf_setup(w, h,
+                                info->info.rotation, info->info.connection,
+                                info->info.drawable, info->info.visual,
+                                info->info.colormap,
+                                info->info.depth, info->info.debug,
+                                info->info.alloc_grayscale,
+                                info->info.alloc_colors_max,
+                                info->info.mask, info->info.shape_dither,
+                                info->info.destination_alpha);
+   if (re) re->outbuf_alpha_get = evas_software_xlib_swapbuf_alpha_get;
    else
      {
-        Outbuf *ob = NULL;
-        /* int ponebuf = 0; */
+        re = _output_xlib_setup(w, h,
+                                info->info.rotation, info->info.connection,
+                                info->info.drawable, info->info.visual,
+                                info->info.colormap,
+                                info->info.depth, info->info.debug,
+                                info->info.alloc_grayscale,
+                                info->info.alloc_colors_max,
+                                info->info.mask, info->info.shape_dither,
+                                info->info.destination_alpha);
+        re->outbuf_alpha_get = evas_software_xlib_outbuf_alpha_get;
+     }
+   re->generic.ob->region_push_hook.cb = info->func.region_push_hook;
+   re->generic.ob->region_push_hook.evas = eo_e;
 
-        re = e->engine.data.output;
-        /* if ((re) && (re->ob)) ponebuf = re->ob->onebuf; */
+   _outbufs =  eina_list_append(_outbufs, re->generic.ob);
 
-        _outbufs = eina_list_remove(_outbufs, re->generic.ob);
+   return re;
+}
 
-        if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
-          {
-             if (re->generic.outbuf_free == evas_software_xlib_swapbuf_free)
-               {
-                  ob =
-                    evas_software_xlib_swapbuf_setup_x(e->output.w, e->output.h,
-                                                       info->info.rotation,
-                                                       OUTBUF_DEPTH_INHERIT,
-                                                       info->info.connection,
-                                                       info->info.drawable,
-                                                       info->info.visual,
-                                                       info->info.colormap,
-                                                       info->info.depth,
-                                                       info->info.alloc_grayscale,
-                                                       info->info.alloc_colors_max,
-                                                       info->info.mask,
-                                                       info->info.shape_dither,
-                                                       info->info.destination_alpha);
-               }
-             else
-               {
-                  ob =
-                    evas_software_xlib_outbuf_setup_x(e->output.w, e->output.h,
-                                                      info->info.rotation,
-                                                      OUTBUF_DEPTH_INHERIT,
-                                                      info->info.connection,
-                                                      info->info.drawable,
-                                                      info->info.visual,
-                                                      info->info.colormap,
-                                                      info->info.depth,
-                                                      info->info.alloc_grayscale,
-                                                      info->info.alloc_colors_max,
-                                                      info->info.mask,
-                                                      info->info.shape_dither,
-                                                      info->info.destination_alpha);
-                  if (ob)
-                    evas_software_xlib_outbuf_debug_set(ob, info->info.debug);
-               }
-          }
-        if (ob)
-          {
-             evas_render_engine_software_generic_update(&re->generic, ob, e->output.w, e->output.h);
-             ob->region_push_hook.cb = info->func.region_push_hook;
-             ob->region_push_hook.evas = eo_e;
-          }
+static int
+eng_update(void *data, void *in, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_Software_X11 *info = in;
+   Render_Engine *re = data;
+   Outbuf *ob = NULL;
+
+   if (info->info.backend != EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+     return 0;
+
+   _outbufs = eina_list_remove(_outbufs, re->generic.ob);
 
-        /* if ((re) && (re->ob)) re->ob->onebuf = ponebuf; */
+   if (re->generic.outbuf_free == evas_software_xlib_swapbuf_free)
+     {
+        ob =
+          evas_software_xlib_swapbuf_setup_x(w, h,
+                                             info->info.rotation,
+                                             OUTBUF_DEPTH_INHERIT,
+                                             info->info.connection,
+                                             info->info.drawable,
+                                             info->info.visual,
+                                             info->info.colormap,
+                                             info->info.depth,
+                                             info->info.alloc_grayscale,
+                                             info->info.alloc_colors_max,
+                                             info->info.mask,
+                                             info->info.shape_dither,
+                                             info->info.destination_alpha);
+     }
+   else
+     {
+        ob =
+          evas_software_xlib_outbuf_setup_x(w, h,
+                                            info->info.rotation,
+                                            OUTBUF_DEPTH_INHERIT,
+                                            info->info.connection,
+                                            info->info.drawable,
+                                            info->info.visual,
+                                            info->info.colormap,
+                                            info->info.depth,
+                                            info->info.alloc_grayscale,
+                                            info->info.alloc_colors_max,
+                                            info->info.mask,
+                                            info->info.shape_dither,
+                                            info->info.destination_alpha);
+        if (ob)
+          evas_software_xlib_outbuf_debug_set(ob, info->info.debug);
      }
-   if (!e->engine.data.output) return 0;
-   if (!e->engine.data.context)
+
+   if (ob)
      {
-        e->engine.data.context =
-          e->engine.func->context_new(e->engine.data.output);
+        evas_render_engine_software_generic_update(&re->generic, ob, w, h);
+        ob->region_push_hook.cb = info->func.region_push_hook;
+        ob->region_push_hook.evas = eo_e;
      }
 
-   re = e->engine.data.output;
    _outbufs =  eina_list_append(_outbufs, re->generic.ob);
 
    return 1;
@@ -664,6 +651,7 @@ module_open(Evas_Module *em)
    ORD(info);
    ORD(info_free);
    ORD(setup);
+   ORD(update);
    ORD(canvas_alpha_get);
    ORD(output_free);
    ORD(image_native_init);
index 4d47f6f..a4687d4 100644 (file)
@@ -524,19 +524,12 @@ eng_info_free(Evas *evas EINA_UNUSED, void *info)
      free(inf);
 }
 
-static int
-eng_setup(Evas *evas, void *info)
+static Render_Engine_Swap_Mode
+_eng_swap_mode_get(void)
 {
    Render_Engine_Swap_Mode swap_mode = MODE_FULL;
-   Evas_Engine_Info_Wayland *inf;
-   Evas_Public_Data *epd;
-   Render_Engine *re;
-   Outbuf *ob;
    const char *s;
 
-   inf = (Evas_Engine_Info_Wayland *)info;
-   epd = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
-
    if ((s = getenv("EVAS_GL_SWAP_MODE")))
      {
         if ((!strcasecmp(s, "full")) ||
@@ -558,149 +551,180 @@ eng_setup(Evas *evas, void *info)
                  (!strcasecmp(s, "4")))
           swap_mode = MODE_QUADRUPLE;
      }
-   else swap_mode = MODE_AUTO;
+   else
+     {
+        swap_mode = MODE_AUTO;
+     }
+
+   return swap_mode;
+}
+
+static Render_Engine_Merge_Mode
+_eng_merge_mode_get(void)
+{
+   Render_Engine_Merge_Mode merge = MERGE_SMART;
+   const char *s;
 
-   if (!(re = epd->engine.data.output))
+   if ((s = getenv("EVAS_GL_PARTIAL_MERGE")))
      {
-        Render_Engine_Merge_Mode merge = MERGE_SMART;
-
-        /* FIXME: Remove this line as soon as eglGetDisplay() autodetection
-         * gets fixed. Currently it is incorrectly detecting wl_display and
-         * returning _EGL_PLATFORM_X11 instead of _EGL_PLATFORM_WAYLAND.
-         *
-         * See ticket #1972 for more info.
-         */
-        setenv("EGL_PLATFORM", "wayland", 1);
-
-        /* try to allocate space for a new render engine */
-        if (!(re = calloc(1, sizeof(Render_Engine))))
-          return 0;
-
-        /* if we have not initialize gl & evas, do it */
-        if (!initted)
-          {
-             glsym_evas_gl_preload_init();
-          }
+        if ((!strcmp(s, "bounding")) || (!strcmp(s, "b")))
+          merge = MERGE_BOUNDING;
+        else if ((!strcmp(s, "full")) || (!strcmp(s, "f")))
+          merge = MERGE_FULL;
+        else if ((!strcmp(s, "smart")) || (!strcmp(s, "s")))
+          merge = MERGE_SMART;
+     }
 
-        ob = eng_window_new(evas, inf, epd->output.w, epd->output.h, swap_mode);
-        if (!ob) goto ob_err;
-
-        if (!evas_render_engine_gl_generic_init(&re->generic, ob,
-                                                eng_outbuf_swap_mode_get,
-                                                eng_outbuf_rotation_get,
-                                                eng_outbuf_reconfigure,
-                                                eng_outbuf_region_first_rect,
-                                                eng_outbuf_damage_region_set,
-                                                eng_outbuf_update_region_new,
-                                                eng_outbuf_update_region_push,
-                                                eng_outbuf_update_region_free,
-                                                NULL,
-                                                eng_outbuf_flush,
-                                                NULL,
-                                                eng_window_free,
-                                                eng_window_use,
-                                                eng_outbuf_gl_context_get,
-                                                eng_outbuf_egl_display_get,
-                                                eng_gl_context_new,
-                                                eng_gl_context_use,
-                                                &evgl_funcs,
-                                                epd->output.w, epd->output.h))
-          {
-             eng_window_free(ob);
-             goto ob_err;
-          }
+   return merge;
+}
+
+static void *
+eng_setup(void *info, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_Wayland *inf = info;
+   Render_Engine *re;
+   Outbuf *ob;
+   Render_Engine_Swap_Mode swap_mode;
+   Render_Engine_Merge_Mode merge;
 
-        epd->engine.data.output = re;
-        gl_wins++;
+   swap_mode = _eng_swap_mode_get();
+   merge = _eng_merge_mode_get();
 
-        if ((s = getenv("EVAS_GL_PARTIAL_MERGE")))
-          {
-             if ((!strcmp(s, "bounding")) || (!strcmp(s, "b")))
-               merge = MERGE_BOUNDING;
-             else if ((!strcmp(s, "full")) || (!strcmp(s, "f")))
-               merge = MERGE_FULL;
-             else if ((!strcmp(s, "smart")) || (!strcmp(s, "s")))
-               merge = MERGE_SMART;
-          }
+   /* FIXME: Remove this line as soon as eglGetDisplay() autodetection
+    * gets fixed. Currently it is incorrectly detecting wl_display and
+    * returning _EGL_PLATFORM_X11 instead of _EGL_PLATFORM_WAYLAND.
+    *
+    * See ticket #1972 for more info.
+    */
+   setenv("EGL_PLATFORM", "wayland", 1);
 
-        evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge);
+   /* try to allocate space for a new render engine */
+   if (!(re = calloc(1, sizeof(Render_Engine))))
+     return NULL;
 
-        if (!initted)
-          {
-             gl_extn_veto(re);
-             initted = EINA_TRUE;
-          }
+   /* if we have not initialize gl & evas, do it */
+   if (!initted)
+     {
+        glsym_evas_gl_preload_init();
      }
-   else
+
+   ob = eng_window_new(evas, inf, w, h, swap_mode);
+   if (!ob) goto ob_err;
+
+   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+                                           eng_outbuf_swap_mode_get,
+                                           eng_outbuf_rotation_get,
+                                           eng_outbuf_reconfigure,
+                                           eng_outbuf_region_first_rect,
+                                           eng_outbuf_damage_region_set,
+                                           eng_outbuf_update_region_new,
+                                           eng_outbuf_update_region_push,
+                                           eng_outbuf_update_region_free,
+                                           NULL,
+                                           eng_outbuf_flush,
+                                           NULL,
+                                           eng_window_free,
+                                           eng_window_use,
+                                           eng_outbuf_gl_context_get,
+                                           eng_outbuf_egl_display_get,
+                                           eng_gl_context_new,
+                                           eng_gl_context_use,
+                                           &evgl_funcs,
+                                           w, h))
      {
-        re = epd->engine.data.output;
-        ob = eng_get_ob(re);
+        eng_window_free(ob);
+        free(re);
+        return NULL;
+     }
 
-        if (!inf->info.wl_surface && (ob->egl_surface[0] != EGL_NO_SURFACE))
-          {
-             eglDestroySurface(ob->egl_disp, ob->egl_surface[0]);
-             eglMakeCurrent(ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE,
-                            EGL_NO_CONTEXT);
-             ob->egl_surface[0] = EGL_NO_SURFACE;
-             return 1;
-          }
+   gl_wins++;
 
-        if ((ob) && (_re_wincheck(ob)))
-          {
-             ob->info = inf;
-             if ((ob->info->info.wl_display != ob->disp) ||
-                 (ob->info->info.wl_surface != ob->surface) ||
-                 /* FIXME: comment out below line.
-                  * since there is no place set the info->info.win for now,
-                  * it causes renew the window unnecessarily.
-                  */
-                 /* (ob->info->info.win != ob->win) || */
-                 (ob->info->info.depth != ob->depth) ||
-                 (ob->info->info.destination_alpha != ob->alpha))
-               {
-                  gl_wins--;
-                  if (!ob->info->info.wl_display)
-                    {
-                       eng_window_free(re->generic.software.ob);
-                       re->generic.software.ob = NULL;
-                       epd->engine.data.output = NULL;
-                       goto ob_err;
-                    }
+   evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge);
 
-                  ob = eng_window_new(evas, inf, epd->output.w, epd->output.h, swap_mode);
-                  if (!ob) goto ob_err;
+   if (!initted)
+     {
+        gl_extn_veto(re);
+        initted = EINA_TRUE;
+     }
 
-                  eng_window_use(ob);
+   if (re->generic.software.tb)
+     evas_common_tilebuf_free(re->generic.software.tb);
+   re->generic.software.tb = evas_common_tilebuf_new(w, h);
 
-                  evas_render_engine_software_generic_update(&re->generic.software, ob,
-                                                             epd->output.w, epd->output.h);
-                  gl_wins++;
-               }
-             else if ((ob->w != epd->output.w) || (ob->h != epd->output.h) ||
-                      (ob->info->info.rotation != ob->rot))
-               {
-                  eng_outbuf_reconfigure(ob, epd->output.w, epd->output.h,
-                                         ob->info->info.rotation, 0);
-               }
-          }
+   if (re->generic.software.tb)
+     {
+        evas_common_tilebuf_set_tile_size(re->generic.software.tb,
+                                          TILESIZE, TILESIZE);
+        evas_render_engine_software_generic_tile_strict_set
+          (&re->generic.software, EINA_TRUE);
      }
 
-   if (!eng_get_ob(re)) goto ob_err;
+   eng_window_use(eng_get_ob(re));
+
+   return re;
+}
 
-   if (!epd->engine.data.output)
+static int
+eng_update(void *data, void *info, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_Wayland *inf = info;
+   Render_Engine *re = data;
+   Outbuf *ob;
+
+   ob = eng_get_ob(re);
+
+   if (!inf->info.wl_surface && (ob->egl_surface[0] != EGL_NO_SURFACE))
      {
-        if (eng_get_ob(re))
+        eglDestroySurface(ob->egl_disp, ob->egl_surface[0]);
+        eglMakeCurrent(ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE,
+                       EGL_NO_CONTEXT);
+        ob->egl_surface[0] = EGL_NO_SURFACE;
+        return 1;
+     }
+
+   if ((ob) && (_re_wincheck(ob)))
+     {
+        ob->info = inf;
+        if ((ob->info->info.wl_display != ob->disp) ||
+            (ob->info->info.wl_surface != ob->surface) ||
+            /* FIXME: comment out below line.
+             * since there is no place set the info->info.win for now,
+             * it causes renew the window unnecessarily.
+             */
+            /* (ob->info->info.win != ob->win) || */
+            (ob->info->info.depth != ob->depth) ||
+            (ob->info->info.destination_alpha != ob->alpha))
           {
-             eng_window_free(eng_get_ob(re));
              gl_wins--;
+             if (!ob->info->info.wl_display)
+               {
+                  eng_window_free(ob);
+                  re->generic.software.ob = NULL;
+                  goto ob_err;
+               }
+
+             ob = eng_window_new(evas, inf, w, h, swap_mode);
+             if (!ob) goto ob_err;
+
+             eng_window_use(ob);
+
+             evas_render_engine_software_generic_update(&re->generic.software, ob,
+                                                        w, h);
+             gl_wins++;
+          }
+        else if ((ob->w != w) || (ob->h != h) ||
+                 (ob->info->info.rotation != ob->rot))
+          {
+             eng_outbuf_reconfigure(ob, w, h,
+                                    ob->info->info.rotation, 0);
           }
-        goto ob_err;
      }
 
+   if (!eng_get_ob(re)) goto ob_err;
+
    if (re->generic.software.tb)
      evas_common_tilebuf_free(re->generic.software.tb);
-   re->generic.software.tb =
-     evas_common_tilebuf_new(epd->output.w, epd->output.h);
+   re->generic.software.tb = evas_common_tilebuf_new(w, h);
 
    if (re->generic.software.tb)
      {
@@ -710,18 +734,11 @@ eng_setup(Evas *evas, void *info)
           (&re->generic.software, EINA_TRUE);
      }
 
-   if (!epd->engine.data.context)
-     {
-        epd->engine.data.context =
-          epd->engine.func->context_new(epd->engine.data.output);
-     }
-
    eng_window_use(eng_get_ob(re));
 
    return 1;
 
 ob_err:
-   free(re);
    return 0;
 }
 
@@ -1407,6 +1424,7 @@ module_open(Evas_Module *em)
    ORD(info);
    ORD(info_free);
    ORD(setup);
+   ORD(update);
    ORD(canvas_alpha_get);
 
    ORD(output_free);
index 410c3b9..a9a27f8 100644 (file)
@@ -75,6 +75,8 @@ _render_engine_swapbuf_setup(int w, int h, Evas_Engine_Info_Wayland *einfo)
 
    evas_render_engine_software_generic_merge_mode_set(&re->generic, merge_mode);
 
+   re->generic.ob->info = einfo;
+
    /* return allocated render engine */
    return re;
 
@@ -134,61 +136,34 @@ eng_info_free(Evas *eo_evas EINA_UNUSED, void *info)
      free(einfo);
 }
 
-static int 
-eng_setup(Evas *eo_evas, void *info)
+static void *
+eng_setup(void *info, unsigned int w, unsigned int h)
 {
-   Evas_Engine_Info_Wayland *einfo;
-   Evas_Public_Data *epd;
+   Evas_Engine_Info_Wayland *einfo = info;
    Render_Engine *re = NULL;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   /* try to cast to our engine info */
-   if (!(einfo = (Evas_Engine_Info_Wayland *)info))
-     return 0;
-
-   /* try to get evas public data */
-   if (!(epd = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS)))
-     return 0;
-
-   /* test for valid engine output */
-   if (!(re = epd->engine.data.output))
-     {
-        /* if we have no engine data, assume we have not initialized yet */
+   return _render_engine_swapbuf_setup(w, h, einfo);
+}
 
-        re = _render_engine_swapbuf_setup(epd->output.w, epd->output.h, einfo);
+static int
+eng_update(void *data, void *info, unsigned int w, unsigned int h)
+{
+   Evas_Engine_Info_Wayland *einfo = info;
+   Render_Engine *re = data;
+   Outbuf *ob;
 
-        if (re) 
-          re->generic.ob->info = einfo;
-        else
-          goto err;
-     }
-   else if ((einfo->info.wl_surface) && (!einfo->info.hidden))
-     {
-        eng_output_resize(re, epd->output.w, epd->output.h);
-        evas_render_engine_software_generic_update(&re->generic,
-                                                   re->generic.ob,
-                                                   epd->output.w,
-                                                   epd->output.h);
-     }
+   if (!einfo->info.wl_surface) return 0;
+   if (!einfo->info.hidden) return 1;
 
-   epd->engine.data.output = re;
-   if (!epd->engine.data.output)
-     {
-        ERR("Failed to create Render Engine");
-        goto err;
-     }
+   eng_output_resize(re, w, h);
+   if (!ob) return 0;
 
-   if (!epd->engine.data.context)
-     {
-        epd->engine.data.context = 
-          epd->engine.func->context_new(epd->engine.data.output);
-     }
+   evas_render_engine_software_generic_update(&re->generic, ob,
+                                              w, h);
 
    return 1;
-
-err:
-   return 0;
 }
 
 static void
@@ -393,6 +368,7 @@ module_open(Evas_Module *em)
    ORD(info);
    ORD(info_free);
    ORD(setup);
+   ORD(update);
    ORD(output_free);
    ORD(output_resize);
    ORD(image_native_set);