add norender_disable feature 51/256351/2
authorDoyoun Kang <doyoun.kang@samsung.com>
Thu, 1 Apr 2021 08:49:54 +0000 (17:49 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Thu, 1 Apr 2021 23:52:25 +0000 (08:52 +0900)
There was a bug that the app's internal animation was blocked for a while because of
another window's visibility job which called e_comp_canvas_norender_push_except_video.

So, we added a new E_API
- void e_policy_visibility_norender_disable_set(Eina_Bool disable)

If a disable parameter is a EINA_TRUE(aka norender_disable is set), then e doesn't call
e_comp_canvas_norender_push_except_video while adding visibility job.

E-module can call e_policy_visibility_norender_disable_set(EINA_TRUE) when it does not want
to enter no-render state.
FYI, e-module has to call e_policy_visibility_norender_disable(EINA_FALSE) also.

Change-Id: I8fd2adcfae2782bb89eecd587b890976a53e351c

src/bin/e_comp.h
src/bin/e_comp_canvas.c
src/bin/e_comp_canvas.h
src/bin/e_policy_visibility.c
src/bin/e_policy_visibility.h

index 6f1b2ff15c99e26edfbdd9cd5cc3931f9152d55f..434613633bfe9f96112796aeadbfaf81b747c649 100644 (file)
@@ -201,6 +201,8 @@ struct _E_Comp
       char use; // 0: none 1: use commit_handler timer
       double interval; // time value the interval of commit_handler after tdm_commit in second (default : 0)
    } commit_handler_timer;
+
+   Eina_List *norender_ec_list;
 };
 
 struct _E_Comp_Connected_Client_Info
index a074dfce01e6f95d68e123d7ada264839ae91cb9..47ae1d9daf3eb2bcfe7be566f431b971e6c5c59e 100644 (file)
@@ -748,7 +748,7 @@ e_comp_canvas_norender_get(void)
 }
 
 EINTERN void
-e_comp_canvas_norender_push_except_video(void)
+e_comp_canvas_norender_push_except_video(E_Client *ec)
 {
    E_Comp_Screen *e_comp_screen;
    E_Output *primary_output;
@@ -756,6 +756,13 @@ e_comp_canvas_norender_push_except_video(void)
    e_comp_screen = e_comp->e_comp_screen;
    primary_output = e_comp_screen_primary_output_get(e_comp_screen);
 
+   if (eina_list_data_find(e_comp->norender_ec_list, ec))
+     {
+        ELOGF("COMP", "Added to norender running list already", ec);
+        return;
+     }
+   e_comp->norender_ec_list = eina_list_append(e_comp->norender_ec_list, ec);
+
    TRACE_DS_BEGIN(Canvas NoRenderPush:%d, e_comp->norender_except_video + 1);
    e_output_norender_push_except_video(primary_output);
    e_comp->norender_except_video++;
@@ -763,11 +770,18 @@ e_comp_canvas_norender_push_except_video(void)
 }
 
 EINTERN void
