summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoram Park <boram1288.park@samsung.com>2015-04-29 14:36:38 +0900
committerBoram Park <boram1288.park@samsung.com>2015-04-29 14:36:38 +0900
commitd591afc88f8f3eb901f18dec36e7ac913367bcba (patch)
tree42d2636548e08dd3d2507ddcc5203b6245ecb778
parenta9ad1da639ce6663e80dd2da852b58547f782957 (diff)
downloadefl-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.c35
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;
}