e_client: disable transform core when client is hidden 06/299206/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 19 Sep 2023 10:41:34 +0000 (19:41 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 21 Sep 2023 10:53:55 +0000 (19:53 +0900)
if texture memory is allocated for using evas map,
sometimes efl does not free texture memory until
evas_map is disabled or evas_map use direct render.
this patch makes e20 disable transform core(evas_map)
when client is hidden for optimazation gpu memory usage.

Change-Id: I9132876ee4b5aa5adccdfd5d2b1e5d94c3f04d60

src/bin/e_client.c
src/bin/e_client.h

index 13508af..2137987 100644 (file)
@@ -2174,6 +2174,24 @@ _e_client_zone_update(E_Client *ec)
 ////////////////////////////////////////////////
 
 static void
+_e_client_transform_core_activate_set(E_Client *ec, Eina_Bool set)
+{
+   if (ec->transform_core.activate == set) return;
+
+   ec->transform_core.activate = set;
+
+   if (set)
+     {
+        ec->transform_core.changed = EINA_TRUE;
+        e_client_transform_core_update(ec);
+     }
+   else
+     {
+        e_client_map_enable_set(ec, EINA_FALSE);
+     }
+}
+
+static void
 _e_client_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    E_Client *ec = data;
@@ -2192,6 +2210,8 @@ _e_client_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
 
    ec->want_focus = ec->take_focus = 0;
 
+   _e_client_transform_core_activate_set(ec, EINA_FALSE);
+
    if (ec->new_client) return;
    _e_client_event_hide(ec);
 
@@ -2331,6 +2351,8 @@ _e_client_cb_evas_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
 
    if (e_object_is_del(data)) return;
 
+   _e_client_transform_core_activate_set(ec, EINA_TRUE);
+
    _e_client_event_show(ec);
    EC_CHANGED(ec);
 }
@@ -4165,6 +4187,7 @@ e_client_new(E_Pixmap *cp, int first_map, int internal)
    ec->transform.zoom = 1.0;
    ec->transform.angle = 0.0;
    ec->transform_core.direct_render = EINA_TRUE;
+   ec->transform_core.activate = EINA_TRUE;
 
    ec->pointer_enter_sent = EINA_FALSE;
 
@@ -7161,6 +7184,7 @@ e_client_transform_core_update(E_Client *ec)
    if (!ec) return;
    if (ec->new_client) return;
    if (!_e_client_transform_core_check_change(ec)) return;
+   if (!ec->transform_core.activate) return;
 
    if (ec->transform_core.transform_list || ec->transform_core.parent.enable)
      {
index 7f1dc9e..8a91146 100644 (file)
@@ -918,6 +918,7 @@ struct E_Client
       } parent;
 
       Eina_Bool direct_render;
+      Eina_Bool activate;
    } transform_core;
 
    Ecore_Timer *map_timer;