norender works in each output and each hwc 90/211490/3
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 6 Aug 2019 01:34:23 +0000 (10:34 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 6 Aug 2019 02:26:53 +0000 (02:26 +0000)
A render function(ecore_evas) belongs to one output(hwc).
The norender function on the e_comp_canvas only works on
the primary output.

Change-Id: I69365f91f081446203b463ea00395351c4579c54

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_hwc_windows.c
src/bin/e_output.c
src/bin/e_output.h

index 76965a453b11a6c37ce5c31d745f954e77458c21..463b26efd42fdd74598564d3fee81d98aa1c3dfe 100644 (file)
@@ -706,30 +706,39 @@ e_comp_canvas_feed_mouse_up(unsigned int activate_time)
 E_API void
 e_comp_canvas_norender_push(void)
 {
-   e_comp->norender++;
+   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);
 
-   // e_plane_render is not working when e_comp->hwc is not initialized
-   if ((!e_comp->hwc) &&
-       (e_comp->norender == 1))
-     ecore_evas_manual_render_set(e_comp->ee, EINA_TRUE);
+   e_output_norender_push(primary_output);
+   e_comp->norender++;
 }
 
 E_API void
 e_comp_canvas_norender_pop(void)
 {
-   if (e_comp->norender <= 0)
-     return;
+   E_Comp_Screen *e_comp_screen;
+   E_Output *primary_output;
 
-   e_comp->norender--;
+   if (e_comp->norender <= 0) return;
 
-   // e_plane_render is not working when e_comp->hwc is not initialized
-   if ((!e_comp->hwc) &&
-       (e_comp->norender == 0))
-     ecore_evas_manual_render_set(e_comp->ee, EINA_FALSE);
+   e_comp_screen = e_comp->e_comp_screen;
+   primary_output = e_comp_screen_primary_output_get(e_comp_screen);
+
+   e_output_norender_pop(primary_output);
+   e_comp->norender--;
 }
 
 EINTERN int
 e_comp_canvas_norender_get(void)
 {
-   return e_comp->norender;
+   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);
+
+   return e_output_norender_get(primary_output);
 }
index 8b0c6c2b03c3b03a9a7568dcc1008a67761bc65d..083c3213ec5c892e92162e0282f274f9b13fbd2e 100644 (file)
@@ -28,8 +28,8 @@ EINTERN void e_comp_canvas_keys_grab(void);
 EINTERN void e_comp_canvas_keys_ungrab(void);
 EINTERN void e_comp_canvas_feed_mouse_up(unsigned int activate_time);
 
-E_API void  e_comp_canvas_norender_push(void);
-E_API void  e_comp_canvas_norender_pop(void);
+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);
 
 /* the following functions are used for adjusting root window coordinates
index 5778cf090a0f63e0114422d94bdc016acafd5ed5..3bec0c103b2dd48f38f1f173f5ad600defd3d53d 100644 (file)
@@ -513,6 +513,32 @@ e_hwc_tbm_surface_queue_get(E_Hwc *hwc)
    return hwc->target_buffer_queue;
 }
 
+EINTERN void
+e_hwc_norender_push(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(hwc);
+
+   hwc->norender++;
+}
+
+EINTERN void
+e_hwc_norender_pop(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(hwc);
+
+   if (hwc->norender <= 0) return;
+
+   hwc->norender--;
+}
+
+EINTERN int
+e_hwc_norender_get(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(hwc, 0);
+
+   return hwc->norender;
+}
+
 static const char *
 _e_hwc_prop_name_get_by_id(E_Hwc *hwc, unsigned int id)
 {
index b73f55aee49e8ba02cfcba9f1f2e9cca6321513d..0e26e281b8d89ff8aadc83f26b58f2d723e9bdbe 100644 (file)
@@ -122,6 +122,8 @@ struct _E_Hwc
    Eina_List           *mirror_dst_hwc;
    E_Output_Ext_State   ext_state;
 
+   int                  norender;
+
    /* for fps */
    double               fps;
    double               old_fps;
