Cedric,

Please at least compile your code before pushing it.
gl_drm is badly broken. I wouldn't be surprised if cocoa and windows
engines are also broken now.


On 8 December 2016 at 08:48, Cedric BAIL <cedric.b...@free.fr> wrote:

> cedric pushed a commit to branch master.
>
> http://git.enlightenment.org/core/efl.git/commit/?id=
> 73b308fb66f871b93ef8e324997872e3bf175906
>
> commit 73b308fb66f871b93ef8e324997872e3bf175906
> Author: Cedric BAIL <ced...@osg.samsung.com>
> Date:   Fri Dec 2 15:30:02 2016 -0800
>
>     evas: refactor setup stage and reduce complexity for engine.
> ---
>  src/lib/evas/canvas/evas_main.c                    |  38 ++-
>  src/lib/evas/include/evas_private.h                |   3 +-
>  src/modules/evas/engines/buffer/evas_engine.c      |  47 ++-
>  src/modules/evas/engines/drm/evas_engine.c         |  50 ++--
>  src/modules/evas/engines/eglfs/evas_engine.c       | 236 +++++++--------
>  src/modules/evas/engines/fb/evas_engine.c          |  30 +-
>  src/modules/evas/engines/gl_cocoa/evas_engine.c    | 135 ++++-----
>  src/modules/evas/engines/gl_drm/evas_engine.c      | 279
> ++++++++---------
>  src/modules/evas/engines/gl_drm/evas_engine.h      |   2 -
>  src/modules/evas/engines/gl_sdl/evas_engine.c      |  25 +-
>  src/modules/evas/engines/gl_x11/evas_engine.c      | 332
> ++++++++++-----------
>  src/modules/evas/engines/gl_x11/evas_engine.h      |   6 +-
>  src/modules/evas/engines/gl_x11/evas_x_main.c      |  24 +-
>  src/modules/evas/engines/psl1ght/evas_engine.c     |  19 +-
>  .../evas/engines/software_ddraw/evas_engine.c      |  48 +--
>  .../evas/engines/software_gdi/evas_engine.c        |  76 +++--
>  .../evas/engines/software_generic/evas_engine.c    |   3 +-
>  .../evas/engines/software_x11/evas_engine.c        | 198 ++++++------
>  src/modules/evas/engines/wayland_egl/evas_engine.c | 286
> +++++++++---------
>  src/modules/evas/engines/wayland_shm/evas_engine.c |  64 ++--
>  20 files changed, 879 insertions(+), 1022 deletions(-)
>
> diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_
> main.c
> index 269d329..b499dcf 100644
> --- a/src/lib/evas/canvas/evas_main.c
> +++ b/src/lib/evas/canvas/evas_main.c
> @@ -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
> diff --git a/src/lib/evas/include/evas_private.h
> b/src/lib/evas/include/evas_private.h
> index 26ea5c5..d5645fc 100644
> --- a/src/lib/evas/include/evas_private.h
> +++ b/src/lib/evas/include/evas_private.h
> @@ -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);
> diff --git a/src/modules/evas/engines/buffer/evas_engine.c
> b/src/modules/evas/engines/buffer/evas_engine.c
> index fcdd184..b838d99 100644
> --- a/src/modules/evas/engines/buffer/evas_engine.c
> +++ b/src/modules/evas/engines/buffer/evas_engine.c
> @@ -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
> diff --git a/src/modules/evas/engines/drm/evas_engine.c
> b/src/modules/evas/engines/drm/evas_engine.c
> index 4c6ff0f..6cbc067 100644
> --- a/src/modules/evas/engines/drm/evas_engine.c
> +++ b/src/modules/evas/engines/drm/evas_engine.c
> @@ -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 */
> diff --git a/src/modules/evas/engines/eglfs/evas_engine.c
> b/src/modules/evas/engines/eglfs/evas_engine.c
> index 1c0e108..d4eb3de 100644
> --- a/src/modules/evas/engines/eglfs/evas_engine.c
> +++ b/src/modules/evas/engines/eglfs/evas_engine.c
> @@ -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_);
> diff --git a/src/modules/evas/engines/fb/evas_engine.c
> b/src/modules/evas/engines/fb/evas_engine.c
> index 4917113..79e670e 100644
> --- a/src/modules/evas/engines/fb/evas_engine.c
> +++ b/src/modules/evas/engines/fb/evas_engine.c
> @@ -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
> diff --git a/src/modules/evas/engines/gl_cocoa/evas_engine.c
> b/src/modules/evas/engines/gl_cocoa/evas_engine.c
> index f3f684b..616525c 100644
> --- a/src/modules/evas/engines/gl_cocoa/evas_engine.c
> +++ b/src/modules/evas/engines/gl_cocoa/evas_engine.c
> @@ -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);
>
> diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c
> b/src/modules/evas/engines/gl_drm/evas_engine.c
> index be082d6..18ac39d 100644
> --- a/src/modules/evas/engines/gl_drm/evas_engine.c
> +++ b/src/modules/evas/engines/gl_drm/evas_engine.c
> @@ -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;
> diff --git a/src/modules/evas/engines/gl_drm/evas_engine.h
> b/src/modules/evas/engines/gl_drm/evas_engine.h
> index 5ecb4eb..3b70cfd 100644
> --- a/src/modules/evas/engines/gl_drm/evas_engine.h
> +++ b/src/modules/evas/engines/gl_drm/evas_engine.h
> @@ -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;
> diff --git a/src/modules/evas/engines/gl_sdl/evas_engine.c
> b/src/modules/evas/engines/gl_sdl/evas_engine.c
> index 0c7da91..0bc8681 100644
> --- a/src/modules/evas/engines/gl_sdl/evas_engine.c
> +++ b/src/modules/evas/engines/gl_sdl/evas_engine.c
> @@ -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
> diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c
> b/src/modules/evas/engines/gl_x11/evas_engine.c
> index 3a8650b..df29103 100644
> --- a/src/modules/evas/engines/gl_x11/evas_engine.c
> +++ b/src/modules/evas/engines/gl_x11/evas_engine.c
> @@ -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);
> diff --git a/src/modules/evas/engines/gl_x11/evas_engine.h
> b/src/modules/evas/engines/gl_x11/evas_engine.h
> index 5f18dc6..9c0ee4d 100644
> --- a/src/modules/evas/engines/gl_x11/evas_engine.h
> +++ b/src/modules/evas/engines/gl_x11/evas_engine.h
> @@ -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);
> diff --git a/src/modules/evas/engines/gl_x11/evas_x_main.c
> b/src/modules/evas/engines/gl_x11/evas_x_main.c
> index e0a8052..4261caa 100644
> --- a/src/modules/evas/engines/gl_x11/evas_x_main.c
> +++ b/src/modules/evas/engines/gl_x11/evas_x_main.c
> @@ -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
>
> diff --git a/src/modules/evas/engines/psl1ght/evas_engine.c
> b/src/modules/evas/engines/psl1ght/evas_engine.c
> index d119139..31fd1de 100644
> --- a/src/modules/evas/engines/psl1ght/evas_engine.c
> +++ b/src/modules/evas/engines/psl1ght/evas_engine.c
> @@ -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
> diff --git a/src/modules/evas/engines/software_ddraw/evas_engine.c
> b/src/modules/evas/engines/software_ddraw/evas_engine.c
> index b8fb1ce..9c4314c 100644
> --- a/src/modules/evas/engines/software_ddraw/evas_engine.c
> +++ b/src/modules/evas/engines/software_ddraw/evas_engine.c
> @@ -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
> diff --git a/src/modules/evas/engines/software_gdi/evas_engine.c
> b/src/modules/evas/engines/software_gdi/evas_engine.c
> index 4cb2fa1..1e156f7 100644
> --- a/src/modules/evas/engines/software_gdi/evas_engine.c
> +++ b/src/modules/evas/engines/software_gdi/evas_engine.c
> @@ -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 */
> diff --git a/src/modules/evas/engines/software_generic/evas_engine.c
> b/src/modules/evas/engines/software_generic/evas_engine.c
> index 611ee14..66ae3d2 100644
> --- a/src/modules/evas/engines/software_generic/evas_engine.c
> +++ b/src/modules/evas/engines/software_generic/evas_engine.c
> @@ -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,
> diff --git a/src/modules/evas/engines/software_x11/evas_engine.c
> b/src/modules/evas/engines/software_x11/evas_engine.c
> index c5ef57d..3adf0cf 100644
> --- a/src/modules/evas/engines/software_x11/evas_engine.c
> +++ b/src/modules/evas/engines/software_x11/evas_engine.c
> @@ -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);
> diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c
> b/src/modules/evas/engines/wayland_egl/evas_engine.c
> index 4d47f6f..a4687d4 100644
> --- a/src/modules/evas/engines/wayland_egl/evas_engine.c
> +++ b/src/modules/evas/engines/wayland_egl/evas_engine.c
> @@ -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);
> diff --git a/src/modules/evas/engines/wayland_shm/evas_engine.c
> b/src/modules/evas/engines/wayland_shm/evas_engine.c
> index 410c3b9..a9a27f8 100644
> --- a/src/modules/evas/engines/wayland_shm/evas_engine.c
> +++ b/src/modules/evas/engines/wayland_shm/evas_engine.c
> @@ -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);
>
> --
>
> --
> Jean-Philippe André
>
>
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/xeonphi
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to