e_plane: prevent same tbm_surface is set at various layer 38/144038/3 submit/tizen/20170815.115518
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 14 Aug 2017 10:47:30 +0000 (19:47 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 15 Aug 2017 10:21:13 +0000 (10:21 +0000)
Change-Id: I9949483809a22704edc75650dd4e4427d4fcfff2

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

index fd6f44409cac90f55282baaa2fa2825a1d6d269f..b46a30e262e7b3fd7da67e11d416724f248bb716 100644 (file)
@@ -1697,6 +1697,19 @@ e_output_commit(E_Output *output)
                }
           }
 
+        EINA_LIST_FOREACH(output->planes, l, plane)
+          {
+             if (e_plane_is_fetch_retry(plane))
+               {
+                 if (!e_plane_fetch(plane)) continue;
+                 if (e_plane_is_fb_target(plane))
+                   {
+                      fb_commit = EINA_TRUE;
+                      _e_output_update_fps();
+                   }
+               }
+          }
+
         /* zoom commit only primary */
         if (!fb_commit) return EINA_TRUE;
 
@@ -1743,6 +1756,19 @@ e_output_commit(E_Output *output)
                e_plane_unset_try_set(plane, EINA_FALSE);
           }
 
+        EINA_LIST_FOREACH(output->planes, l, plane)
+          {
+             if (e_plane_is_fetch_retry(plane))
+               {
+                 if (!e_plane_fetch(plane)) continue;
+                 if (e_plane_is_fb_target(plane))
+                   {
+                      fb_commit = EINA_TRUE;
+                      _e_output_update_fps();
+                   }
+               }
+          }
+
         EINA_LIST_FOREACH(output->planes, l, plane)
           {
              if (e_plane_is_unset_try(plane)) continue;
index b8429af268d56fda7636f142dbd8a65bab487480..141debd854b80e70ad7f17ce0c7514ff09e70a98 100644 (file)
@@ -113,6 +113,31 @@ _get_tbm_surface_queue(E_Comp *e_comp)
    return tbm_queue;
 }
 
+static Eina_Bool
+_e_plane_surface_can_set(E_Plane *plane, tbm_surface_h tsurface)
+{
+   E_Output *output = NULL;
+   E_Plane *tmp_plane = NULL;
+   Eina_List *l;
+
+   output = plane->output;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+
+   EINA_LIST_FOREACH(output->planes, l, tmp_plane)
+     {
+        if (tmp_plane->tsurface == tsurface)
+          {
+             if (plane_trace_debug)
+               ELOGF("E_PLANE", "Used    Plane(%p) zpos(%d) tsurface(%p)",
+                      NULL, NULL, tmp_plane, tmp_plane->zpos, tsurface);
+
+             return EINA_FALSE;
+          }
+     }
+
+   return EINA_TRUE;
+}
+
 static void
 _e_plane_renderer_unset(E_Plane *plane)
 {
@@ -354,6 +379,24 @@ _e_plane_surface_set(E_Plane *plane, tbm_surface_h tsurface)
    return EINA_TRUE;
 }
 
+static void
+_e_plane_surface_cancel_acquire(E_Plane *plane, tbm_surface_h tsurface)
+{
+   E_Client *ec = plane->ec;
+   E_Plane_Renderer *renderer = plane->renderer;
+
+   if ((plane->is_fb && !plane->ec) ||
+       (plane->ec && plane->role == E_PLANE_ROLE_OVERLAY && plane->is_reserved))
+     {
+        if (!e_plane_renderer_surface_queue_cancel_acquire(renderer, tsurface))
+          ERR("fail to e_plane_renderer_surface_queue_cancel_acquire");
+     }
+
+   if (ec) e_comp_object_hwc_update_set(ec->frame, EINA_TRUE);
+
+   return;
+}
+
 static tbm_surface_h
 _e_plane_surface_from_client_acquire_reserved(E_Plane *plane)
 {
@@ -1206,6 +1249,14 @@ e_plane_render(E_Plane *plane)
    return EINA_TRUE;
 }
 