@@ -141,6 +143,10 @@ EINTERN Eina_Bool             e_hwc_client_is_above_hwc(E_Client *ec, E_Client *
 EINTERN char                 *e_hwc_output_id_get(E_Hwc *hwc);
 EINTERN tbm_surface_queue_h   e_hwc_tbm_surface_queue_get(E_Hwc *hwc);
 
+EINTERN void                  e_hwc_norender_push(E_Hwc *hwc);
+EINTERN void                  e_hwc_norender_pop(E_Hwc *hwc);
+EINTERN int                   e_hwc_norender_get(E_Hwc *hwc);
+
 EINTERN Eina_Bool             e_hwc_intercept_hook_call(E_Hwc_Intercept_Hook_Point hookpoint, E_Hwc *hwc);
 
 E_API E_Hwc_Intercept_Hook   *e_hwc_intercept_hook_add(E_Hwc_Intercept_Hook_Point hookpoint, E_Hwc_Intercept_Hook_Cb func, const void *data);
index 940c388c0a9a29196492e887dcec6a9928897b21..4aabe5e4b4cc7cfc8205b97b20066bb8ca8506ac 100644 (file)
@@ -2281,7 +2281,7 @@ e_hwc_windows_render(E_Hwc *hwc)
         return EINA_TRUE;
      }
 
-   if (e_comp_canvas_norender_get() > 0)
+   if (e_hwc_norender_get(hwc) > 0)
      {
         EHWSTRACE("NoRender get. Do not ecore_evas_manual_render.", NULL, hwc);
         return EINA_TRUE;
@@ -2317,7 +2317,7 @@ e_hwc_windows_commit(E_Hwc *hwc)
    if (!_e_hwc_windows_evaluate(hwc))
      return EINA_TRUE;
 
-   if (e_comp_canvas_norender_get() > 0)
+   if (e_hwc_norender_get(hwc) > 0)
      {
         EHWSTRACE(" Block Display... NoRender get.", NULL, hwc);
         return EINA_TRUE;
index 3ac867a022ae2db8782bb162e1db71851c0badbc..f70d1a6f464f75966fd2b6d8d8c02d39025101c4 100644 (file)
@@ -4005,6 +4005,30 @@ e_output_external_mode_change(E_Output *output, E_Output_Mode *mode)
    return EINA_TRUE;
 }
 
+EINTERN void
+e_output_norender_push(E_Output *output)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(output);
+
+   e_hwc_norender_push(output->hwc);
+}
+
+EINTERN void
+e_output_norender_pop(E_Output *output)
+{
+   EINA_SAFETY_ON_FALSE_RETURN(output);
+
+   e_hwc_norender_pop(output->hwc);
+}
+
+EINTERN int
+e_output_norender_get(E_Output *output)
+{
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(output, 0);
+
+   return e_hwc_norender_get(output->hwc);
+}
+
 static const char *
 _e_output_prop_name_get_by_id(E_Output *output, unsigned int id)
 {
index 75d593ed2cbb4616cf58c5f051ab804f8f22f63d..f7aa032ddb427abbc088a722e20974c4a98e81f0 100644 (file)
@@ -229,6 +229,12 @@ EINTERN Eina_Bool         e_output_external_set(E_Output *output, E_Output_Ext_S
 EINTERN void              e_output_external_unset(E_Output *output);
 EINTERN Eina_Bool         e_output_external_update(E_Output *output);
 EINTERN Eina_Bool         e_output_external_mode_change(E_Output *output, E_Output_Mode *mode);
+
+
+EINTERN void              e_output_norender_push(E_Output *output);
+EINTERN void              e_output_norender_pop(E_Output *output);
+EINTERN int               e_output_norender_get(E_Output *output);
+
 E_API E_Output          * e_output_find(const char *id);
 E_API E_Output          * e_output_find_by_index(int index);
 E_API const Eina_List   * e_output_planes_get(E_Output *output);