e_hwc_window: remove calling e_comp_zone_find_by_ec 94/297294/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 11 Aug 2023 10:34:07 +0000 (19:34 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 16 Aug 2023 23:17:06 +0000 (23:17 +0000)
Change-Id: I709e22d8408dbacbf967dce3d57b6cdeaa0635b3

src/bin/e_hwc_window.c
src/bin/e_hwc_window.h
src/bin/e_hwc_windows.c

index f907120..2f11ce4 100644 (file)
@@ -75,6 +75,7 @@ typedef enum _E_Hwc_Window_Restriction
    E_HWC_WINDOW_RESTRICTION_DESK_ZOOM,
    E_HWC_WINDOW_RESTRICTION_BLEND_ALPHA,
    E_HWC_WINDOW_RESTRICTION_BLEND_EQUATION,
+   E_HWC_WINDOW_RESTRICTION_ZONE,
 } E_Hwc_Window_Restriction;
 
 static Eina_Bool ehw_trace = EINA_FALSE;
@@ -532,6 +533,40 @@ _e_hwc_window_update_fps(E_Hwc_Window *hwc_window)
 }
 
 static void
+_e_hwc_window_cb_zone_del(void *data, void *obj)
+{
+   E_Hwc_Window *hwc_window = (E_Hwc_Window *)data;
+
+   hwc_window->zone_delfn = NULL;
+   hwc_window->zone = NULL;
+}
+
+static void
+_e_hwc_window_zone_set(E_Hwc_Window *hwc_window, E_Zone *zone)
+{
+   if (hwc_window->zone == zone) return;
+
+   if (hwc_window->zone)
+     {
+        if (hwc_window->zone_delfn)
+          {
+             e_object_delfn_del(E_OBJECT(hwc_window->zone), hwc_window->zone_delfn);
+             hwc_window->zone_delfn = NULL;
+          }
+
+        hwc_window->zone = NULL;
+     }
+
+   if (zone)
+     {
+        hwc_window->zone_delfn = e_object_delfn_add(E_OBJECT(zone),
+                                                    _e_hwc_window_cb_zone_del,
+                                                    hwc_window);
+        hwc_window->zone = zone;
+     }
+}
+
+static void
 _e_hwc_window_free(E_Hwc_Window *hwc_window)
 {
    E_Hwc *hwc;
@@ -563,6 +598,8 @@ _e_hwc_window_free(E_Hwc_Window *hwc_window)
                                                     NULL,
                                                     NULL);
 
+   _e_hwc_window_zone_set(hwc_window, NULL);
+
    if (hwc_window->cursor_buffer_destroy_listener.notify)
      {
         wl_list_remove(&hwc_window->cursor_buffer_destroy_listener.link);
@@ -713,12 +750,15 @@ end:
 static void
 _e_hwc_window_client_cb_del(void *data EINA_UNUSED, E_Client *ec)
 {
+   E_Hwc_Window *hwc_window;
    E_Output *output;
    E_Zone *zone;
 
    EINA_SAFETY_ON_NULL_RETURN(ec);
 
-   zone = e_comp_zone_find_by_ec(ec);
+   if (!(hwc_window = ec->hwc_window)) return;
+
+   zone = hwc_window->zone;
    EINA_SAFETY_ON_NULL_RETURN(zone);
    EINA_SAFETY_ON_NULL_RETURN(zone->output_id);
 
@@ -730,10 +770,9 @@ _e_hwc_window_client_cb_del(void *data EINA_UNUSED, E_Client *ec)
    if (e_hwc_policy_get(output->hwc) == E_HWC_POLICY_PLANES)
      return;
 
-   if (!ec->hwc_window) return;
-   if (e_hwc_window_is_video(ec->hwc_window)) return;
+   if (e_hwc_window_is_video(hwc_window)) return;
 
-   e_hwc_window_client_type_override(ec->hwc_window);
+   e_hwc_window_client_type_override(hwc_window);
 }
 
 static void
@@ -771,10 +810,13 @@ _e_hwc_window_client_cb_transform_change(void *data EINA_UNUSED, E_Client *ec)
    Eina_List *l;
    E_Client *subc;
    E_Hwc_Window_State state;
+   E_Hwc_Window *hwc_window;
 
    EINA_SAFETY_ON_NULL_RETURN(ec);
 
-   zone = e_comp_zone_find_by_ec(ec);
+   if (!(hwc_window = ec->hwc_window)) return;
+
+   zone = hwc_window->zone;
    EINA_SAFETY_ON_NULL_RETURN(zone);
    EINA_SAFETY_ON_NULL_RETURN(zone->output_id);
 
@@ -784,7 +826,6 @@ _e_hwc_window_client_cb_transform_change(void *data EINA_UNUSED, E_Client *ec)
    /* If an e_client belongs to the e_output managed by hwc_plane policy,
     * there's no need to deal with hwc_windows. */
    if (e_hwc_policy_get(output->hwc) == E_HWC_POLICY_PLANES) return;
-   if (!ec->hwc_window) return;
 
    if (!e_comp_wl_video_subsurface_has(ec) && !e_comp_wl_normal_subsurface_has(ec))
      return;
@@ -812,7 +853,7 @@ _e_hwc_window_client_cb_transform_change(void *data EINA_UNUSED, E_Client *ec)
 static Eina_Bool
 _e_hwc_window_client_cb_zone_set(void *data, int type, void *event)
 {
-   E_Event_Client *ev;
+   E_Event_Client_Zone_Set *ev;
    E_Client *ec;
    E_Zone *zone;
    E_Output *output;
@@ -820,17 +861,17 @@ _e_hwc_window_client_cb_zone_set(void *data, int type, void *event)
    Eina_Bool is_video = EINA_FALSE;
 
    ev = event;
-   EINA_SAFETY_ON_NULL_GOTO(ev, end);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
 
    ec = ev->ec;
-   EINA_SAFETY_ON_NULL_GOTO(ec, end);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, ECORE_CALLBACK_PASS_ON);
 
-   zone = e_comp_zone_find_by_ec(ec);
-   EINA_SAFETY_ON_NULL_GOTO(zone, end);
-   EINA_SAFETY_ON_NULL_GOTO(zone->output_id, end);
+   zone = ev->zone;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(zone, ECORE_CALLBACK_PASS_ON);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(zone->output_id, ECORE_CALLBACK_PASS_ON);
 
    output = e_output_find(zone->output_id);
-   EINA_SAFETY_ON_NULL_GOTO(output, end);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output, ECORE_CALLBACK_PASS_ON);
 
    /* If an e_client belongs to the e_output managed by hwc_plane policy,
     * there's no need to deal with hwc_windows. */
