zoom patch: use zoom_pending_commit list to avoid set buffer commit fail
authorJunkyeong Kim <jk0430.kim@samsung.com>
Mon, 19 Jun 2017 08:34:12 +0000 (17:34 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 26 Jun 2017 08:29:52 +0000 (17:29 +0900)
Change-Id: I5b2c057fc188447aaf328a71d6ff4b1a05f28b8c
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
fix

Change-Id: Iebab751d0df1e97b7636bf3c826b814669aba877

src/bin/e_plane.c
src/bin/e_plane.h

index 947d245bd4d27d11f668f5d89526556d2c46f4cf..bd006d5de0ab2592c983a3cc6485d9dceeb32a59 100644 (file)
@@ -24,6 +24,7 @@ static E_Client_Hook *client_hook_new = NULL;
 static E_Client_Hook *client_hook_del = NULL;
 static const char *_e_plane_ec_last_err = NULL;
 static Eina_Bool plane_trace_debug = 0;
+static void _e_plane_zoom_pending_commit(E_Plane *plane);
 static void _e_plane_zoom_pending_data_pp(E_Plane *plane);
 
 E_API int E_EVENT_PLANE_WIN_CHANGE = -1;
@@ -976,7 +977,8 @@ e_plane_commit(E_Plane *plane)
                        plane->zoom_tsurface = NULL;
                     }
 
