diff options
author | Boram Park <boram1288.park@samsung.com> | 2015-04-29 14:36:38 +0900 |
---|---|---|
committer | Boram Park <boram1288.park@samsung.com> | 2015-04-29 14:36:38 +0900 |
commit | d591afc88f8f3eb901f18dec36e7ac913367bcba (patch) | |
tree | 42d2636548e08dd3d2507ddcc5203b6245ecb778 | |
parent | a9ad1da639ce6663e80dd2da852b58547f782957 (diff) | |
download | efl-d591afc88f8f3eb901f18dec36e7ac913367bcba.tar.gz |
fix blocking issue when a pageflip event doesn't occur
Change-Id: Ied38ad1fc078e82ec85aa8e00556f34970fc48fd
-rw-r--r-- | src/modules/ecore_evas/engines/drm/ecore_evas_drm.c | 35 |
1 files changed, 35 insertions, 0 deletions
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 e784f36331..302c077670 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; } |