e_plane: use usable_buffer protocol for managing exported buffer 02/170502/1 sandbox/upgrade/efl120
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 20 Feb 2018 09:22:28 +0000 (18:22 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 20 Feb 2018 09:22:28 +0000 (18:22 +0900)
Change-Id: I232f0aaa42e64a5843e902a84058a85ceaeb97db

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

index d33a9890589b5404a5ae61e930190196361cdb1f..b28c4b91efdd687a738a5a812cfbf4a485a2a1e9 100644 (file)
@@ -524,7 +524,7 @@ _e_plane_surface_from_ecore_evas_acquire(E_Plane *plane)
 }
 
 static void
-_e_plane_surface_send_dequeuable_surfaces(E_Plane *plane)
+_e_plane_surface_send_usable_dequeuable_surfaces(E_Plane *plane)
 {
    tbm_surface_h tsurface = NULL;
    E_Plane_Renderer *renderer = plane->renderer;
@@ -542,7 +542,7 @@ _e_plane_surface_send_dequeuable_surfaces(E_Plane *plane)
              continue;
           }
 
-        e_plane_renderer_surface_send(renderer, renderer->ec, tsurface);
+        e_plane_renderer_surface_usable_send(renderer, renderer->ec, tsurface);
      }
 }
 
@@ -1894,7 +1894,7 @@ e_plane_commit_data_release(E_Plane_Commit_Data *data)
                   if (plane->ec)
                     {
                        e_plane_renderer_surface_queue_release(plane->display_info.renderer, plane->display_info.tsurface);
-                       _e_plane_surface_send_dequeuable_surfaces(plane);
+                       _e_plane_surface_send_usable_dequeuable_surfaces(plane);
                     }
                   else
                     {
@@ -2210,7 +2210,7 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
                goto set_fail;
 
              if (plane->reserved_memory)
-               _e_plane_surface_send_dequeuable_surfaces(plane);
+               _e_plane_surface_send_usable_dequeuable_surfaces(plane);
           }
 
         if (plane->is_fb)
index f633a81e2550b25191d107d07fbfe75e3707c4ee..89b8f9c305785e82ed5a11f23a076955c8496568 100644 (file)
@@ -44,6 +44,8 @@ struct _E_Plane_Renderer_Buffer
 
    Eina_Bool dequeued;
    Eina_Bool exported;
+   struct wl_resource *exported_wl_buffer;
+   Eina_Bool usable;
 };
 
 /* E_Plane is a child object of E_Output. There is one Output per screen
@@ -481,6 +483,8 @@ _e_plane_renderer_release_exported_renderer_buffer(E_Plane_Renderer *renderer, E
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer_buffer, EINA_FALSE);
 
    renderer_buffer->exported = EINA_FALSE;
+   renderer_buffer->exported_wl_buffer = NULL;
+   renderer_buffer->usable = EINA_FALSE;
    renderer_buffer->dequeued = EINA_FALSE;
 
    E_FREE_FUNC(renderer_buffer->release_timer, ecore_timer_del);
@@ -584,6 +588,8 @@ _e_plane_renderer_exported_surfaces_release(E_Plane_Renderer *renderer, Eina_Boo
         if (renderer->displaying_tsurface == tsurface)
           {
              renderer_buffer->exported = EINA_FALSE;
+             renderer_buffer->exported_wl_buffer = NULL;
+             renderer_buffer->usable = EINA_FALSE;
              renderer->exported_surfaces = eina_list_remove_list(renderer->exported_surfaces, l_s);
              continue;
           }
@@ -598,6 +604,8 @@ _e_plane_renderer_exported_surfaces_release(E_Plane_Renderer *renderer, Eina_Boo
           }
 
         renderer_buffer->exported = EINA_FALSE;
+        renderer_buffer->exported_wl_buffer = NULL;
+        renderer_buffer->usable = EINA_FALSE;
 
         e_plane_renderer_surface_queue_release(renderer, tsurface);
         renderer->exported_surfaces = eina_list_remove_list(renderer->exported_surfaces, l_s);
@@ -1619,6 +1627,21 @@ e_plane_renderer_deactivate(E_Plane_Renderer *renderer)
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_e_plane_renderer_all_disp_surfaces_send(E_Plane_Renderer *renderer, E_Client* ec)
+{
+   tbm_surface_h tsurface = NULL;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(renderer->disp_surfaces, l, tsurface)
+     {
+        if (!tsurface) continue;
+        e_plane_renderer_surface_send(renderer, ec, tsurface);
+     }
+
+   return EINA_TRUE;
+}
+
 EINTERN Eina_Bool
 e_plane_renderer_reserved_activate(E_Plane_Renderer *renderer, E_Client *ec)
 {
@@ -1696,6 +1719,12 @@ e_plane_renderer_reserved_activate(E_Plane_Renderer *renderer, E_Client *ec)
              return EINA_FALSE;
           }
 
+        if (!_e_plane_renderer_all_disp_surfaces_send(renderer, ec))
+          {
+             ERR("Failed to _e_plane_renderer_all_disp_surfaces_send ec:%p", ec);
+             return EINA_FALSE;
+          }
+
         /* dequeue */
         tsurface = e_plane_renderer_surface_queue_dequeue(renderer);
         if (!tsurface)
