From c46b096c78f184f1a02ab1e9bc1a816ba3d538cd Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Mon, 28 Jan 2013 20:28:19 +0000 Subject: [PATCH] ecore_evas/wayland: Merge code from egl and shm engines into common. Since the render code on both engines is using the frame callback, let's merge it to avoid code duplication. SVN revision: 83390 --- .../wayland/ecore_evas_wayland_common.c | 56 +++++++++- .../engines/wayland/ecore_evas_wayland_egl.c | 105 +----------------- .../engines/wayland/ecore_evas_wayland_shm.c | 71 +----------- 3 files changed, 53 insertions(+), 179 deletions(-) diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index c0cc37dd3b..6b0d5dcca8 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -24,6 +24,12 @@ static Evas_Smart *_ecore_evas_wl_common_smart = NULL; static int _ecore_evas_wl_init_count = 0; static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5]; +/* Frame listener */ +static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm); +static const struct wl_callback_listener frame_listener = +{ + _ecore_evas_wl_frame_complete, +}; static Eina_Bool _ecore_evas_wl_common_cb_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) @@ -759,12 +765,34 @@ _ecore_evas_wl_common_post_render(Ecore_Evas *ee) if (ee->func.fn_post_render) ee->func.fn_post_render(ee); } +static void +_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm EINA_UNUSED) +{ + Ecore_Evas *ee = data; + Ecore_Wl_Window *win = NULL; + Ecore_Evas_Engine_Wl_Data *wdata; + + if (!ee) return; + wdata = ee->engine.data; + if (!(win = wdata->win)) return; + + win->frame_callback = NULL; + win->frame_pending = EINA_FALSE; + wl_callback_destroy(callback); + + if (win->surface) + { + win->frame_callback = wl_surface_frame(win->surface); + wl_callback_add_listener(win->frame_callback, &frame_listener, ee); + } +} + int _ecore_evas_wl_common_render(Ecore_Evas *ee) { int rend = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); + Ecore_Wl_Window *win = NULL; + Ecore_Evas_Engine_Wl_Data *wdata; if (!ee) return 0; if (!ee->visible) @@ -773,10 +801,28 @@ _ecore_evas_wl_common_render(Ecore_Evas *ee) return 0; } - rend = _ecore_evas_wl_common_pre_render(ee); - rend |= _ecore_evas_wl_common_render_updates(ee); - _ecore_evas_wl_common_post_render(ee); + wdata = ee->engine.data; + if (!(win = wdata->win)) return 0; + rend = _ecore_evas_wl_common_pre_render(ee); + if (!(win->frame_pending)) + { + /* FIXME - ideally have an evas_changed_get to return the value + * of evas->changed to avoid creating this callback and + * destroying it again + */ + + if (!win->frame_callback) + { + win->frame_callback = wl_surface_frame(win->surface); + wl_callback_add_listener(win->frame_callback, &frame_listener, ee); + } + + rend |= _ecore_evas_wl_common_render_updates(ee); + if (rend) + win->frame_pending = EINA_TRUE; + } + _ecore_evas_wl_common_post_render(ee); return rend; } diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c index df7eeb0c3a..b797660182 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c @@ -10,7 +10,6 @@ /* local function prototypes */ -static int _ecore_evas_wl_render(Ecore_Evas *ee); static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_show(Ecore_Evas *ee); static void _ecore_evas_wl_hide(Ecore_Evas *ee); @@ -73,7 +72,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = NULL, // modal set NULL, // demand attention set NULL, // focus skip set - _ecore_evas_wl_render, + _ecore_evas_wl_common_render, _ecore_evas_wl_common_screen_geometry_get, _ecore_evas_wl_common_screen_dpi_get }; @@ -229,108 +228,6 @@ ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent, return NULL; } -static void -_ecore_evas_wl_frame_complete (void *data, struct wl_callback *callback, uint32_t time EINA_UNUSED); - -static const struct wl_callback_listener frame_listener = { - _ecore_evas_wl_frame_complete, -}; - -static void -_ecore_evas_wl_frame_complete (void *data, struct wl_callback *callback, uint32_t time EINA_UNUSED) -{ - Ecore_Evas *ee = data; - Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data; - - wdata->win->frame_callback = NULL; - wdata->win->frame_pending = EINA_FALSE; - wl_callback_destroy(callback); - - wdata->win->frame_callback = - wl_surface_frame(wdata->win->surface); - - wl_callback_add_listener(wdata->win->frame_callback, - &frame_listener, ee); -} - -int -_ecore_evas_wl_render_updates(Ecore_Evas *ee) -{ - int rend = 0; - Eina_List *updates = NULL; - Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* eglSwapBuffers is ultimately called by evas_render_updates() if - * there is some update to make. So we must pre-emptively create a - * frame callback handler. We make sure we always have one of these in - * available to track if the event is presented. - * - * This frame callback will be fired when the frame has been presented - * and we can safely call eglSwapBuffers without it blocking. Whether - * to render or not is handled by the frame_pending boolean which is - * reset on the frame callback event. - */ - if (!wdata->win->frame_pending) - { - /* FIXME - ideally have an evas_changed_get to return the value - * of evas->changed to avoid creating this callback and - * destroying it again - */ - - if (!wdata->win->frame_callback) - { - wdata->win->frame_callback = - wl_surface_frame(wdata->win->surface); - - wl_callback_add_listener(wdata->win->frame_callback, - &frame_listener, ee); - } - - if ((updates = evas_render_updates(ee->evas))) - { - Eina_List *l = NULL; - Eina_Rectangle *r; - - EINA_LIST_FOREACH(updates, l, r) - ecore_wl_window_damage(wdata->win, - r->x, r->y, r->w, r->h); - - ecore_wl_flush(); - - evas_render_updates_free(updates); - - wdata->win->frame_pending = EINA_TRUE; - - rend = 1; - } - } - - return rend; -} - -static int -_ecore_evas_wl_render(Ecore_Evas *ee) -{ - int rend = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ee) return 0; - if (!ee->visible) - { - evas_norender(ee->evas); - return 0; - } - - rend = _ecore_evas_wl_common_pre_render(ee); - rend |= _ecore_evas_wl_render_updates(ee); - _ecore_evas_wl_common_post_render(ee); - - return rend; -} - static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) { diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c index 6e68cf6783..158ae72758 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c @@ -16,14 +16,6 @@ static void _ecore_evas_wl_show(Ecore_Evas *ee); static void _ecore_evas_wl_hide(Ecore_Evas *ee); static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha); static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent); -static int _ecore_evas_wl_render(Ecore_Evas *ee); - -/* Frame listener */ -static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm); -static const struct wl_callback_listener frame_listener = -{ - _ecore_evas_wl_frame_complete, -}; static Ecore_Evas_Engine_Func _ecore_wl_engine_func = { @@ -81,7 +73,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = NULL, // modal set NULL, // demand attention set NULL, // focus skip set - _ecore_evas_wl_render, + _ecore_evas_wl_common_render, _ecore_evas_wl_common_screen_geometry_get, _ecore_evas_wl_common_screen_dpi_get }; @@ -463,67 +455,6 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent) ecore_wl_window_update_size(wdata->win, ee->w + fw, ee->h + fh); } -static void -_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm EINA_UNUSED) -{ - Ecore_Evas *ee = data; - Ecore_Wl_Window *win = NULL; - Ecore_Evas_Engine_Wl_Data *wdata; - - if (!ee) return; - wdata = ee->engine.data; - if (!(win = wdata->win)) return; - - win->frame_callback = NULL; - win->frame_pending = EINA_FALSE; - wl_callback_destroy(callback); - - if (win->surface) - { - win->frame_callback = wl_surface_frame(win->surface); - wl_callback_add_listener(win->frame_callback, &frame_listener, ee); - } -} - -static int -_ecore_evas_wl_render(Ecore_Evas *ee) -{ - int rend = 0; - Ecore_Wl_Window *win = NULL; - Ecore_Evas_Engine_Wl_Data *wdata; - - if (!ee) return 0; - if (!ee->visible) - { - evas_norender(ee->evas); - return 0; - } - - wdata = ee->engine.data; - if (!(win = wdata->win)) return 0; - - rend = _ecore_evas_wl_common_pre_render(ee); - if (!(win->frame_pending)) - { - /* FIXME - ideally have an evas_changed_get to return the value - * of evas->changed to avoid creating this callback and - * destroying it again - */ - - if (!win->frame_callback) - { - win->frame_callback = wl_surface_frame(win->surface); - wl_callback_add_listener(win->frame_callback, &frame_listener, ee); - } - - rend |= _ecore_evas_wl_common_render_updates(ee); - if (rend) - win->frame_pending = EINA_TRUE; - } - _ecore_evas_wl_common_post_render(ee); - return rend; -} - void _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location) {