From: Boram Park Date: Wed, 29 Apr 2015 05:36:38 +0000 (+0900) Subject: fix blocking issue when a pageflip event doesn't occur X-Git-Tag: accepted/tizen/common/20150429.093800^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F27%2F38827%2F1;p=platform%2Fupstream%2Fefl.git fix blocking issue when a pageflip event doesn't occur Change-Id: Ied38ad1fc078e82ec85aa8e00556f34970fc48fd --- 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 e784f36..302c077 100644 --- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c +++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c @@ -33,6 +33,8 @@ struct _Ecore_Evas_Engine_Drm_Data } func; int wait_for_flip_done; int need_render; + + Ecore_Timer *flip_done_timer; }; /* local function prototypes */ @@ -609,6 +611,12 @@ _ecore_evas_drm_event_page_flip(void *data, int type EINA_UNUSED, void *event) if (edata->wait_for_flip_done) { + if (edata->flip_done_timer) + { + ecore_timer_del(edata->flip_done_timer); + edata->flip_done_timer = NULL; + } + edata->wait_for_flip_done = 0; if (edata->need_render) { @@ -658,6 +666,13 @@ _ecore_evas_drm_free(Ecore_Evas *ee) Ecore_Evas_Engine_Drm_Data *data; data = ee->engine.data; + + if (data->flip_done_timer) + { + ecore_timer_del(data->flip_done_timer); + data->flip_done_timer = NULL; + } + ecore_evas_input_event_unregister(ee); free(data); _ecore_evas_drm_shutdown(); @@ -1025,6 +1040,18 @@ _ecore_evas_drm_aspect_set(Ecore_Evas *ee, double aspect) ee->prop.aspect = aspect; } +static Eina_Bool +_ecore_evas_drm_render_done_timeout(void *data) +{ + Ecore_Evas *ee = data; + Ecore_Evas_Engine_Drm_Data *edata = ee->engine.data; + + edata->flip_done_timer = NULL; + edata->wait_for_flip_done = 0; + + return ECORE_CALLBACK_CANCEL; +} + static int _ecore_evas_drm_render(Ecore_Evas *ee) { @@ -1076,6 +1103,14 @@ _ecore_evas_drm_render(Ecore_Evas *ee) rend = 1; } + if (edata->wait_for_flip_done) + { + if (edata->flip_done_timer) + ecore_timer_del(edata->flip_done_timer); + + edata->flip_done_timer = ecore_timer_add(0.1f, _ecore_evas_drm_render_done_timeout, ee); + } + return rend; }