+EINTERN Eina_Bool
+e_plane_is_fetch_retry(E_Plane *plane)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(plane, EINA_FALSE);
+
+   return plane->fetch_retry;
+}
+
 EINTERN Eina_Bool
 e_plane_fetch(E_Plane *plane)
 {
@@ -1260,6 +1311,16 @@ e_plane_fetch(E_Plane *plane)
    /* exist tsurface for update plane */
    if (tsurface)
      {
+        if (!_e_plane_surface_can_set(plane, tsurface))
+          {
+             _e_plane_surface_cancel_acquire(plane, tsurface);
+             plane->fetch_retry = EINA_TRUE;
+
+             return EINA_FALSE;
+          }
+
+        if (plane->fetch_retry) plane->fetch_retry = EINA_FALSE;
+
         plane->tsurface = tsurface;
 
         /* set plane info and set tsurface to the plane */
index 3f9daef54689dbb1fb4112b9741ee329a620d677..53076f6a0a8801c3ab0a5315430930b93e55cfe3 100644 (file)
@@ -75,6 +75,8 @@ struct _E_Plane
    Eina_Bool             is_video;
    Eina_Bool             reserved_video;
 
+   Eina_Bool             fetch_retry;
+
    E_Plane              *fb_change;
    int                   fb_change_counter;
 
@@ -166,6 +168,7 @@ EINTERN Eina_Bool            e_plane_is_unset_candidate(E_Plane *plane);
 EINTERN Eina_Bool            e_plane_is_unset_try(E_Plane *plane);
 EINTERN void                 e_plane_unset_try_set(E_Plane *plane, Eina_Bool set);
 EINTERN Eina_Bool            e_plane_unset_commit_check(E_Plane *plane, Eina_Bool fb_commit);
+EINTERN Eina_Bool            e_plane_is_fetch_retry(E_Plane *plane);
 EINTERN Eina_Bool            e_plane_fb_target_set(E_Plane *plane, Eina_Bool set);
 EINTERN Eina_List           *e_plane_available_tbm_formats_get(E_Plane *plane);
 EINTERN Eina_Bool            e_plane_pp_commit(E_Plane *plane);
index 53c6eb479572fc8e030cd9f4cc11d8b91e48d347..64457e2349487f030b567f87a2a0bc589eaff4a4 100644 (file)
@@ -2128,6 +2128,36 @@ e_plane_renderer_surface_queue_enqueue(E_Plane_Renderer *renderer, tbm_surface_h
    return EINA_TRUE;
 }
 
+EINTERN Eina_Bool
+e_plane_renderer_surface_queue_cancel_acquire(E_Plane_Renderer *renderer, tbm_surface_h tsurface)
+{
+   tbm_surface_queue_h tqueue = NULL;
+   tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tsurface, EINA_FALSE);
+
+   tqueue = renderer->tqueue;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tqueue, EINA_FALSE);
+
+   /* debug */
+   if (renderer_trace_debug)
+    {
+        E_Client *ec = renderer->ec;
+        ELOGF("E_PLANE_RENDERER", "Cancel Acquire Renderer(%p)  tsurface(%p) tqueue(%p) wl_buffer(%p) ",
+              ec->pixmap, ec, renderer, tsurface, renderer->tqueue, _get_wl_buffer(ec));
+    }
+
+   tsq_err = tbm_surface_queue_cancel_acquire(tqueue, tsurface);
+   if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+     {
+        ERR("tbm_surface_queue_cancel_acquire failed. tbm_surface_queue(%p) tbm_surface(%p)", tqueue, tsurface);
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
 EINTERN Eina_Bool
 e_plane_renderer_surface_queue_can_dequeue(E_Plane_Renderer *renderer)
 {
index 494ffee1a978b5d572e3ec52942ff0c563c06cfa..f0fae5a0cbbf012e32d80ee712dacf3ae150bf85 100644 (file)
@@ -79,6 +79,7 @@ EINTERN tbm_surface_queue_h        e_plane_renderer_surface_queue_create(E_Plane
 EINTERN Eina_Bool                  e_plane_renderer_surface_queue_set(E_Plane_Renderer *renderer, tbm_surface_queue_h tqueue);
 EINTERN void                       e_plane_renderer_surface_queue_destroy(E_Plane_Renderer *renderer);
 EINTERN tbm_surface_h              e_plane_renderer_surface_queue_acquire(E_Plane_Renderer *renderer);
+EINTERN Eina_Bool                  e_plane_renderer_surface_queue_cancel_acquire(E_Plane_Renderer *renderer, tbm_surface_h tsurface);
 EINTERN void                       e_plane_renderer_surface_queue_release(E_Plane_Renderer *renderer, tbm_surface_h tsurface);
 EINTERN Eina_Bool                  e_plane_renderer_surface_queue_enqueue(E_Plane_Renderer *renderer, tbm_surface_h tsurface);
 EINTERN Eina_Bool                  e_plane_renderer_surface_queue_can_dequeue(E_Plane_Renderer *renderer);