-e_comp_canvas_norender_pop_except_video(void)
+e_comp_canvas_norender_pop_except_video(E_Client *ec)
 {
    E_Comp_Screen *e_comp_screen;
    E_Output *primary_output;
 
+   if (!eina_list_data_find(e_comp->norender_ec_list, ec))
+     {
+        ELOGF("COMP", "Can't find norender running list", ec);
+        return;
+     }
+   e_comp->norender_ec_list = eina_list_remove(e_comp->norender_ec_list, ec);
+
    if (e_comp->norender_except_video <= 0) return;
 
    e_comp_screen = e_comp->e_comp_screen;
index 92baf90311d8b82f9051243ef2cdcf5cedaabf12..7d68eb91f8fb65ce3d2e2205fcb57e49bf8b05af 100644 (file)
@@ -32,8 +32,8 @@ E_API void    e_comp_canvas_norender_push(void);
 E_API void    e_comp_canvas_norender_pop(void);
 EINTERN int   e_comp_canvas_norender_get(void);
 
-EINTERN void    e_comp_canvas_norender_push_except_video(void);
-EINTERN void    e_comp_canvas_norender_pop_except_video(void);
+EINTERN void    e_comp_canvas_norender_push_except_video(E_Client *ec);
+EINTERN void    e_comp_canvas_norender_pop_except_video(E_Client *ec);
 
 /* the following functions are used for adjusting root window coordinates
  * to/from canvas coordinates.
index 500b0dbf9781d6003b78a91cf7136380a38f26d8..eba44e32d29d736af71f055838361d38cfb7f53e 100644 (file)
@@ -68,6 +68,7 @@ static E_Vis_Job_Group  *pol_job_group = NULL;
 static Eina_Clist        pol_job_group_head = EINA_CLIST_INIT(pol_job_group_head);
 
 static Eina_Bool         pol_job_exec_walking = EINA_FALSE;
+static Eina_Bool         pol_vis_disable_norender = EINA_FALSE;
 
 static Eina_Inlist *_e_pol_vis_hooks[] =
 {
@@ -648,7 +649,12 @@ _e_vis_job_add(E_Vis_Client *vc, E_Vis_Job_Type type, Ecore_Task_Cb timeout_func
        (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
      {
         if (_e_vis_client_norender_need(vc->ec))
-          e_comp_canvas_norender_push_except_video();
+          {
+             if (!pol_vis_disable_norender)
+               e_comp_canvas_norender_push_except_video(vc->ec);
+             else
+               ELOGF("POL_VIS", "Do not activate norender...", vc->ec);
+          }
      }
 
    return EINA_TRUE;
@@ -667,7 +673,7 @@ _e_vis_job_del(Eina_Clist *elem)
        (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
      {
         if (_e_vis_client_norender_need(job->vc->ec))
-          e_comp_canvas_norender_pop_except_video();
+          e_comp_canvas_norender_pop_except_video(job->vc->ec);
      }
 
    VS_INF(job->vc->ec, "FREE JOB:%p, type:%d", job, job->type);
@@ -701,7 +707,7 @@ _e_vis_job_exec(Eina_Clist *elem)
             (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
           {
              if (_e_vis_client_norender_need(job->vc->ec))
-               e_comp_canvas_norender_pop_except_video();
+               e_comp_canvas_norender_pop_except_video(job->vc->ec);
           }
         goto end;
      }
@@ -1648,7 +1654,7 @@ _e_vis_ec_job_exec(E_Client *ec, E_Vis_Job_Type type)
          break;
       case E_VIS_JOB_TYPE_LOWER:
          if (_e_vis_client_norender_need(ec))
-           e_comp_canvas_norender_pop_except_video();
+           e_comp_canvas_norender_pop_except_video(ec);
 
          if (ec)
            {
@@ -1659,19 +1665,19 @@ _e_vis_ec_job_exec(E_Client *ec, E_Vis_Job_Type type)
          break;
       case E_VIS_JOB_TYPE_HIDE:
          if (_e_vis_client_norender_need(ec))
-           e_comp_canvas_norender_pop_except_video();
+           e_comp_canvas_norender_pop_except_video(ec);
 
          if (ec) evas_object_hide(ec->frame);
          break;
       case E_VIS_JOB_TYPE_LAYER_LOWER:
          if (_e_vis_client_norender_need(ec))
-           e_comp_canvas_norender_pop_except_video();
+           e_comp_canvas_norender_pop_except_video(ec);
 
          if (vc) e_client_layer_set(ec, vc->layer);
          break;
       case E_VIS_JOB_TYPE_ICONIFY:
          if (_e_vis_client_norender_need(ec))
-           e_comp_canvas_norender_pop_except_video();
+           e_comp_canvas_norender_pop_except_video(ec);
 
          e_client_iconify(ec);
          break;
@@ -2628,6 +2634,13 @@ e_policy_visibility_client_below_uniconify_skip_set(E_Client *ec, Eina_Bool skip
    _e_vis_client_below_uniconify_skip_set(vc, skip);
 }
 
+E_API void
+e_policy_visibility_norender_disable_set(Eina_Bool disable)
+{
+   ELOGF("POL_VIS", "NO RENDER DISABLE SET: %d", NULL, disable);
+   pol_vis_disable_norender = disable;
+}
+
 E_API E_Pol_Vis_Hook *
 e_policy_visibility_hook_add(E_Pol_Vis_Hook_Type type, E_Pol_Vis_Hook_Cb cb, const void *data)
 {
index e6e4e98da221cc4476922f52de051064517bad43..5f877c0c3e47e09143568ad26eee0d8b0e087011 100644 (file)
@@ -76,5 +76,7 @@ EINTERN void                      e_vis_client_check_send_pre_visibility_event(E
 
 EINTERN double                    e_policy_visibility_timeout_get(void);
 
+E_API void                        e_policy_visibility_norender_disable_set(Eina_Bool disable);
+
 #endif
 #endif