@@ -1705,7 +1734,7 @@ e_plane_renderer_reserved_activate(E_Plane_Renderer *renderer, E_Client *ec)
           }
 
         /* export */
-        e_plane_renderer_surface_send(renderer, ec, tsurface);
+        e_plane_renderer_surface_usable_send(renderer, ec, tsurface);
 
         if (renderer->ec != ec)
           renderer->need_change_buffer_transform = EINA_TRUE;
@@ -2378,6 +2407,40 @@ e_plane_renderer_sent_surface_recevie(E_Plane_Renderer *renderer, tbm_surface_h
      }
 }
 
+EINTERN Eina_Bool
+e_plane_renderer_surface_usable_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surface_h tsurface)
+{
+   struct wayland_tbm_client_queue * cqueue = NULL;
+   E_Plane_Renderer_Buffer *renderer_buffer = NULL;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tsurface, EINA_FALSE);
+
+   cqueue = _e_plane_renderer_wayland_tbm_client_queue_get(ec);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cqueue, EINA_FALSE);
+
+   renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(renderer_buffer, EINA_FALSE);
+
+   if (!renderer_buffer->exported || !renderer_buffer->exported_wl_buffer)
+     {
+        ERR("Not exported tsurface:%p", tsurface);
+        return EINA_FALSE;
+     }
+
+   if (renderer_buffer->usable) return EINA_TRUE;
+
+   wayland_tbm_server_client_queue_send_buffer_usable(cqueue, renderer_buffer->exported_wl_buffer);
+   renderer_buffer->usable = EINA_TRUE;
+
+   if (renderer_trace_debug)
+   ELOGF("E_PLANE_RENDERER", "Usable  Renderer(%p)        tsurface(%p) tqueue(%p) wl_buffer(%p)",
+         ec->pixmap, ec, renderer, tsurface, renderer->tqueue, renderer_buffer->exported_wl_buffer);
+
+   return EINA_TRUE;
+}
+
 EINTERN void
 e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surface_h tsurface)
 {
@@ -2402,6 +2465,9 @@ e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surf
 
    if (!_e_plane_renderer_surface_find_exported_surface(renderer, tsurface))
      {
+        renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
+        EINA_SAFETY_ON_NULL_RETURN(renderer_buffer);
+
         /* export the tbm_surface(wl_buffer) to the client_queue */
         wl_buffer = wayland_tbm_server_client_queue_export_buffer2(cqueue, tsurface,
                 E_PLANE_RENDERER_CLIENT_SURFACE_FLAGS_RESERVED,
@@ -2411,13 +2477,12 @@ e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surf
 
         renderer->exported_surfaces = eina_list_append(renderer->exported_surfaces, tsurface);
 
-        renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
-        if (renderer_buffer)
-          renderer_buffer->exported = EINA_TRUE;
-
         if (!_e_plane_renderer_client_exported_surface_find(renderer_client, tsurface))
           renderer_client->exported_surfaces = eina_list_append(renderer_client->exported_surfaces, tsurface);
 
+        renderer_buffer->exported = EINA_TRUE;
+        renderer_buffer->exported_wl_buffer = wl_buffer;
+
         if (wl_buffer && renderer_trace_debug)
           ELOGF("E_PLANE_RENDERER", "Export  Renderer(%p)        tsurface(%p) tqueue(%p) wl_buffer(%p)",
                 ec->pixmap, ec, renderer, tsurface, renderer->tqueue, wl_buffer);
index ce5c1f2e4f5bd4d44df867f85343081f575c42c0..3118c04dec2cfac3a78a584b11edce5a8fed59ca 100644 (file)
@@ -90,6 +90,7 @@ EINTERN Eina_Bool                  e_plane_renderer_surface_queue_can_dequeue(E_
 EINTERN tbm_surface_h              e_plane_renderer_surface_queue_dequeue(E_Plane_Renderer *renderer);
 EINTERN Eina_Bool                  e_plane_renderer_surface_queue_clear(E_Plane_Renderer *renderer);
 EINTERN void                       e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surface_h tsurface);
+EINTERN Eina_Bool                  e_plane_renderer_surface_usable_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surface_h tsurface);
 EINTERN Eina_Bool                  e_plane_renderer_ec_set(E_Plane_Renderer *renderer, E_Client *ec);
 EINTERN Eina_Bool                  e_plane_renderer_cursor_ec_set(E_Plane_Renderer *renderer, E_Client *ec);
 EINTERN tbm_surface_h              e_plane_renderer_cursor_surface_get(E_Plane_Renderer *renderer);