diff options
Diffstat (limited to 'src/modules/evas/engines/gl_drm/evas_engine.c')
-rw-r--r-- | src/modules/evas/engines/gl_drm/evas_engine.c | 271 |
1 files changed, 137 insertions, 134 deletions
diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c b/src/modules/evas/engines/gl_drm/evas_engine.c index 12889a3fef..721f44b975 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.c +++ b/src/modules/evas/engines/gl_drm/evas_engine.c @@ -830,20 +830,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) @@ -876,7 +867,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; @@ -899,151 +890,169 @@ 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); + 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); } - 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); @@ -1051,12 +1060,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; |