e_plane: pending delete of renderer until all exported wl_buffer are destroyed 14/168914/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 31 Jan 2018 08:11:32 +0000 (17:11 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 1 Feb 2018 04:39:38 +0000 (13:39 +0900)
Change-Id: I359a081a3d28ba3e02f36dd637930ecccb2199eb

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

index 35f3e8c8bb6905ddfa1d84b4e779584d189ae534..d0133413c092a8b02620f4b46c98ae4c42b970d8 100644 (file)
@@ -113,20 +113,36 @@ _e_plane_surface_can_set(E_Plane *plane, tbm_surface_h tsurface)
    return EINA_TRUE;
 }
 
-static void
-_e_plane_renderer_unset(E_Plane *plane)
+EINTERN void
+e_plane_renderer_clean(E_Plane *plane)
 {
    Eina_List *data_l;
    E_Plane_Commit_Data *data = NULL;
 
+   EINA_SAFETY_ON_NULL_RETURN(plane);
+
    plane->display_info.renderer = NULL;
 
    EINA_LIST_FOREACH(plane->commit_data_list, data_l, data)
      data->renderer = NULL;
+}
 
-   if (plane->renderer)
-     e_plane_renderer_del(plane->renderer);
+EINTERN void
+e_plane_renderer_unset(E_Plane *plane)
+{
+   EINA_SAFETY_ON_NULL_RETURN(plane);
+
+   if (!plane->renderer) return;
+
+   if (plane->reserved_memory)
+     e_plane_renderer_reserved_deactivate(plane->renderer);
+   else
+     e_plane_renderer_deactivate(plane->renderer);
+
+   if (plane->renderer->exported_wl_buffer_count > 0) return;
 
+   e_plane_renderer_clean(plane);
+   e_plane_renderer_del(plane->renderer);
    plane->renderer = NULL;
 }
 
@@ -1642,7 +1658,7 @@ e_plane_free(E_Plane *plane)
      }
 
    if (plane->name) eina_stringshare_del(plane->name);
-   if (plane->renderer) _e_plane_renderer_unset(plane);
+   if (plane->renderer) e_plane_renderer_unset(plane);
    if (plane->ec) e_plane_ec_set(plane, NULL);
 
    free(plane);
@@ -1975,7 +1991,7 @@ _e_plane_fb_target_change(E_Plane *fb_target, E_Plane *plane)
    renderer = fb_target->renderer;
 
    if (plane->renderer)
-     _e_plane_renderer_unset(plane);
+     e_plane_renderer_unset(plane);
 
    renderer->plane = plane;
    plane->renderer = renderer;
@@ -2373,7 +2389,7 @@ e_plane_reserved_set(E_Plane *plane, Eina_Bool set)
                {
                   if (!plane->ec)
                     {
-                       _e_plane_renderer_unset(plane);
+                       e_plane_renderer_unset(plane);
                        e_plane_role_set(plane, E_PLANE_ROLE_NONE);
                     }
                }
@@ -2620,7 +2636,7 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
                     }
 
                   if ((plane->renderer) && (plane->role != E_PLANE_ROLE_OVERLAY))
-                    _e_plane_renderer_unset(plane);
+                    e_plane_renderer_unset(plane);
 
                   if (!plane->renderer)
                     plane->renderer = e_plane_renderer_new(plane);
@@ -2723,7 +2739,7 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
              if (plane->renderer)
                {
                   _e_plane_set_counter_reset(plane);
-                  _e_plane_renderer_unset(plane);
+                  e_plane_renderer_unset(plane);
                   e_plane_role_set(plane, E_PLANE_ROLE_NONE);
                }
           }
index 90c460262a85f2160d78aeebc67585da6e65bf52..3be50dff0cbf22df12bcec96ab7402cf7b9dd636 100644 (file)
@@ -199,6 +199,9 @@ EINTERN Eina_Bool            e_plane_external_fetch(E_Plane *plane);
 EINTERN Eina_Bool            e_plane_external_commit(E_Plane *plane);
 EINTERN Eina_Bool            e_plane_external_set(E_Plane *plane, Eina_Rectangle *rect, E_Output_Ext_State state);
 EINTERN void                 e_plane_external_unset(E_Plane *plane);
+EINTERN void                 e_plane_renderer_unset(E_Plane *plane);
+EINTERN void                 e_plane_renderer_clean(E_Plane *plane);
+
 
 E_API Eina_Bool              e_plane_type_set(E_Plane *plane, E_Plane_Type type);
 E_API E_Plane_Type           e_plane_type_get(E_Plane *plane);