-                  if ((eina_list_count(plane->pending_pp_zoom_data_list) == 0) &&
+                  if ((eina_list_count(plane->pending_commit_zoom_data_list) == 0) &&
+                      (eina_list_count(plane->pending_pp_zoom_data_list) == 0) &&
                       (eina_list_count(plane->zoom_data_list) == 0))
                     {
                        _e_plane_zoom_destroy(plane);
@@ -1639,15 +1641,15 @@ _e_plane_zoom_set_pp_info(E_Plane *plane)
 }
 
 static void
-_e_plane_zoom_commit_data_release(E_Plane_Pp_Data *data)
+_e_plane_zoom_commit_data_release(E_Plane_Pp_Data *pp_data)
 {
    E_Plane *plane = NULL;
    tbm_surface_h zoom_tsurface = NULL;
 
-   EINA_SAFETY_ON_NULL_RETURN(data);
+   EINA_SAFETY_ON_NULL_RETURN(pp_data);
 
-   plane = data->plane;
-   zoom_tsurface = data->zoom_tsurface;
+   plane = pp_data->plane;
+   zoom_tsurface = pp_data->zoom_tsurface;
 
    if (plane->zoom_tsurface)
      {
@@ -1657,9 +1659,14 @@ _e_plane_zoom_commit_data_release(E_Plane_Pp_Data *data)
      }
    plane->zoom_tsurface = zoom_tsurface;
 
-   plane->zoom_data_list = eina_list_remove(plane->zoom_data_list, data);
+   plane->zoom_data_list = eina_list_remove(plane->zoom_data_list, pp_data);
 
-   free(data);
+   free(pp_data);
+
+   if (eina_list_count(plane->pending_commit_zoom_data_list) != 0)
+     _e_plane_zoom_pending_commit(plane);
+   else
+     plane->zoom_commit = EINA_FALSE;
 
    if (eina_list_count(plane->pending_pp_zoom_data_list) != 0)
      _e_plane_zoom_pending_data_pp(plane);
@@ -1670,13 +1677,13 @@ _e_plane_zoom_commit_handler(tdm_layer *layer, unsigned int sequence,
                                   unsigned int tv_sec, unsigned int tv_usec,
                                   void *user_data)
 {
-   E_Plane_Pp_Data *data = (E_Plane_Pp_Data *)user_data;
+   E_Plane_Pp_Data *pp_data = (E_Plane_Pp_Data *)user_data;
 
-   EINA_SAFETY_ON_NULL_RETURN(data);
+   EINA_SAFETY_ON_NULL_RETURN(pp_data);
 
    TRACE_DS_ASYNC_END((unsigned int)layer, [PLANE:COMMIT~HANDLER]);
 
-   _e_plane_zoom_commit_data_release(data);
+   _e_plane_zoom_commit_data_release(pp_data);
 }
 
 static void
@@ -1790,6 +1797,17 @@ _e_plane_zoom_pp_cb(tdm_pp *pp, tbm_surface_h tsurface_src, tbm_surface_h tsurfa
         return;
      }
 
+   pp_data->zoom_tsurface = zoom_tsurface;
+   pp_data->plane = plane;
+
+   if (plane->zoom_commit)
+     {
+        plane->pending_commit_zoom_data_list = eina_list_append(plane->pending_commit_zoom_data_list, pp_data);
+        return;
+     }
+
+   plane->zoom_commit = EINA_TRUE;
+
    tdm_err = tdm_layer_set_buffer(tlayer, zoom_tsurface);
    if (tdm_err != TDM_ERROR_NONE)
      {
@@ -1798,9 +1816,6 @@ _e_plane_zoom_pp_cb(tdm_pp *pp, tbm_surface_h tsurface_src, tbm_surface_h tsurfa
         return;
      }
 
-   pp_data->zoom_tsurface = zoom_tsurface;
-   pp_data->plane = plane;
-
    tdm_err = tdm_layer_commit(tlayer, _e_plane_zoom_commit_handler, pp_data);
    if (tdm_err != TDM_ERROR_NONE)
      {
@@ -1812,11 +1827,66 @@ _e_plane_zoom_pp_cb(tdm_pp *pp, tbm_surface_h tsurface_src, tbm_surface_h tsurfa
    return;
 }
 
+static void
+_e_plane_zoom_pending_commit(E_Plane *plane)
+{
+   tbm_surface_h zoom_tsurface = NULL;
+   tdm_error tdm_err = TDM_ERROR_NONE;
+   tdm_layer *tlayer = NULL;
+   E_Plane_Pp_Data *pp_data = NULL;
+   Eina_List *l, *ll;
+
+   EINA_SAFETY_ON_NULL_RETURN(plane);
+
+   if (plane->zoom_unset)
+     {
+        EINA_LIST_FOREACH_SAFE(plane->pending_commit_zoom_data_list, l, ll, pp_data)
+          {
+             if (!pp_data) continue;
+
+             plane->pending_commit_zoom_data_list = eina_list_remove_list(plane->pending_commit_zoom_data_list, l);
+
+             _e_plane_zoom_commit_data_release(pp_data);
+          }
+
+        return;
+     }
+
+   pp_data = NULL;
+   pp_data = eina_list_nth(plane->pending_commit_zoom_data_list, 0);
+   if (!pp_data)
+     {
+        ERR("_e_plane_zoom_pending_commit: fail E_Plane_Pp_Data get");
+        return;
+     }
+   plane->pending_commit_zoom_data_list = eina_list_remove(plane->pending_commit_zoom_data_list, pp_data);
+
+   zoom_tsurface = pp_data->zoom_tsurface;
+   tlayer = plane->tlayer;
+
+   tdm_err = tdm_layer_set_buffer(tlayer, zoom_tsurface);
+   if (tdm_err != TDM_ERROR_NONE)
+     {
+        ERR("_e_plane_zoom_pending_commit: fail to tdm_layer_set_buffer");
+        _e_plane_zoom_commit_data_release(pp_data);
+        return;
+     }
+
+   tdm_err = tdm_layer_commit(tlayer, _e_plane_zoom_commit_handler, pp_data);
+   if (tdm_err != TDM_ERROR_NONE)
+     {
+        ERR("_e_plane_zoom_pending_commit: fail to tdm_layer_commit plane:%p, zpos:%d", plane, plane->zpos);
+        _e_plane_zoom_commit_data_release(pp_data);
+        return;
+     }
+
+   return;
+}
+
 static void
 _e_plane_zoom_pending_data_pp(E_Plane *plane)
 {
    tdm_info_pp pp_info;
-   tdm_error ret = TDM_ERROR_NONE;
    tbm_surface_h tsurface = plane->tsurface;
    tbm_surface_info_s surf_info;
    int dst_w, dst_h;
index 314a48f0d14c0167500a0813b805d8438b5ade4a..7abd3d07d1c082be20c4b4e405c7096835d5ba17 100644 (file)
@@ -83,11 +83,13 @@ struct _E_Plane
    tdm_pp               *tpp;
    Eina_List            *zoom_data_list;
    Eina_List            *pending_pp_zoom_data_list;
+   Eina_List            *pending_commit_zoom_data_list;
    tbm_surface_queue_h   zoom_tqueue;
    tbm_surface_h         zoom_tsurface;
    Eina_Rectangle        zoom_rect;
    Eina_Rectangle        zoom_rect_temp;
    Eina_Bool             zoom_unset;
+   Eina_Bool             zoom_commit;
 
    /* current display information */
    struct
@@ -97,15 +99,6 @@ struct _E_Plane
       E_Plane_Renderer     *renderer;
       E_Client             *ec;
    } display_info;
-
-   /* for zoom */
-   tdm_pp               *tpp;
-   Eina_List            *pending_commit_zoom_data_list;
-   tbm_surface_queue_h   zoom_tqueue;
-   tbm_surface_h         zoom_tsurface;
-   Eina_Rectangle        zoom_rect;
-   Eina_Rectangle        zoom_rect_temp;
-   Eina_Bool             zoom_unset;
 };
 
 struct _E_Plane_Commit_Data {