From b5425dc51a56992f3941ede35a3ff52d63021087 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Fri, 11 Mar 2016 13:48:44 -0600 Subject: [PATCH] ecore_drm: Disable custom tick if we can't wait for vblank If we fail to schedule a VBlank event, then we should disable custom ticks and fallback to timer-based animators. This patch fixes some issues with Intel Atom based setups where rendering would fail when using custom animators. @fix --- src/lib/ecore_drm/ecore_drm_device.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/lib/ecore_drm/ecore_drm_device.c b/src/lib/ecore_drm/ecore_drm_device.c index 2ea9f42c0d..62f54eceb7 100644 --- a/src/lib/ecore_drm/ecore_drm_device.c +++ b/src/lib/ecore_drm/ecore_drm_device.c @@ -36,6 +36,8 @@ static Eina_List *drm_devices; static int ticking = 0; +static void _ecore_drm_tick_source_set(Ecore_Drm_Device *dev); + static void _ecore_drm_tick_schedule(Ecore_Drm_Device *dev) { @@ -46,7 +48,11 @@ _ecore_drm_tick_schedule(Ecore_Drm_Device *dev) vbl.request.type = (DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT); vbl.request.sequence = 1; vbl.request.signal = (unsigned long)dev; - drmWaitVBlank(dev->drm.fd, &vbl); + if (drmWaitVBlank(dev->drm.fd, &vbl) < 0) + { + WRN("Vblank failed, disabling custom ticks"); + _ecore_drm_tick_source_set(NULL); + } } static void @@ -65,6 +71,13 @@ _ecore_drm_tick_end(void *data EINA_UNUSED) static void _ecore_drm_tick_source_set(Ecore_Drm_Device *dev) { + if (!dev) + { + ecore_animator_custom_source_tick_begin_callback_set(NULL, NULL); + ecore_animator_custom_source_tick_end_callback_set(NULL, NULL); + ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER); + return; + } ecore_animator_custom_source_tick_begin_callback_set (_ecore_drm_tick_begin, dev); ecore_animator_custom_source_tick_end_callback_set