fix blocking issue when a pageflip event doesn't occur 27/38827/1 accepted/tizen/common/20150429.093800 accepted/tizen/mobile/20150429.124701 accepted/tizen/tv/20150429.123902 accepted/tizen/wearable/20150429.124130 submit/tizen/20150428.160542
authorBoram Park <boram1288.park@samsung.com>
Wed, 29 Apr 2015 05:36:38 +0000 (14:36 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 29 Apr 2015 05:36:38 +0000 (14:36 +0900)
Change-Id: Ied38ad1fc078e82ec85aa8e00556f34970fc48fd

src/modules/ecore_evas/engines/drm/ecore_evas_drm.c

index e784f36..302c077 100644 (file)
@@ -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;
 }