e_comp_wl: added support for E_COMP_WL_HOOK_BUFFER_CHANGE. 71/113971/2
authorGwanglim Lee <gl77.lee@samsung.com>
Thu, 9 Feb 2017 11:21:56 +0000 (20:21 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Thu, 9 Feb 2017 11:23:17 +0000 (03:23 -0800)
To prevent rendering of the specific client, it can make possible
cleanup of e_pixmap by each module when client buffer is changed.

Now, if ec->pixmap doesn't have a resource, e_comp_object_damage
function will not set cw->hwc_need_update value. It enables the
display server to block plane update during HWC state.

Change-Id: I283a43be73b605b334ad7be30c8a88e6efce109a

src/bin/e_comp_object.c
src/bin/e_comp_wl.c
src/bin/e_comp_wl.h

index 98ce57148624dc11d5af2e6221209020c3133fd6..08020020264d7ec76a70866b6d48a397cc0d8dc8 100644 (file)
@@ -3712,7 +3712,15 @@ e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
 
    if (e_comp_is_on_overlay(cw->ec))
      {
-        cw->hwc_need_update = EINA_TRUE;
+        if (cw->ec)
+          {
+             /* It will not set hwc_need_update value if E modules already cleanup pixmap
+              * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
+              * E module attempts to block screen update due to the particular policy.
+              */
+             if (e_pixmap_resource_get(cw->ec->pixmap))
+               cw->hwc_need_update = EINA_TRUE;
+          }
      }
 
    /* ignore overdraw */
index 0757d4f1964c0e054c12cde9c61fa88a6a9f1e1d..c07970c3201dd72fdc3abb278de8bfd1f65d6dfd 100644 (file)
@@ -65,6 +65,7 @@ static Eina_Inlist *_e_comp_wl_hooks[] =
 {
    [E_COMP_WL_HOOK_SHELL_SURFACE_READY] = NULL,
    [E_COMP_WL_HOOK_SUBSURFACE_CREATE] = NULL,
+   [E_COMP_WL_HOOK_BUFFER_CHANGE] = NULL,
 };
 
 /* local functions */
@@ -5007,6 +5008,9 @@ e_comp_wl_surface_attach(E_Client *ec, E_Comp_Wl_Buffer *buffer)
    _e_comp_wl_surface_state_size_update(ec, &ec->comp_data->pending);
    e_comp_wl_map_size_cal_from_buffer(ec);
 
+   /* wm-policy module uses it */
+   _e_comp_wl_hook_call(E_COMP_WL_HOOK_BUFFER_CHANGE, ec);
+
    ev->ec = ec;
    e_object_ref(E_OBJECT(ec));
    ecore_event_add(E_EVENT_CLIENT_BUFFER_CHANGE, ev,
index 8cc71aa66dc95b0624ed65e49dddfd436689e9ad..3a21a27ee5088e710380fbcc25ca4113453add12 100644 (file)
@@ -59,6 +59,7 @@ typedef enum _E_Comp_Wl_Hook_Point
 {
    E_COMP_WL_HOOK_SHELL_SURFACE_READY,
    E_COMP_WL_HOOK_SUBSURFACE_CREATE,
+   E_COMP_WL_HOOK_BUFFER_CHANGE,
    E_COMP_WL_HOOK_LAST,
 } E_Comp_Wl_Hook_Point;