e_comp_wl: Delegate the update alpha state to surface view 08/320108/2
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 5 Feb 2025 07:01:04 +0000 (16:01 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 24 Feb 2025 08:47:33 +0000 (08:47 +0000)
Change-Id: I9840a69a54350adf4b17f421e855c591589407fe

src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_intern.h
src/bin/server/e_compositor.c
src/bin/server/e_surface_view.c

index 13a2d92e38ea9db04912267b74289f87539d4a2b..5513e152e972e163f1eddf8579ccf1227447f108 100644 (file)
@@ -5937,33 +5937,6 @@ e_comp_wl_client_surface_pending_buffer_set(E_Client *ec, E_Comp_Wl_Buffer *buff
    ec->comp_data->pending.new_attach = EINA_TRUE;
 }
 
-EINTERN void
-e_comp_wl_client_opaque_region_set(E_Client *ec, pixman_region32_t *region)
-{
-   if (pixman_region32_not_empty(region))
-     {
-        if (ec->argb)
-          {
-             ec->argb = EINA_FALSE;
-             ELOGF("COMP", "Set argb:%d", ec, ec->argb);
-             EC_CHANGED(ec);
-             _e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_ALPHA_CHANGE, ec);
-             e_view_client_alpha_set(e_client_view_get(ec), EINA_FALSE);
-          }
-     }
-   else
-     {
-        if (!ec->argb)
-          {
-             ec->argb = EINA_TRUE;
-             ELOGF("COMP", "Set argb:%d", ec, ec->argb);
-             EC_CHANGED(ec);
-             _e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_ALPHA_CHANGE, ec);
-             e_view_client_alpha_set(e_client_view_get(ec), EINA_TRUE);
-          }
-     }
-}
-
 EINTERN void
 e_comp_wl_client_input_region_set(E_Client *ec, pixman_region32_t *region)
 {
index 8745f04933dc593818d63b55faba5d4935d0ef11..b195afb9ad190d4c191069b4e116113f11a1f2b1 100644 (file)
@@ -89,7 +89,6 @@ EINTERN void e_comp_wl_client_evas_deinit(E_Client *ec);
 EINTERN void e_comp_wl_client_surface_init(E_Client *ec);
 EINTERN void e_comp_wl_client_surface_finish(E_Client *ec);
 EINTERN void e_comp_wl_client_surface_pending_buffer_set(E_Client *ec, E_Comp_Wl_Buffer *buffer, int32_t sx, int32_t sy);
-EINTERN void e_comp_wl_client_opaque_region_set(E_Client *ec, pixman_region32_t *region);
 EINTERN void e_comp_wl_client_input_region_set(E_Client *ec, pixman_region32_t *region);
 
 EINTERN Eina_Bool e_comp_wl_client_subsurface_cyclic_reference_check(E_Client *ec, E_Client *parent);
index b34b12043b0ac2a361491670bd57258eb21ba719..e7b83243bba0811a758524f47a797f621d772149 100644 (file)
@@ -1131,15 +1131,6 @@ _e_surface_pending_buffer_update(E_Surface *surface)
                                                ds_surface->current.dy);
 }
 
-static void
-_e_surface_pending_opaque_region_update(E_Surface *surface)
-{
-   struct ds_surface *ds_surface = surface->ds_surface;
-   E_Client *ec = surface->ec;
-
-   e_comp_wl_client_opaque_region_set(ec, &ds_surface->current.opaque);
-}
-
 static void
 _e_surface_pending_input_region_update(E_Surface *surface)
 {
@@ -1278,9 +1269,6 @@ _e_surface_pending_update(E_Surface *surface)
    if (ds_surface->current.committed & DS_SURFACE_STATE_BUFFER)
      _e_surface_pending_buffer_update(surface);
 
-   if (ds_surface->current.committed & DS_SURFACE_STATE_OPAQUE_REGION)
-     _e_surface_pending_opaque_region_update(surface);
-
    if (ds_surface->current.committed & DS_SURFACE_STATE_INPUT_REGION)
      _e_surface_pending_input_region_update(surface);
 
index b1c2364b9b84d445541d43f0414b52ca7083ddc2..97f56ec967f89e97ed78002fce8d966a0b88186d 100644 (file)
@@ -1,3 +1,4 @@
+#include "e_compositor_intern.h"
 #include "e_log.h"
 #include "e_types.h"
 #include "e_comp_intern.h"
@@ -117,6 +118,57 @@ _surface_view_cb_viewport_commit(struct wl_listener *listener, void *data)
    e_comp_wl_map_apply(view->ec);
 }
 
+static Eina_Bool
+_surface_view_alpha_set(E_Surface_View *view)
+{
+   E_Client *ec = view->ec;
+
+   if (ec->argb)
+     return EINA_FALSE;
+
+   ESV_INF("Set argb", ec);
+
+   ec->argb = EINA_TRUE;
+   EC_CHANGED(ec);
+
+   e_view_client_alpha_set(e_client_view_get(ec), EINA_TRUE);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_surface_view_alpha_unset(E_Surface_View *view)
+{
+   E_Client *ec = view->ec;
+
+   if (!ec->argb)
+     return EINA_FALSE;
+
+   ESV_INF("Unset argb", ec);
+
+   ec->argb = EINA_FALSE;
+   EC_CHANGED(ec);
+
+   e_view_client_alpha_set(e_client_view_get(ec), EINA_FALSE);
+
+   return EINA_TRUE;
+}
+
+static void
+_surface_view_opaque_region_update(E_Surface_View *view)
+{
+   Eina_Bool is_opaque = pixman_region32_not_empty(e_surface_opaque_region_get(view->surface));
+   Eina_Bool changed = EINA_FALSE;
+
+   if (is_opaque)
+     changed = _surface_view_alpha_unset(view);
+   else
+     changed = _surface_view_alpha_set(view);
+
+   if (changed)
+     e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_ALPHA_CHANGE, view->ec);
+}
+
 static void
 _surface_view_cb_surface_commit(struct wl_listener *listener, void *data)
 {
@@ -126,6 +178,9 @@ _surface_view_cb_surface_commit(struct wl_listener *listener, void *data)
    if (event->committed & E_SURFACE_STATE_BUFFER)
      e_client_fps_update(view->ec);
 
+   if (event->committed & E_SURFACE_STATE_OPAQUE_REGION)
+     _surface_view_opaque_region_update(view);
+
    if (e_comp_wl_remote_surface_commit(view->ec))
      return;