From 73b308fb66f871b93ef8e324997872e3bf175906 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 2 Dec 2016 15:30:02 -0800 Subject: [PATCH] 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 | 45 +-- src/modules/evas/engines/drm/evas_engine.c | 50 +-- src/modules/evas/engines/eglfs/evas_engine.c | 264 +++++++------- src/modules/evas/engines/fb/evas_engine.c | 28 +- .../evas/engines/gl_cocoa/evas_engine.c | 141 ++++---- src/modules/evas/engines/gl_drm/evas_engine.c | 307 ++++++++-------- 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 | 330 +++++++++--------- src/modules/evas/engines/gl_x11/evas_engine.h | 6 +- src/modules/evas/engines/gl_x11/evas_x_main.c | 24 +- .../evas/engines/psl1ght/evas_engine.c | 19 +- .../evas/engines/software_ddraw/evas_engine.c | 48 +-- .../evas/engines/software_gdi/evas_engine.c | 70 ++-- .../engines/software_generic/evas_engine.c | 3 +- .../evas/engines/software_x11/evas_engine.c | 204 +++++------ .../evas/engines/wayland_egl/evas_engine.c | 310 ++++++++-------- .../evas/engines/wayland_shm/evas_engine.c | 64 ++-- 20 files changed, 919 insertions(+), 1062 deletions(-) diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 269d329054..b499dcf77c 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 26ea5c515c..d5645fc668 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 fcdd184a09..b838d99369 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; + Evas_Engine_Info_Buffer *info = in; - 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; + 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 4c6ff0f387..6cbc0670bf 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; + Evas_Engine_Info_Drm *info = einfo; - info = (Evas_Engine_Info_Drm *)einfo; - if (!info) return 0; + return _render_engine_setup(info, w, h); +} - epd = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); - if (!epd) return 0; +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; - re = epd->engine.data.output; - if (!re) - { + _outbuf_reconfigure(re->generic.ob, w, h, + info->info.rotation, info->info.depth); + if (!ob) return 0; - 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); - - evas_render_engine_software_generic_update(&re->generic, - re->generic.ob, - epd->output.w, - epd->output.h); - } - - epd->engine.data.output = re; - if (!epd->engine.data.output) 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 1c0e10841c..d4eb3de3a1 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,71 @@ eng_setup(Evas *evas, void *in) } } - if (!(re = epd->engine.data.output)) + return swap_mode; +} + +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; + + swap_mode = _eng_swapmode_get(); + + if (!initted) { - Outbuf *ob; - Render_Engine_Merge_Mode merge_mode = MERGE_BOUNDING; - - if (!initted) - { - glsym_evas_gl_preload_init(); - } - - if (!(re = calloc(1, sizeof(Render_Engine)))) return 0; - - /* try to create new outbuf */ - ob = evas_outbuf_new(info, epd->output.w, epd->output.h, swap_mode); - if (!ob) - { - free(re); - return 0; - } - - 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); - free(re); - return 0; - } - - epd->engine.data.output = re; - 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_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode); - - if (!initted) - { - gl_extn_veto(re); - initted = EINA_TRUE; - } - } - else - { - 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; - - ob_old = re->generic.software.ob; - re->generic.software.ob = NULL; - gl_wins--; - - 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; - } - - evas_outbuf_use(ob); - if (ob_old) evas_outbuf_free(ob_old); - - ob->evas = evas; - - evas_render_engine_software_generic_update(&re->generic.software, ob, - epd->output.w, epd->output.h); - - 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)) - { - evas_outbuf_reconfigure(eng_get_ob(re), - epd->output.w, epd->output.h, - info->info.rotation, - info->info.depth); - } - } + glsym_evas_gl_preload_init(); } - if (!eng_get_ob(re)) + 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) { - free(re); - return 0; + if ((!strcmp(s, "bounding")) || (!strcmp(s, "b"))) + merge_mode = MERGE_BOUNDING; + else if ((!strcmp(s, "full")) || (!strcmp(s, "f"))) + merge_mode = MERGE_FULL; } - if (!epd->engine.data.output) - { - if (eng_get_ob(re)) - { - evas_outbuf_free(eng_get_ob(re)); - gl_wins--; - } - free(re); - return 0; - } + evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode); 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 +822,78 @@ 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) + evas_outbuf_use(eng_get_ob(re)); + + if (!initted) { - epd->engine.data.context = - epd->engine.func->context_new(epd->engine.data.output); + gl_extn_veto(re); + initted = EINA_TRUE; } + return re; + + on_error: + /* free outbuf */ + evas_outbuf_free(ob); + free(re); + return NULL; +} + +static int +eng_update(void *data, void *info, unsigned int w, unsigned int h) +{ + Render_Engine *re = data; + + 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; + + ob_old = re->generic.software.ob; + re->generic.software.ob = NULL; + gl_wins--; + + ob = evas_outbuf_new(info, w, h, swap_mode); + if (!ob) + { + if (ob_old) evas_outbuf_free(ob_old); + return 0; + } + + evas_outbuf_use(ob); + if (ob_old) evas_outbuf_free(ob_old); + + 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_reconfigure(eng_get_ob(re), + w, h, + info->info.rotation, + info->info.depth); + } + } + + 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 (re->generic.software.tb) + evas_render_engine_software_generic_tile_strict_set(&re->generic.software, EINA_TRUE); + 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 4917113c68..79e670e8b7 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; + Evas_Engine_Info_FB *info = in; - 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; + 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 f3f684b447..616525c6f2 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)) + // TODO SWAP MODE + + if (!_initted) { - CRI("Failed to get evas public data"); + glsym_evas_gl_preload_init(); + _initted = EINA_TRUE; + } + + re = calloc(1, sizeof(*re)); + if (EINA_UNLIKELY(!re)) + { + CRI("Failed to allocate memory"); goto err; } - // TODO SWAP MODE - - if (!e->engine.data.output) + ob = evas_outbuf_new(info, w, h); + if (EINA_UNLIKELY(!ob)) { - 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; - } - - 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++; - } - else - { - CRI("ALREADY A DATA OUTPUT. THIS PART IS NOT IMPLEMENTED YET. PLEASE REPORT."); - return 0; - } - if (EINA_UNLIKELY(!e->engine.data.output)) - { - CRI("Failed to create a data output"); - return 0; + CRI("Failed to create outbuf"); + goto err; } - if (!e->engine.data.context) - e->engine.data.context = - e->engine.func->context_new(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 initialize gl_generic"); + evas_outbuf_free(re->win); + goto err; + } + re->win = ob; + _gl_wins++; + 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 be082d6058..18ac39d7f5 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,108 @@ 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 (!initted) - { - glsym_evas_gl_preload_init(); - } - - if (!(re = calloc(1, sizeof(Render_Engine)))) return 0; - - if (!eng_gbm_init(info)) - { - free(re); - return 0; - } - - 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; - } - - 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; - } - - epd->engine.data.output = re; - 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; - else if ((!strcmp(s, "smart")) || (!strcmp(s, "s"))) - merge_mode = MERGE_SMART; - } - - evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode); - - if (!initted) - { - gl_extn_veto(re); - initted = EINA_TRUE; - } - } - else - { - 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; - - 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, epd->output.w, epd->output.h, swap_mode); - if (!ob) - { - free(re); - return 0; - } - - evas_outbuf_use(ob); - - ob->evas = evas; - - evas_render_engine_software_generic_update(&re->generic.software, ob, - epd->output.w, epd->output.h); - - 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)) - { - 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); - } - } + 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 (!eng_get_ob(re)) + return merge_mode; +} + +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; + + swap_mode = _eng_swap_mode_get(info->info.swap_mode); + merge_mode = _eng_merge_mode_get(void); + + + if (!initted) + { + glsym_evas_gl_preload_init(); + } + + if (!(re = calloc(1, sizeof(Render_Engine)))) return 0; + + if (!eng_gbm_init(info)) { free(re); - return 0; + return NULL; } - if (!epd->engine.data.output) + re->fd = info->info.fd; + + /* try to create new outbuf */ + ob = evas_outbuf_new(info, w, h, swap_mode); + if (!ob) { - if (eng_get_ob(re)) - { - evas_outbuf_free(eng_get_ob(re)); - gl_wins--; - eng_gbm_shutdown(info); - } + eng_gbm_shutdown(info); free(re); - return 0; + return NULL; + } + + 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; + } + + gl_wins++; + + evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode); + + if (!initted) + { + gl_extn_veto(re); + initted = EINA_TRUE; } 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 +996,71 @@ 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) + evas_outbuf_use(eng_get_ob(re)); + + return re; +} + +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; + + if (eng_get_ob(re) && _re_wincheck(eng_get_ob(re))) { - epd->engine.data.context = - epd->engine.func->context_new(epd->engine.data.output); + if ((info->info.depth != eng_get_ob(re)->depth) || + (info->info.destination_alpha != eng_get_ob(re)->destination_alpha)) + { + Outbuf *ob, *ob_old; + + 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) + { + free(re); + return 0; + } + + evas_outbuf_use(ob); + + 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_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); + } } + 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 (re->generic.software.tb) + evas_render_engine_software_generic_tile_strict_set(&re->generic.software, EINA_TRUE); + 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 5ecb4eb414..3b70cfd133 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 0c7da915d7..0bc8681952 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 3a8650bb71..df2910324c 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; + int eb, evb; - if (!glXQueryExtension(info->info.display, &eb, &evb)) return 0; + 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; - } + re = calloc(1, sizeof(Render_Engine)); + if (!re) return NULL; - 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, + 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, + 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; - } + 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; - e->engine.data.output = re; - gl_wins++; + gl_wins++; - 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; - } - - evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode); - - if (!initted) - { - gl_extn_veto(re); -// evgl_engine_init(re, &evgl_funcs); - initted = 1; - } - - } - else + if ((s = getenv("EVAS_GL_PARTIAL_MERGE"))) { - re = e->engine.data.output; - 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)) - { - 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); - - 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)) - { - 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 (!eng_get_ob(re)) - { - free(re); - return 0; + 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 (!e->engine.data.output) + evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge_mode); + + if (!initted) { - if (eng_get_ob(re)) - { - eng_window_free(eng_get_ob(re)); - gl_wins--; - } - free(re); - return 0; + 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); - 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 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)) + { + Outbuf *ob, *ob_old; + + 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) + { + if (ob_old) eng_window_free(ob_old); + return 0; + } + + 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_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); + } + } + 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 5f18dc69ac..9c0ee4d41d 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 e0a80520ff..4261caaef7 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 d119139b4d..31fd1de456 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 b8fb1ce831..9c4314c71b 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 4cb2fa1ba0..1e156f7f96 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; + return _output_setup(w, + h, + info->info.rotation, + info->info.window, + info->info.depth, + info->info.borderless, + info->info.fullscreen, + info->info.region); +} - re = e->engine.data.output; - ponebuf = re->generic.ob->onebuf; +static int +eng_update(void *data, void *in, unsigned int w, unsigned int h) +{ + Render_Engine *re = data; + Outbuf *ob; + int ponebuf = 0; - 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; + ponebuf = re->generic.ob->onebuf; - 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); + 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 611ee14116..66ae3d234d 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 c5ef57d3e9..3adf0cf6c1 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 (info->info.backend != EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB) + return NULL; + + if (try_swapbuf == -1) { - /* if we haven't initialized - init (automatic abort if already done) */ - - if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB) + 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 + { + 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; + + _outbufs = eina_list_append(_outbufs, re->generic.ob); + + return re; +} + +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->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 { - Outbuf *ob = NULL; - /* int ponebuf = 0; */ - - re = e->engine.data.output; - /* if ((re) && (re->ob)) ponebuf = re->ob->onebuf; */ - - _outbufs = eina_list_remove(_outbufs, re->generic.ob); - - 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); - } - } + 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_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; - } - - /* if ((re) && (re->ob)) re->ob->onebuf = ponebuf; */ + 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 4d47f6fe56..a4687d4b49 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,105 @@ eng_setup(Evas *evas, void *info) (!strcasecmp(s, "4"))) swap_mode = MODE_QUADRUPLE; } - else swap_mode = MODE_AUTO; - - if (!(re = epd->engine.data.output)) - { - 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(); - } - - 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; - } - - epd->engine.data.output = re; - gl_wins++; - - 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; - } - - evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge); - - if (!initted) - { - gl_extn_veto(re); - initted = EINA_TRUE; - } - } else { - re = epd->engine.data.output; - ob = eng_get_ob(re); - - 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; - } - - 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; - } - - ob = eng_window_new(evas, inf, epd->output.w, epd->output.h, swap_mode); - if (!ob) goto ob_err; - - eng_window_use(ob); - - 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); - } - } + swap_mode = MODE_AUTO; } - if (!eng_get_ob(re)) goto ob_err; + return swap_mode; +} - if (!epd->engine.data.output) +static Render_Engine_Merge_Mode +_eng_merge_mode_get(void) +{ + Render_Engine_Merge_Mode merge = MERGE_SMART; + const char *s; + + if ((s = getenv("EVAS_GL_PARTIAL_MERGE"))) { - if (eng_get_ob(re)) - { - eng_window_free(eng_get_ob(re)); - gl_wins--; - } - goto ob_err; + 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; + } + + 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; + + swap_mode = _eng_swap_mode_get(); + merge = _eng_merge_mode_get(); + + /* 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 NULL; + + /* if we have not initialize gl & evas, do it */ + if (!initted) + { + glsym_evas_gl_preload_init(); + } + + 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)) + { + eng_window_free(ob); + free(re); + return NULL; + } + + gl_wins++; + + evas_render_engine_software_generic_merge_mode_set(&re->generic.software, merge); + + if (!initted) + { + gl_extn_veto(re); + initted = EINA_TRUE; } 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,10 +659,79 @@ eng_setup(Evas *evas, void *info) (&re->generic.software, EINA_TRUE); } - if (!epd->engine.data.context) + eng_window_use(eng_get_ob(re)); + + return re; +} + +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)) { - epd->engine.data.context = - epd->engine.func->context_new(epd->engine.data.output); + 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)) + { + 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); + } + } + + 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(w, h); + + 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); } eng_window_use(eng_get_ob(re)); @@ -721,7 +739,6 @@ eng_setup(Evas *evas, void *info) 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 410c3b9c37..a9a27f8884 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; + return _render_engine_swapbuf_setup(w, h, einfo); +} - /* try to get evas public data */ - if (!(epd = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS))) - return 0; +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; - /* test for valid engine output */ - if (!(re = epd->engine.data.output)) - { - /* if we have no engine data, assume we have not initialized yet */ + if (!einfo->info.wl_surface) return 0; + if (!einfo->info.hidden) return 1; - re = _render_engine_swapbuf_setup(epd->output.w, epd->output.h, einfo); + eng_output_resize(re, w, h); + if (!ob) return 0; - 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); - } - - epd->engine.data.output = re; - if (!epd->engine.data.output) - { - ERR("Failed to create Render Engine"); - goto err; - } - - 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);