e_plane: set redireted/unredirect when ec is set/unset to plane.
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 22 Jun 2017 08:53:05 +0000 (17:53 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 5 Jul 2017 02:57:19 +0000 (11:57 +0900)
if ec is already unredirected before plane set ec, e_plane_renderer don't
force update when create backup buffer.

Change-Id: Icd2bdf983fdddba18e5021a141ef7b1036b6d044

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

index 1c04132..69e916f 100644 (file)
@@ -234,16 +234,6 @@ _hwc_set(E_Output *eout)
    EINA_SAFETY_ON_NULL_RETURN_VAL(eout, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(eout->planes, EINA_FALSE);
 
-   EINA_LIST_FOREACH(eout->planes, l, ep)
-     {
-        if (!e_comp->hwc_use_multi_plane &&
-            !e_plane_is_cursor(ep) &&
-            !e_plane_is_fb_target(ep))
-          continue;
-
-        if (ep->ec) e_client_redirected_set(ep->ec, 1);
-     }
-
    ep_l = e_output_planes_get(eout);
    EINA_LIST_REVERSE_FOREACH(ep_l, l , ep)
      {
@@ -257,7 +247,6 @@ _hwc_set(E_Output *eout)
                   if (set)
                     {
                        ELOGF("HWC", "is set on fb_target( %d)", ep->prepare_ec->pixmap, ep->prepare_ec, ep->zpos);
-                       e_client_redirected_set(ep->prepare_ec, 0);
                        mode = E_HWC_MODE_FULL;
 
                        // fb target is occupied by a client surface, means compositor disabled
@@ -272,7 +261,6 @@ _hwc_set(E_Output *eout)
              if (set)
                {
                   ELOGF("HWC", "is set on %d", ep->prepare_ec->pixmap, ep->prepare_ec, ep->zpos);
-                  e_client_redirected_set(ep->prepare_ec, 0);
                   mode |= E_HWC_MODE_HYBRID;
                }
              else
@@ -512,7 +500,6 @@ _hwc_cancel(E_Output *eout)
              continue;
           }
 
-        if (ep->ec) e_client_redirected_set(ep->ec, 1);
         e_plane_ec_prepare_set(ep, NULL);
         e_plane_ec_set(ep, NULL);
      }
@@ -553,7 +540,6 @@ _hwc_plane_unset(E_Plane *ep)
    if (e_plane_is_reserved(ep))
      e_plane_reserved_set(ep, 0);
 
-   if (ep->ec) e_client_redirected_set(ep->ec, 1);
    e_plane_ec_prepare_set(ep, NULL);
    e_plane_ec_set(ep, NULL);
 
@@ -571,7 +557,6 @@ _hwc_plane_change_ec(E_Plane *ep, E_Client *old_ec, E_Client *new_ec)
           e_plane_reserved_set(ep, 0);
      }
 
-   if (ep->ec) e_client_redirected_set(ep->ec, 1);
    e_plane_ec_prepare_set(ep, NULL);
 
    if (e_plane_ec_set(ep, new_ec))
@@ -581,8 +566,6 @@ _hwc_plane_change_ec(E_Plane *ep, E_Client *old_ec, E_Client *new_ec)
              ELOGF("HWC", "new_ec(%s) is set on %d",
                    new_ec->pixmap, new_ec,
                    e_client_util_name_get(new_ec) ? new_ec->icccm.name : "no name", ep->zpos);
-
-             e_client_redirected_set(new_ec, 0);
           }
         else
           {
index 2483ba4..6de5e11 100644 (file)
@@ -1279,6 +1279,12 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
      {
         if (plane->ec == ec) return EINA_TRUE;
 
+        if (plane->ec_redirected)
+          {
+             if (plane->ec) e_client_redirected_set(plane->ec, EINA_TRUE);
+             plane->ec_redirected = EINA_FALSE;
+          }
+
         if (plane->reserved_memory)
           e_plane_reserved_set(plane, EINA_TRUE);
 
@@ -1331,6 +1337,9 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
         if (!plane->is_fb) _e_plane_unset_reset(plane);
 
         e_comp_object_hwc_update_set(ec->frame, EINA_TRUE);
+
+        if (ec->redirected) plane->ec_redirected = EINA_TRUE;
+        e_client_redirected_set(ec, EINA_FALSE);
      }
    else
      {
@@ -1365,6 +1374,12 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
                   e_plane_role_set(plane, E_PLANE_ROLE_NONE);
                }
           }
+
+        if (plane->ec_redirected)
+          {
+             if (plane->ec) e_client_redirected_set(plane->ec, EINA_TRUE);
+             plane->ec_redirected = EINA_FALSE;
+          }
      }
 
    plane->ec = ec;
index 0410a31..b37f6db 100644 (file)
@@ -50,6 +50,7 @@ struct _E_Plane
 
    E_Client             *ec;
    E_Client             *prepare_ec;
+   Eina_Bool             ec_redirected;
 
    Eina_Bool             reserved_memory;
 
index 16909d1..1dc6a38 100644 (file)
@@ -861,6 +861,7 @@ _e_plane_renderer_client_ec_buffer_change_cb(void *data, int type, void *event)
 static void
 _e_plane_renderer_recover_ec(E_Plane_Renderer *renderer)
 {
+   E_Plane *plane = renderer->plane;
    E_Client *ec = renderer->ec;
    E_Comp_Wl_Client_Data *cdata = NULL;
    E_Comp_Wl_Buffer *buffer = NULL;
@@ -891,11 +892,14 @@ _e_plane_renderer_recover_ec(E_Plane_Renderer *renderer)
    e_pixmap_resource_set(ec->pixmap, buffer);
    e_pixmap_dirty(ec->pixmap);
    e_pixmap_refresh(ec->pixmap);
-   e_pixmap_image_refresh(ec->pixmap);
 
-   e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
-   e_comp_object_dirty(ec->frame);
-   e_comp_object_render(ec->frame);
+   if (plane->ec_redirected)
+     {
+        e_pixmap_image_refresh(ec->pixmap);
+        e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
+        e_comp_object_dirty(ec->frame);
+        e_comp_object_render(ec->frame);
+     }
 
    return;
 }
@@ -1585,9 +1589,13 @@ e_plane_renderer_reserved_deactivate(E_Plane_Renderer *renderer)
    E_Client *ec = NULL;
    E_Plane_Renderer_Client *renderer_client = NULL;
    tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
+   E_Plane *plane = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
 
+   plane = renderer->plane;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(plane, EINA_FALSE);
+
    ec = renderer->ec;
    if (!ec) return EINA_TRUE;
 
@@ -1615,12 +1623,14 @@ e_plane_renderer_reserved_deactivate(E_Plane_Renderer *renderer)
    if (!_e_plane_renderer_client_backup_buffer_set(renderer_client))
        ERR("fail to _e_comp_hwc_set_backup_buffer");
 
-   /* force update */
-   e_pixmap_image_refresh(ec->pixmap);
-   e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
-   e_comp_object_dirty(ec->frame);
-   e_comp_object_render(ec->frame);
-
+   if (plane->ec_redirected)
+     {
+        /* force update */
+        e_pixmap_image_refresh(ec->pixmap);
+        e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
+        e_comp_object_dirty(ec->frame);
+        e_comp_object_render(ec->frame);
+     }
 done:
    if (e_comp->hwc_sync_mode_change)
      {