@@ -840,23 +881,26 @@ _e_hwc_window_client_cb_zone_set(void *data, int type, void *event)
    if (e_object_is_del(E_OBJECT(ec)))
      return ECORE_CALLBACK_PASS_ON;
 
-   if (ec->hwc_window)
+   hwc_window = ec->hwc_window;
+   if (hwc_window)
      {
-        if (ec->hwc_window->hwc == output->hwc) goto end;
+        if (hwc_window->hwc == output->hwc) goto done;
 
-        is_video = e_hwc_window_is_video(ec->hwc_window);
-        _e_hwc_window_del(ec->hwc_window);
+        is_video = e_hwc_window_is_video(hwc_window);
+        _e_hwc_window_del(hwc_window);
      }
 
    hwc_window = _e_hwc_window_new(output->hwc, ec, E_HWC_WINDOW_STATE_NONE);
-   EINA_SAFETY_ON_NULL_GOTO(hwc_window, end);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, ECORE_CALLBACK_PASS_ON);
 
    if (is_video) e_hwc_window_video_set(hwc_window, is_video);
 
    EHWINF("set on eout:%p, zone_id:%d",
           ec, hwc_window->hwc, hwc_window, output, zone->id);
 
-end:
+done:
+   _e_hwc_window_zone_set(hwc_window, zone);
+
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -1058,7 +1102,7 @@ _e_hwc_window_cursor_info_get(E_Hwc_Window *hwc_window, tdm_hwc_window_info *hwc
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
    EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), EINA_FALSE);
 
-   zone = e_comp_zone_find_by_ec(ec);
+   zone = hwc_window->zone;
    EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
 
    pointer = e_pointer_get(ec);
@@ -1145,7 +1189,7 @@ _e_hwc_window_info_get(E_Hwc_Window *hwc_window, tdm_hwc_window_info *hwc_win_in
    hwc = hwc_window->hwc;
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
 
-   zone = e_comp_zone_find_by_ec(ec);
+   zone = hwc_window->zone;
    EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
 
    output = hwc->output;
@@ -1279,7 +1323,7 @@ _e_hwc_window_video_info_get(E_Hwc_Window *hwc_window, tdm_hwc_window_info *hwc_
    hwc = hwc_window->hwc;
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
 
-   zone = e_comp_zone_find_by_ec(ec);
+   zone = hwc_window->zone;
    EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
 
    if (!e_client_video_info_get(ec, &vinfo))
@@ -2057,8 +2101,6 @@ e_hwc_window_device_state_available_update(E_Hwc_Window *hwc_window)
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
 
    ec = hwc_window->ec;
-   zone = e_comp_zone_find_by_ec(ec);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
 
    if ((hwc_window->is_deleted) || (!ec) || e_object_is_del(E_OBJECT(ec)))
      {
@@ -2147,6 +2189,14 @@ e_hwc_window_device_state_available_update(E_Hwc_Window *hwc_window)
         goto finish;
      }
 
+   zone = hwc_window->zone;
+   if (!zone)
+     {
+        restriction = E_HWC_WINDOW_RESTRICTION_ZONE;
+        available = EINA_FALSE;
+        goto finish;
+     }
+
    eout = e_output_find(zone->output_id);
    if (!eout)
      {
@@ -2624,6 +2674,8 @@ e_hwc_window_restriction_string_get(E_Hwc_Window *hwc_window)
        return "blend alpha";
      case E_HWC_WINDOW_RESTRICTION_BLEND_EQUATION:
        return "blend equation";
+     case E_HWC_WINDOW_RESTRICTION_ZONE:
+       return "zone";
      default:
        return "UNKNOWN";
     }
index ab056aa..ffda21f 100644 (file)
@@ -161,6 +161,9 @@ struct _E_Hwc_Window
    E_Hwc_Presentation_Callback_List presentation_callbacks;
 
    struct wayland_tbm_client_queue *cqueue;
+
+   E_Zone                        *zone;
+   E_Object_Delfn                *zone_delfn;
 };
 
 struct _E_Hwc_Window_Target
index 659fd8c..1a1c535 100644 (file)
@@ -1157,7 +1157,7 @@ _e_hwc_windows_visible_windows_list_get(E_Hwc *hwc)
 
         if (hwc)
           {
-             zone = e_comp_zone_find_by_ec(ec);
+             zone = hwc_window->zone;
              if (!zone) continue;
              if (e_output_find(zone->output_id) != hwc->output) continue;
           }