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
This commit is contained in:
Rafael Antognolli 2013-01-28 20:28:19 +00:00
parent 9afa66d722
commit c46b096c78
3 changed files with 53 additions and 179 deletions

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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)
{