e_plane: delay release exported surface to queue when hwc mode is changed. 26/114026/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 9 Feb 2017 13:10:30 +0000 (22:10 +0900)
committerJuyeon Lee <juyeonne.lee@samsung.com>
Fri, 10 Feb 2017 03:37:46 +0000 (19:37 -0800)
- always clear queue even if hwc client doens't have update.
- release last exported surface when mode_change_age is more than 2.

Change-Id: Id4b781f9ff283370e4e78d0752ac760f0e6aa1b9

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

index 83d98a9..b29dbf2 100644 (file)
@@ -318,6 +318,9 @@ _e_plane_surface_from_client_acquire_reserved(E_Plane *plane)
    renderer_client = e_plane_renderer_client_get(ec);
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer_client, NULL);
 
+   if (!e_plane_renderer_surface_queue_clear(renderer))
+      ERR("fail to e_plane_renderer_surface_queue_clear");
+
    if (e_comp_object_hwc_update_exists(ec->frame))
      {
         e_comp_object_hwc_update_set(ec->frame, EINA_FALSE);
@@ -325,9 +328,6 @@ _e_plane_surface_from_client_acquire_reserved(E_Plane *plane)
         if (plane_trace_debug)
            ELOGF("E_PLANE", "Plane:%p Display Client", ec->pixmap, ec, plane);
 
-        if (!e_plane_renderer_surface_queue_clear(renderer))
-           ERR("fail to e_plane_renderer_surface_queue_clear");
-
         /* acquire the surface from the client_queue */
         tsurface = e_plane_renderer_client_surface_recieve(renderer_client);
         if (!tsurface)
@@ -996,16 +996,16 @@ e_plane_commit_data_release(E_Plane_Commit_Data *data)
           {
              if (displaying_tsurface)
                {
-                  e_plane_renderer_surface_queue_release(plane->renderer, displaying_tsurface);
-
                   if (plane->ec)
                     {
+                       e_plane_renderer_surface_queue_release(plane->renderer, displaying_tsurface);
                        _e_plane_surface_on_client_reserved_release(plane, displaying_tsurface);
                        _e_plane_surface_send_dequeuable_surfaces(plane);
                     }
                   else
                     {
                        e_plane_renderer_sent_surface_recevie(plane->renderer, displaying_tsurface);
+                       e_plane_renderer_surface_queue_release(plane->renderer, displaying_tsurface);
                     }
                }
           }
@@ -1037,16 +1037,16 @@ e_plane_commit_data_release(E_Plane_Commit_Data *data)
                  /* release */
                  if (displaying_tsurface)
                    {
-                      e_plane_renderer_surface_queue_release(plane->renderer, displaying_tsurface);
-
                       if (plane->ec)
                         {
+                           e_plane_renderer_surface_queue_release(plane->renderer, displaying_tsurface);
                            _e_plane_surface_on_client_reserved_release(plane, displaying_tsurface);
                            _e_plane_surface_send_dequeuable_surfaces(plane);
                         }
                       else
                         {
                            e_plane_renderer_sent_surface_recevie(plane->renderer, displaying_tsurface);
+                           e_plane_renderer_surface_queue_release(plane->renderer, displaying_tsurface);
                         }
                    }
                }
index 851895f..b52eecd 100644 (file)
@@ -395,25 +395,27 @@ _e_plane_renderer_client_exported_surfaces_release(E_Plane_Renderer_Client *rend
 
    if (renderer->state == E_PLANE_RENDERER_STATE_CANDIDATE)
      {
-        EINA_LIST_FOREACH_SAFE(renderer_client->exported_surfaces, l_s, ll_s, tsurface)
-          {
-             if (!tsurface) continue;
-
-             renderer_client->exported_surfaces = eina_list_remove_list(renderer_client->exported_surfaces, l_s);
-          }
+        renderer_client->exported_surfaces = eina_list_free(renderer_client->exported_surfaces);
      }
    else
      {
-        EINA_LIST_FOREACH_SAFE(renderer_client->exported_surfaces, l_s, ll_s, tsurface)
+        if (eina_list_count(renderer_client->exported_surfaces) < 3)
+          {
+             renderer_client->exported_surfaces = eina_list_free(renderer_client->exported_surfaces);
+          }
+        else
           {
-             if (!tsurface) continue;
+             EINA_LIST_FOREACH_SAFE(renderer_client->exported_surfaces, l_s, ll_s, tsurface)
+               {
+                  if (!tsurface) continue;
 
-             renderer_client->exported_surfaces = eina_list_remove_list(renderer_client->exported_surfaces, l_s);
+                  renderer_client->exported_surfaces = eina_list_remove_list(renderer_client->exported_surfaces, l_s);
 
-             if (plane->pending_commit) continue;
+                  if (plane->pending_commit) continue;
 
-             if (tsurface == renderer->previous_tsurface)
-                _e_plane_renderer_exported_surface_release(renderer, tsurface);
+                  if (tsurface == renderer->previous_tsurface)
+                     _e_plane_renderer_exported_surface_release(renderer, tsurface);
+               }
           }
      }
 }
@@ -1173,6 +1175,7 @@ done:
 
    renderer->state = E_PLANE_RENDERER_STATE_NONE;
    renderer->ec = NULL;
+   renderer->mode_change_age = 0;
 
    renderer_client->state = E_PLANE_RENDERER_CLIENT_STATE_NONE;
    renderer_client->renderer = NULL;
@@ -1608,6 +1611,14 @@ e_plane_renderer_sent_surface_recevie(E_Plane_Renderer *renderer, tbm_surface_h
 
    if (renderer->state != E_PLANE_RENDERER_STATE_NONE) return;
 
+   if (renderer->mode_change_age < 2)
+      renderer->mode_change_age++;
+
+   if (_e_plane_renderer_surface_find_exported_surface(renderer, tsurface))
+      renderer->exported_surfaces = eina_list_remove(renderer->exported_surfaces, tsurface);
+
+   if (renderer->mode_change_age < 2) return;
+
    EINA_LIST_FOREACH_SAFE(renderer->exported_surfaces, l_s, ll_s, tmp_tsurface)
      {
         if (!tmp_tsurface) continue;
index 8782a51..c4a32b8 100644 (file)
@@ -45,6 +45,7 @@ struct _E_Plane_Renderer {
 
    Ecore_Fd_Handler   *event_hdlr;
    int                 event_fd;
+   int                 mode_change_age;
 };
 
 EINTERN Eina_Bool                  e_plane_renderer_init(void);