index ebd13b95f8fc1540586da8a7a5f8a0a7a472e0b2..fedc65c674ae400b4ffaa30bb3b4a7846e85d55d 100644 (file)
@@ -806,20 +806,27 @@ _e_plane_renderer_surface_exported_surface_destroy_cb(tbm_surface_h tsurface, vo
    renderer = plane->renderer;
    if (!renderer) return;
 
-   renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
-   EINA_SAFETY_ON_NULL_RETURN(renderer_buffer);
+   if (renderer->exported_wl_buffer_count > 0) renderer->exported_wl_buffer_count--;
 
    if (renderer_trace_debug)
      ELOGF("E_PLANE_RENDERER", "Destroy Renderer(%p)        tsurface(%p) tqueue(%p)",
            NULL, NULL, renderer, tsurface, renderer->tqueue);
 
-   if (renderer->state != E_PLANE_RENDERER_STATE_PENDING_DEACTIVATE) return;
-
-   if (renderer_buffer->exported)
+   renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
+   if (renderer_buffer)
      {
-        if (!_e_plane_renderer_release_exported_renderer_buffer(renderer, renderer_buffer))
-          ERR("failed to _e_plane_renderer_release_exported_renderer_buffer");
+        if (renderer->state == E_PLANE_RENDERER_STATE_PENDING_DEACTIVATE)
+          {
+             if (renderer_buffer->exported)
+               {
+                  if (!_e_plane_renderer_release_exported_renderer_buffer(renderer, renderer_buffer))
+                    ERR("failed to _e_plane_renderer_release_exported_renderer_buffer");
+               }
+          }
      }
+
+   if (!plane->is_fb && !renderer->exported_wl_buffer_count && !renderer->ec)
+     e_plane_renderer_unset(plane);
 }
 
 static void
@@ -1299,6 +1306,7 @@ e_plane_renderer_ec_set(E_Plane_Renderer *renderer, E_Client *ec)
                   if (renderer->tqueue_width != ec->w || renderer->tqueue_height != ec->h)
                     {
                        /* recreate tqueue */
+                       e_plane_renderer_clean(plane);
                        e_plane_renderer_surface_queue_destroy(renderer);
 
                        tqueue = e_plane_renderer_surface_queue_create(renderer, ec->w, ec->h, plane->buffer_flags);
@@ -1409,20 +1417,7 @@ e_plane_renderer_del(E_Plane_Renderer *renderer)
      tbm_surface_queue_remove_destroy_cb(renderer->tqueue, _e_plane_renderer_cb_surface_queue_destroy, (void *)renderer);
 
    role = e_plane_role_get(plane);
-
-   if (role == E_PLANE_ROLE_OVERLAY)
-     {
-       if (plane->reserved_memory)
-         {
-            e_plane_renderer_reserved_deactivate(renderer);
-            e_plane_renderer_surface_queue_destroy(renderer);
-         }
-       else
-         {
-            e_plane_renderer_deactivate(renderer);
-         }
-     }
-   else if (role == E_PLANE_ROLE_CURSOR)
+   if (role == E_PLANE_ROLE_CURSOR)
      {
         if (ec)
           {
@@ -1435,6 +1430,16 @@ e_plane_renderer_del(E_Plane_Renderer *renderer)
         _e_plane_renderer_recover_ec(renderer);
         tbm_surface_destroy(renderer->cursor_tsurface);
      }
+   else
+     {
+        if (plane->reserved_memory)
+          {
+             e_plane_renderer_reserved_deactivate(renderer);
+             e_plane_renderer_surface_queue_destroy(renderer);
+          }
+        else
+          e_plane_renderer_deactivate(renderer);
+     }
 
    if (ec)
      {
@@ -2469,6 +2474,7 @@ e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surf
                 _e_plane_renderer_surface_exported_surface_destroy_cb,
                 (void *)plane);
 
+        renderer->exported_wl_buffer_count++;
         renderer->exported_surfaces = eina_list_append(renderer->exported_surfaces, tsurface);
 
         renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
index 9fdfa0c9fe31c9c92df9c8d23d6968769fee9b76..70a4691f7ecf0d2501ca2178019c15633443db18 100644 (file)
@@ -54,6 +54,8 @@ struct _E_Plane_Renderer {
    Eina_Bool           rendered;
 
    Eina_Bool           need_change_buffer_transform;
+
+   int                 exported_wl_buffer_count;
 };
 
 EINTERN Eina_Bool                  e_plane_renderer_init(void);