summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/ecore_evas/ecore_evas.c58
-rw-r--r--src/lib/ecore_evas/ecore_evas_private.h8
-rw-r--r--src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c14
-rw-r--r--src/modules/ecore_evas/engines/drm/ecore_evas_drm.c5
-rw-r--r--src/modules/ecore_evas/engines/extn/ecore_evas_extn.c5
-rw-r--r--src/modules/ecore_evas/engines/fb/ecore_evas_fb.c7
-rw-r--r--src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c5
-rw-r--r--src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c5
-rw-r--r--src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c5
-rw-r--r--src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c5
-rw-r--r--src/modules/ecore_evas/engines/win32/ecore_evas_win32.c5
-rw-r--r--src/modules/ecore_evas/engines/x/ecore_evas_x.c5
12 files changed, 116 insertions, 11 deletions
diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c
index d3e3f28b9c..fa0c8ebe24 100644
--- a/src/lib/ecore_evas/ecore_evas.c
+++ b/src/lib/ecore_evas/ecore_evas.c
@@ -3070,12 +3070,59 @@ _ecore_evas_fps_debug_rendertime_add(double t)
}
EAPI void
+ecore_evas_animator_tick(Ecore_Evas *ee, Eina_Rectangle *viewport)
+{
+ Ecore_Evas *subee;
+ Eina_List *l;
+ Efl_Core_Event_Animator_Tick a = { { 0 } };
+
+ if (!viewport)
+ {
+ evas_output_size_get(ee->evas, &a.update_area.w, &a.update_area.h);
+ }
+ else
+ {
+ a.update_area = *viewport;
+ }
+
+ eo_do(ee->evas, eo_event_callback_call(EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK, &a));
+
+ // FIXME: We do not support partial animator in the subcanvas
+ a.update_area.x = 0;
+ a.update_area.y = 0;
+ EINA_LIST_FOREACH(ee->sub_ecore_evas, l, subee)
+ {
+ evas_output_size_get(subee->evas, &a.update_area.w, &a.update_area.h);
+ eo_do(subee->evas, eo_event_callback_call(EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK, &a));
+ }
+}
+
+static Eina_Bool
+_ecore_evas_animator_fallback(void *data)
+{
+ ecore_evas_animator_tick(data, NULL);
+ return EINA_TRUE;
+}
+
+EAPI void
_ecore_evas_register(Ecore_Evas *ee)
{
ee->registered = 1;
ecore_evases = (Ecore_Evas *)eina_inlist_prepend
(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
+ if (ee->engine.func->fn_animator_register &&
+ ee->engine.func->fn_animator_unregister)
+ {
+ // Backend support per window vsync
+ ee->engine.func->fn_animator_register(ee);
+ }
+ else
+ {
+ // Backend doesn't support per window vsync, fallback to generic support
+ ee->anim = ecore_animator_add(_ecore_evas_animator_fallback, ee);
+ }
+
#ifdef RENDER_SYNC
ecore_evas_first = EINA_TRUE;
#endif
@@ -3107,6 +3154,17 @@ _ecore_evas_free(Ecore_Evas *ee)
ee->deleted = EINA_TRUE;
if (ee->refcount > 0) return;
+ // Stop all vsync first
+ if (ee->engine.func->fn_animator_register &&
+ ee->engine.func->fn_animator_unregister)
+ {
+ // Backend support per window vsync
+ ee->engine.func->fn_animator_unregister(ee);
+ }
+ if (ee->anim)
+ ecore_animator_del(ee->anim);
+ ee->anim = NULL;
+
if (ee->func.fn_pre_free) ee->func.fn_pre_free(ee);
while (ee->sub_ecore_evas)
{
diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h
index c342ace7a8..62e5545e7b 100644
--- a/src/lib/ecore_evas/ecore_evas_private.h
+++ b/src/lib/ecore_evas/ecore_evas_private.h
@@ -153,6 +153,9 @@ struct _Ecore_Evas_Engine_Func
void (*fn_wm_rot_manual_rotation_done) (Ecore_Evas *ee);
void (*fn_aux_hints_set) (Ecore_Evas *ee, const char *hints);
+
+ void (*fn_animator_register) (Ecore_Evas *ee);
+ void (*fn_animator_unregister)(Ecore_Evas *ee);
};
struct _Ecore_Evas_Interface
@@ -294,6 +297,9 @@ struct _Ecore_Evas
Ecore_Evas_Engine engine;
Eina_List *sub_ecore_evas;
+ // Animator code
+ Ecore_Animator *anim;
+
struct {
unsigned char avoid_damage;
unsigned char resize_shape : 1;
@@ -419,6 +425,8 @@ const Eina_List *_ecore_evas_available_engines_get(void);
void _ecore_evas_engine_init(void);
void _ecore_evas_engine_shutdown(void);
+EAPI void ecore_evas_animator_tick(Ecore_Evas *ee, Eina_Rectangle *viewport);
+
#undef EAPI
#define EAPI
diff --git a/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
index 0f9c3b6720..054a1e2337 100644
--- a/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
+++ b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
@@ -643,7 +643,19 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
_ecore_evas_screen_geometry_get,
NULL, // screen_dpi_get
NULL,
- NULL // msg_send
+ NULL, // msg_send
+
+ NULL, // fn_pointer_xy_get
+ NULL, // fn_pointer_warp
+
+ NULL, // fn_wm_rot_preferred_rotation_set
+ NULL, // fn_wm_rot_available_rotations_set
+ NULL, // fn_wm_rot_manual_rotation_done_set
+ NULL, // fn_wm_rot_manual_rotation_done
+
+ NULL, // fn_aux_hints_set
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
static Ecore_Cocoa_Window *
diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
index f25c52c611..63b794978b 100644
--- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
+++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
@@ -172,7 +172,10 @@ static Ecore_Evas_Engine_Func _ecore_evas_drm_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
EAPI Ecore_Evas *
diff --git a/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c b/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c
index c04afe85c1..6cc02b77f8 100644
--- a/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c
+++ b/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c
@@ -910,7 +910,10 @@ static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
static Eina_Bool
diff --git a/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c b/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c
index 8042d0c082..bd34e3ca6f 100644
--- a/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c
+++ b/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c
@@ -638,8 +638,11 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
- };
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
+};
EAPI Ecore_Evas *
ecore_evas_fb_new_internal(const char *disp_name, int rotation, int w, int h)
diff --git a/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c b/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c
index c3232649c5..62350681bf 100644
--- a/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c
+++ b/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c
@@ -460,7 +460,10 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
EAPI Ecore_Evas *
diff --git a/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c b/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
index 0c14c8957c..1cdcb9af10 100644
--- a/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
+++ b/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
@@ -549,7 +549,10 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
static Ecore_Evas*
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 c6def65d9a..46e9e034c2 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
@@ -109,7 +109,10 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
/* external variables */
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 23b9b01e1c..1afa86d5cf 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
@@ -109,7 +109,10 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
/* external variables */
diff --git a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
index 38833341a2..a9404ca84f 100644
--- a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
+++ b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
@@ -1200,7 +1200,10 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
NULL, // wm_rot_manual_rotation_done_set
NULL, // wm_rot_manual_rotation_done
- NULL // aux_hints_set
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
#endif /* BUILD_ECORE_EVAS_WIN32 */
diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
index a2ce91269e..418cdaa04f 100644
--- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c
+++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
@@ -3677,7 +3677,10 @@ static Ecore_Evas_Engine_Func _ecore_x_engine_func =
_ecore_evas_x_wm_rot_manual_rotation_done_set,
_ecore_evas_x_wm_rot_manual_rotation_done,
- _ecore_evas_x_aux_hints_set
+ _ecore_evas_x_aux_hints_set,
+
+ NULL, // fn_animator_register
+ NULL // fn_animator_unregister
};
/*