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