i confirm this, the 2 windows engines are broken

On Thu, Dec 8, 2016 at 3:46 AM, Jean-Philippe André <j...@videolan.org> wrote:
> 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

------------------------------------------------------------------------------
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