antognolli pushed a commit to branch ecore-1.7.
commit 35d36f85a03cf1e64526ef24fc9af2dced600900
Author: Rafael Antognolli <[email protected]>
Date: Mon Apr 15 17:16:32 2013 -0300
ecore_evas/wayland: Backport the frame_callback patch to 1.7.
This will solve some rendering issues caused by the buffer being written
before the compositor getting its content.
---
src/lib/ecore_evas/ecore_evas_wayland_shm.c | 89 +++++++++++++++++++++++------
src/lib/ecore_wayland/Ecore_Wayland.h | 3 +
2 files changed, 73 insertions(+), 19 deletions(-)
diff --git a/src/lib/ecore_evas/ecore_evas_wayland_shm.c
b/src/lib/ecore_evas/ecore_evas_wayland_shm.c
index 3bf7fea..f47774f 100644
--- a/src/lib/ecore_evas/ecore_evas_wayland_shm.c
+++ b/src/lib/ecore_evas/ecore_evas_wayland_shm.c
@@ -66,6 +66,12 @@ struct _EE_Wl_Smart_Data
Evas_Coord x, y, w, h;
};
+struct _Ecore_Evas_Engine_Wl_Data
+{
+ Ecore_Wl_Window *win;
+ Evas_Object *frame;
+};
+
/* local function prototypes */
static int _ecore_evas_wl_init(void);
static int _ecore_evas_wl_shutdown(void);
@@ -103,6 +109,8 @@ static void _ecore_evas_wl_screen_dpi_get(const Ecore_Evas
*ee __UNUSED__, int *
static void _ecore_evas_wl_ensure_pool_size(Ecore_Evas *ee, int w, int h);
static struct wl_shm_pool *_ecore_evas_wl_shm_pool_create(int size, void
**data);
+static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback
*callback, uint32_t tm EINA_UNUSED);
+
static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool
*pool);
static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type
__UNUSED__, void *event);
@@ -127,6 +135,11 @@ static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas);
static int _ecore_evas_wl_init_count = 0;
static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
+static const struct wl_callback_listener frame_listener =
+{
+ _ecore_evas_wl_frame_complete,
+};
+
static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
{
_ecore_evas_wl_free,
@@ -930,22 +943,45 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int
transparent)
}
}
+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;
+
+ if (!ee) return;
+ if (!(win = ee->engine.wl.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;
+
+ if (!(win = ee->engine.wl.win)) return 0;
if (!ee) return 0;
if (!ee->visible)
evas_norender(ee->evas);
else
{
- Eina_List *ll = NULL, *updates = NULL;
+ Eina_List *ll = NULL;
Ecore_Evas *ee2 = NULL;
if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
- EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+ EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
{
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
if (ee2->engine.func->fn_render)
@@ -953,27 +989,42 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
}
- if ((updates = evas_render_updates(ee->evas)))
+ if (!win->frame_pending)
{
- Eina_List *l = NULL;
- Eina_Rectangle *r;
+ Eina_List *updates;
- LOGFN(__FILE__, __LINE__, __FUNCTION__);
+ if (!win->frame_callback)
+ {
+ win->frame_callback = wl_surface_frame(win->surface);
+ wl_callback_add_listener(win->frame_callback,
+ &frame_listener, ee);
+ }
- ecore_wl_window_buffer_attach(ee->engine.wl.win,
- ee->engine.wl.buffer, 0, 0);
- EINA_LIST_FOREACH(updates, l, r)
- ecore_wl_window_damage(ee->engine.wl.win,
- r->x, r->y, r->w, r->h);
- ecore_wl_window_commit(ee->engine.wl.win);
- ecore_wl_flush();
-
- evas_render_updates_free(updates);
- _ecore_evas_idle_timeout_update(ee);
- rend = 1;
- }
+ if ((updates = evas_render_updates(ee->evas)))
+ {
+ Eina_List *l = NULL;
+ Eina_Rectangle *r;
+
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ ecore_wl_window_buffer_attach(ee->engine.wl.win,
+ ee->engine.wl.buffer, 0, 0);
+ EINA_LIST_FOREACH(updates, l, r)
+ ecore_wl_window_damage(ee->engine.wl.win,
+ r->x, r->y, r->w, r->h);
+ ecore_wl_window_commit(ee->engine.wl.win);
+ ecore_wl_flush();
+
+ evas_render_updates_free(updates);
+ _ecore_evas_idle_timeout_update(ee);
+ rend = 1;
- if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+ if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+
+ win->frame_pending = EINA_TRUE;
+
+ }
+ }
}
return rend;
}
diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h
b/src/lib/ecore_wayland/Ecore_Wayland.h
index 0ce3b62..a62d55f 100644
--- a/src/lib/ecore_wayland/Ecore_Wayland.h
+++ b/src/lib/ecore_wayland/Ecore_Wayland.h
@@ -218,6 +218,9 @@ struct _Ecore_Wl_Window
Ecore_Wl_Input *pointer_device;
Ecore_Wl_Input *keyboard_device;
+ Eina_Bool frame_pending;
+ struct wl_callback *frame_callback;
+
/* FIXME: Ideally we should record the cursor name for this window
* so we can compare and avoid unnecessary cursor set calls to wayland */
--
------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter