e_comp_canvas,e_policy_visibility: Add and use e_comp_canvas_norender_push_except_video 19/249519/2
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 10 Dec 2020 07:50:32 +0000 (16:50 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 14 Dec 2020 09:19:09 +0000 (18:19 +0900)
Change-Id: I579997b6e365db58a613a399af336618b74e0ab8

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

index d47cd0c82a5afffff876767525407d06af98eff2..6f1b2ff15c99e26edfbdd9cd5cc3931f9152d55f 100644 (file)
@@ -190,6 +190,7 @@ struct _E_Comp
    Eina_List      *render_list;
 
    int norender;
+   int norender_except_video;
 
    void           (*func_memory_dump) (void);
 
index 43e0ec108e8031cd95193abd3601e0e67460895d..a074dfce01e6f95d68e123d7ada264839ae91cb9 100644 (file)
@@ -746,3 +746,35 @@ e_comp_canvas_norender_get(void)
 
    return e_output_norender_get(primary_output);
 }
+
+EINTERN void
+e_comp_canvas_norender_push_except_video(void)
+{
+   E_Comp_Screen *e_comp_screen;
+   E_Output *primary_output;
+
+   e_comp_screen = e_comp->e_comp_screen;
+   primary_output = e_comp_screen_primary_output_get(e_comp_screen);
+
+   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++;
+   TRACE_DS_END();
+}
+
+EINTERN void
+e_comp_canvas_norender_pop_except_video(void)
+{
+   E_Comp_Screen *e_comp_screen;
+   E_Output *primary_output;
+
+   if (e_comp->norender_except_video <= 0) return;
+
+   e_comp_screen = e_comp->e_comp_screen;
+   primary_output = e_comp_screen_primary_output_get(e_comp_screen);
+
+   TRACE_DS_BEGIN(Canvas NoRenderPop:%d, e_comp->norender_except_video - 1);
+   e_output_norender_pop_except_video(primary_output);
+   e_comp->norender_except_video--;
+   TRACE_DS_END();
+}
index 083c3213ec5c892e92162e0282f274f9b13fbd2e..92baf90311d8b82f9051243ef2cdcf5cedaabf12 100644 (file)
@@ -32,6 +32,9 @@ 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);
+
 /* the following functions are used for adjusting root window coordinates
  * to/from canvas coordinates.
  * this ensures correct positioning when running E as a nested compositor
index 64ec273a285a4f0af9a2bed57fd7ed7304559fb0..eb45590052bc5776aad613ebfd2276042efb2b56 100644 (file)
@@ -593,6 +593,32 @@ e_hwc_norender_get(E_Hwc *hwc)
    return hwc->norender;
 }
 
+EINTERN void
+e_hwc_norender_push_except_video(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(hwc);
+
+   hwc->norender_except_video++;
+}
+
+EINTERN void
+e_hwc_norender_pop_except_video(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(hwc);
+
+   if (hwc->norender_except_video <= 0) return;
+
+   hwc->norender_except_video--;
+}
+
+EINTERN int
+e_hwc_norender_get_except_video(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(hwc, 0);
+
+   return hwc->norender_except_video;
+}
+
 static const char *
 _e_hwc_prop_name_get_by_id(E_Hwc *hwc, unsigned int id)
 {
index 9ec0809f1a7cd1bb3abf978943908ebb8a161966..b0b76d311a7ec6f383928fde6d86f66043663864 100644 (file)
@@ -143,6 +143,7 @@ struct _E_Hwc
    E_Hwc_Window        *presentation_hwc_window;
 
    int                  norender;
+   int                  norender_except_video;
 
    /* for fps */
    double               fps;
@@ -206,5 +207,9 @@ EINTERN Eina_Bool             e_hwc_sync_callback_call(E_Hwc_Sync_Callback *sync
 E_API E_Hwc_Sync_Callback    *e_hwc_sync_callback_add(E_Hwc *hwc, E_Hwc_Sync_Done_Cb cb, void *data);
 E_API void                    e_hwc_sync_callback_del(E_Hwc_Sync_Callback *sync_callback);
 
+EINTERN void                  e_hwc_norender_push_except_video(E_Hwc *hwc);
+EINTERN void                  e_hwc_norender_pop_except_video(E_Hwc *hwc);
+EINTERN int                   e_hwc_norender_get_except_video(E_Hwc *hwc);
+
 #endif
 #endif
index e84598ccbe18017ea57818f74152144b613c2b49..dca0b101f8ddc461704c3f4e44fc374cdc5e1902 100644 (file)
@@ -4286,6 +4286,22 @@ e_output_norender_get(E_Output *output)
    return e_hwc_norender_get(output->hwc);
 }
 
+EINTERN void
+e_output_norender_push_except_video(E_Output *output)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(output);
+
+   e_hwc_norender_push_except_video(output->hwc);
+}
+
+EINTERN void
+e_output_norender_pop_except_video(E_Output *output)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(output);
+
+   e_hwc_norender_pop_except_video(output->hwc);
+}
+
 static const char *
 _e_output_prop_name_get_by_id(E_Output *output, unsigned int id)
 {
index e9935e95ff7bdaa9d9c6f8164ee1c03304e2f8e1..1472d724d006b5b5155329db3d039d8849015852 100644 (file)
@@ -269,5 +269,8 @@ E_API Eina_Bool           e_output_available_properties_get(E_Output *output, co
 E_API Eina_Bool           e_output_property_get(E_Output *output, unsigned int id, output_prop_value *value);
 E_API Eina_Bool           e_output_property_set(E_Output *output, unsigned int id, output_prop_value value);
 
+EINTERN void              e_output_norender_push_except_video(E_Output *output);
+EINTERN void              e_output_norender_pop_except_video(E_Output *output);
+
 #endif
 #endif
index fd4fe5e51d36e974a61fd1dd54deeb36a5c498f9..4d079917086b19c1be5ace6f6bde117dd4f0e12a 100644 (file)
@@ -633,7 +633,7 @@ _e_vis_job_add(E_Vis_Client *vc, E_Vis_Job_Type type, Ecore_Task_Cb timeout_func
        (job->type == E_VIS_JOB_TYPE_HIDE) ||
        (job->type == E_VIS_JOB_TYPE_ICONIFY) ||
        (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
-     e_comp_canvas_norender_push();
+     e_comp_canvas_norender_push_except_video();
 
    return EINA_TRUE;
 }
@@ -649,7 +649,7 @@ _e_vis_job_del(Eina_Clist *elem)
        (job->type == E_VIS_JOB_TYPE_HIDE) ||
        (job->type == E_VIS_JOB_TYPE_ICONIFY) ||
        (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
-     e_comp_canvas_norender_pop();
+     e_comp_canvas_norender_pop_except_video();
 
    VS_INF(job->vc->ec, "FREE JOB:%p, type:%d", job, job->type);
    E_FREE_FUNC(job->timer, ecore_timer_del);
@@ -680,7 +680,7 @@ _e_vis_job_exec(Eina_Clist *elem)
             (job->type == E_VIS_JOB_TYPE_HIDE) ||
             (job->type == E_VIS_JOB_TYPE_ICONIFY) ||
             (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
-          e_comp_canvas_norender_pop();
+          e_comp_canvas_norender_pop_except_video();
         goto end;
      }
 
@@ -1621,7 +1621,7 @@ _e_vis_ec_job_exec(E_Client *ec, E_Vis_Job_Type type)
          ec->exp_iconify.not_raise = 0;
          break;
       case E_VIS_JOB_TYPE_LOWER:
-         e_comp_canvas_norender_pop();
+         e_comp_canvas_norender_pop_except_video();
          if (ec)
            {
               e_client_lower(ec);
@@ -1630,15 +1630,15 @@ _e_vis_ec_job_exec(E_Client *ec, E_Vis_Job_Type type)
            }
          break;
       case E_VIS_JOB_TYPE_HIDE:
-         e_comp_canvas_norender_pop();
+         e_comp_canvas_norender_pop_except_video();
          if (ec) evas_object_hide(ec->frame);
          break;
       case E_VIS_JOB_TYPE_LAYER_LOWER:
-         e_comp_canvas_norender_pop();
+         e_comp_canvas_norender_pop_except_video();
          if (vc) e_client_layer_set(ec, vc->layer);
          break;
       case E_VIS_JOB_TYPE_ICONIFY:
-         e_comp_canvas_norender_pop();
+         e_comp_canvas_norender_pop_except_video();
          e_client_iconify(ec);
          break;
       case E_VIS_JOB_TYPE_SHOW: