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