Add nocomp policy using e_comp_hwc 97/63197/1
authorJuyeon Lee <juyeonne.lee@samsung.com>
Tue, 22 Mar 2016 11:50:24 +0000 (20:50 +0900)
committerJuyeon Lee <juyeonne.lee@samsung.com>
Tue, 22 Mar 2016 11:50:47 +0000 (20:50 +0900)
Change-Id: I9dda8a0096171d7346a489e9d905f98d37bf7b16

src/bin/e_comp.c
src/bin/e_comp.h
src/bin/e_comp_cfdata.c
src/bin/e_comp_cfdata.h
src/bin/e_comp_object.c
src/bin/e_comp_wl.c

index e523c284ec6eecbfb07cfad3cef50e4eefe359e3..0d1c93c194e42e9ce86ee9cb13f0bd751c876b75 100644 (file)
@@ -3,6 +3,10 @@
 # include "e_comp_wl.h"
 #endif
 
+#ifdef HAVE_HWC
+# include "e_comp_hwc.h"
+#endif
+
 #define OVER_FLOW 1
 //#define SHAPE_DEBUG
 //#define BORDER_ZOOMAPS
@@ -178,21 +182,46 @@ _e_comp_fullscreen_check(void)
    E_CLIENT_REVERSE_FOREACH(ec)
      {
         Evas_Object *o = ec->frame;
+        E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
+        int ow, oh, vw, vh;
 
+        // check clients to skip in nocomp condition
         if (ec->ignored || ec->input_only || (!evas_object_visible_get(ec->frame)))
           continue;
-        if (!e_comp_util_client_is_fullscreen(ec))
+
+        if (!E_INTERSECTS(0, 0, e_comp->w, e_comp->h,
+                          ec->client.x, ec->client.y, ec->client.w, ec->client.h))
           {
-             if (evas_object_data_get(ec->frame, "comp_skip")) continue;
-             return NULL;
+             continue;
           }
-        while (o)
+
+        if (evas_object_data_get(ec->frame, "comp_skip"))
+          continue;
+
+
+        if ((!cdata->buffer_ref.buffer) &&
+            (cdata->buffer_ref.buffer->type != E_COMP_WL_BUFFER_TYPE_NATIVE))
+          break;
+
+        ow = cdata->width_from_buffer;
+        oh = cdata->height_from_buffer;
+        vw = cdata->width_from_viewport;
+        vh = cdata->height_from_viewport;
+
+        if ((ec->client.x == 0) && (ec->client.y == 0) &&
+            ((ec->client.w) >= e_comp->w) &&
+            ((ec->client.h) >= e_comp->h) &&
+            (ow >= e_comp->w) &&
+            (oh >= e_comp->h) &&
+            (vw == ow) &&
+            (vh == oh) &&
+            (!ec->argb) &&
+            (!ec->shaped))
           {
-             if (_e_comp_visible_object_is_above
-                 (o, 0, 0, e_comp->w, e_comp->h)) return NULL;
-             o = evas_object_smart_parent_get(o);
+             return ec;
           }
-        return ec;
+        else
+          break;
      }
    return NULL;
 }
@@ -227,6 +256,8 @@ _e_comp_fps_update(void)
      }
 }
 
+
+#ifdef LEGACY_NOCOMP
 static void
 _e_comp_cb_nocomp_begin(void)
 {
@@ -304,6 +335,106 @@ _e_comp_cb_nocomp_begin_timeout(void *data EINA_UNUSED)
    return EINA_FALSE;
 }
 
+static void
+_e_comp_nocomp_end(void)
+{
+   e_comp->nocomp_want = 0;
+   E_FREE_FUNC(e_comp->nocomp_delay_timer, ecore_timer_del);
+   _e_comp_cb_nocomp_end();
+   if (e_comp->nocomp_ec)
+     {
+        E_Layer layer = MAX(e_comp->nocomp_ec->saved.layer, E_LAYER_CLIENT_NORMAL);
+        Eina_Bool fs;
+
+        fs = e_comp->nocomp_ec->fullscreen;
+        e_comp->nocomp_ec->fullscreen = 0;
+        if (fs)
+          layer = E_LAYER_CLIENT_FULLSCREEN;
+        evas_object_layer_set(e_comp->nocomp_ec->frame, layer);
+        e_comp->nocomp_ec->fullscreen = fs;
+     }
+   e_comp->nocomp_ec = NULL;
+}
+
+#else
+static void
+_e_comp_cb_nocomp_begin(void)
+{
+   E_Client *ec;
+   Eina_Bool mode_set = EINA_FALSE;
+   if (!e_comp->hwc) return;
+   if (e_comp->nocomp) return;
+   E_FREE_FUNC(e_comp->nocomp_delay_timer, ecore_timer_del);
+
+   ec = _e_comp_fullscreen_check();
+   if (!ec) return;
+
+#ifdef HAVE_HWC
+   mode_set = e_comp_hwc_mode_nocomp(ec);
+#endif
+   if (!mode_set) return;
+
+   e_comp->nocomp_ec = ec;
+   e_comp->nocomp = 1;
+
+   INF("JOB2...");
+   e_comp_render_queue();
+   e_comp_shape_queue_block(1);
+   ecore_event_add(E_EVENT_COMPOSITOR_DISABLE, NULL, NULL, NULL);
+}
+
+static void
+_e_comp_cb_nocomp_end(void)
+{
+   E_Client *ec;
+   Eina_Bool mode_set = EINA_FALSE;
+
+   if (!e_comp->nocomp) return;
+   if (!e_comp->hwc) return;
+
+#ifdef HAVE_HWC
+   mode_set = e_comp_hwc_mode_nocomp(NULL);
+#endif
+   if (!mode_set) return;
+
+   INF("COMP RESUME!");
+
+   E_CLIENT_FOREACH(ec)
+     {
+        if (ec->visible && (!ec->input_only))
+          e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
+
+     }
+   e_comp->nocomp = 0;
+   e_comp_render_queue();
+   e_comp_shape_queue_block(0);
+   ecore_event_add(E_EVENT_COMPOSITOR_ENABLE, NULL, NULL, NULL);
+}
+
+static Eina_Bool
+_e_comp_cb_nocomp_begin_timeout(void *data EINA_UNUSED)
+{
+   e_comp->nocomp_delay_timer = NULL;
+
+   if (e_comp->nocomp_override == 0)
+     {
+        if (_e_comp_fullscreen_check()) e_comp->nocomp_want = 1;
+        _e_comp_cb_nocomp_begin();
+     }
+   return EINA_FALSE;
+}
+
+E_API void
+e_comp_nocomp_end(char *location)
+{
+   e_comp->nocomp_want = 0;
+   E_FREE_FUNC(e_comp->nocomp_delay_timer, ecore_timer_del);
+   INF("HWC : NOCOMP_END at %s\n", location);
+   _e_comp_cb_nocomp_end();
+   e_comp->nocomp_ec = NULL;
+}
+
+#endif
 
 static void
 _e_comp_client_update(E_Client *ec)
@@ -343,27 +474,6 @@ _e_comp_client_update(E_Client *ec)
      }
 }
 
-static void
-_e_comp_nocomp_end(void)
-{
-   e_comp->nocomp_want = 0;
-   E_FREE_FUNC(e_comp->nocomp_delay_timer, ecore_timer_del);
-   _e_comp_cb_nocomp_end();
-   if (e_comp->nocomp_ec)
-     {
-        E_Layer layer = MAX(e_comp->nocomp_ec->saved.layer, E_LAYER_CLIENT_NORMAL);
-        Eina_Bool fs;
-
-        fs = e_comp->nocomp_ec->fullscreen;
-        e_comp->nocomp_ec->fullscreen = 0;
-        if (fs)
-          layer = E_LAYER_CLIENT_FULLSCREEN;
-        evas_object_layer_set(e_comp->nocomp_ec->frame, layer);
-        e_comp->nocomp_ec->fullscreen = fs;
-     }
-   e_comp->nocomp_ec = NULL;
-}
-
 static Eina_Bool
 _e_comp_cb_update(void)
 {
@@ -499,6 +609,14 @@ _e_comp_cb_update(void)
    if (e_comp->updates && (!e_comp->update_job))
      ecore_animator_thaw(e_comp->render_animator);
 nocomp:
+   // TO DO :
+   // query if selective HWC plane can be used
+   if (!e_comp_gl_get() && !e_comp->hwc)
+     {
+        TRACE_DS_END();
+        return ECORE_CALLBACK_RENEW;
+     }
+
    ec = _e_comp_fullscreen_check();
    if (ec)
      {
@@ -506,34 +624,30 @@ nocomp:
           {
              if (e_comp->nocomp && e_comp->nocomp_ec)
                {
-                  E_Client *nec = NULL;
-                  for (ec = e_client_top_get(), nec = e_client_below_get(ec);
-                       (ec && nec) && (ec != nec); ec = nec, nec = e_client_below_get(ec))
+                  if (ec != e_comp->nocomp_ec)
+                    e_comp_nocomp_end("_e_comp_cb_update : nocomp_ec != ec");
+               }
+             else if ((!e_comp->nocomp) && (!e_comp->nocomp_override))
+               {
+                  if (conf->nocomp_use_timer)
                     {
-                       if (ec == e_comp->nocomp_ec) break;
-                       if (evas_object_layer_get(ec->frame) < evas_object_layer_get(e_comp->nocomp_ec->frame)) break;
-                       if (e_client_is_stacking(ec)) continue;
-                       if (!ec->visible) continue;
-                       if (evas_object_data_get(ec->frame, "comp_skip")) continue;
-                       if (e_object_is_del(E_OBJECT(ec)) || (!e_client_util_desk_visible(ec, e_desk_current_get(ec->zone)))) continue;
-                       if (ec->override)
+                       if (!e_comp->nocomp_delay_timer)
                          {
-                            _e_comp_nocomp_end();
-                            break;
+                            e_comp->nocomp_delay_timer = ecore_timer_add(conf->nocomp_begin_timeout,
+                                                                         _e_comp_cb_nocomp_begin_timeout,
+                                                                         NULL);
                          }
-                       else
-                         evas_object_stack_below(ec->frame, e_comp->nocomp_ec->frame);
                     }
-               }
-             else if ((!e_comp->nocomp) && (!e_comp->nocomp_override))
-               {
-                  if (!e_comp->nocomp_delay_timer)
-                    e_comp->nocomp_delay_timer = ecore_timer_add(1.0, _e_comp_cb_nocomp_begin_timeout, NULL);
+                  else
+                    {
+                       e_comp->nocomp_want = 1;
+                       _e_comp_cb_nocomp_begin();
+                    }
                }
           }
      }
    else
-     _e_comp_nocomp_end();
+     e_comp_nocomp_end("_e_comp_cb_update : ec is not fullscreen");
 
    TRACE_DS_END();
 
@@ -873,9 +987,9 @@ _e_comp_free(E_Comp *c)
 static Eina_Bool
 _e_comp_object_add(void *d EINA_UNUSED, int t EINA_UNUSED, E_Event_Comp_Object *ev)
 {
-   if ((!e_comp->nocomp) || (!e_comp->nocomp_ec)) return ECORE_CALLBACK_RENEW;
-   if (evas_object_layer_get(ev->comp_object) > MAX(e_comp->nocomp_ec->saved.layer, E_LAYER_CLIENT_NORMAL))
-     _e_comp_nocomp_end();
+   //if ((!e_comp->nocomp) || (!e_comp->nocomp_ec)) return ECORE_CALLBACK_RENEW;
+   //if (evas_object_layer_get(ev->comp_object) > MAX(e_comp->nocomp_ec->saved.layer, E_LAYER_CLIENT_NORMAL))
+   //  e_comp_nocomp_end();
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -1048,6 +1162,16 @@ e_comp_init(void)
    e_comp_canvas_fake_layers_init();
    e_screensaver_update();
 
+#ifdef HAVE_HWC
+   // TO DO : check hwc init condition
+   if (conf->hwc)
+     {
+        e_comp->hwc = e_comp_hwc_init();
+        if (!e_comp->hwc)
+          WRN("fail to init hwc.");
+     }
+#endif
+
    E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_ON,  _e_comp_screensaver_on,  NULL);
    E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_OFF, _e_comp_screensaver_off, NULL);
    E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_KEY_DOWN,    _e_comp_key_down,        NULL);
@@ -1095,6 +1219,11 @@ e_comp_shutdown(void)
         _e_launchscreen_free(e_comp->launchscrn);
      }
 
+#ifdef HAVE_HWC
+   if (e_comp->hwc)
+     e_comp_hwc_shutdown();
+#endif
+
    e_comp_wl_shutdown();
 
    e_object_del(E_OBJECT(e_comp));
@@ -1291,7 +1420,7 @@ E_API void
 e_comp_override_add()
 {
    e_comp->nocomp_override++;
-   if ((e_comp->nocomp_override > 0) && (e_comp->nocomp)) _e_comp_nocomp_end();
+   if ((e_comp->nocomp_override > 0) && (e_comp->nocomp)) e_comp_nocomp_end(__FUNCTION__);
 }
 
 E_API E_Comp *
@@ -1387,7 +1516,7 @@ e_comp_grab_input(Eina_Bool mouse, Eina_Bool kbd)
      mwin = e_comp->ee_win;
    if (kbd || e_comp->input_mouse_grabs)
      kwin = e_comp->ee_win;
-   e_comp_override_add();
+   //e_comp_override_add(); //nocomp condition
    if ((e_comp->input_mouse_grabs && e_comp->input_key_grabs) ||
        e_grabinput_get(mwin, 0, kwin))
      {
@@ -1413,7 +1542,7 @@ e_comp_ungrab_input(Eina_Bool mouse, Eina_Bool kbd)
      mwin = e_comp->ee_win;
    if (kbd && (!e_comp->input_key_grabs))
      kwin = e_comp->ee_win;
-   e_comp_override_timed_pop();
+   //e_comp_override_timed_pop(); //nocomp condition
    if ((!mwin) && (!kwin)) return;
    e_grabinput_release(mwin, kwin);
    evas_event_feed_mouse_out(e_comp->evas, 0, NULL);
index 98755c7005229a16516450ef23c6a55077d59d21..0ac6d6c829a92147d70980b349dc54e96de1e705 100644 (file)
@@ -173,6 +173,7 @@ struct _E_Comp
    Eina_Bool       saver : 1;
    Eina_Bool       shape_queue_blocked : 1;
    Eina_Bool       calc_fps : 1;
+   Eina_Bool       hwc : 1;
 
    Eina_List      *connected_clients;
 };
@@ -241,6 +242,8 @@ E_API Eina_Bool e_comp_util_object_is_above_nocomp(Evas_Object *obj);
 E_API Eina_Bool e_comp_util_kbd_grabbed(void);
 E_API Eina_Bool e_comp_util_mouse_grabbed(void);
 
+E_API void e_comp_nocomp_end(char *location);
+
 static inline Eina_Bool
 e_comp_util_client_is_fullscreen(const E_Client *ec)
 {
index 80b4d91ea0c298225e321fa86abecdceb755a7c0..e533a856ae4f85e08b40a274ca96c7a1371a92bd 100644 (file)
@@ -50,6 +50,9 @@ e_comp_cfdata_edd_init(E_Config_DD **conf_edd, E_Config_DD **match_edd)
    E_CONFIG_VAL(D, T, send_flush, UCHAR);
    E_CONFIG_VAL(D, T, send_dump, UCHAR);
    E_CONFIG_VAL(D, T, nocomp_fs, UCHAR);
+   E_CONFIG_VAL(D, T, nocomp_use_timer, UCHAR);
+   E_CONFIG_VAL(D, T, nocomp_begin_timeout, DOUBLE);
+   E_CONFIG_VAL(D, T, hwc, UCHAR);
    E_CONFIG_VAL(D, T, nofade, UCHAR);
    E_CONFIG_VAL(D, T, smooth_windows, UCHAR);
    E_CONFIG_VAL(D, T, first_draw_delay, DOUBLE);
@@ -104,6 +107,9 @@ e_comp_cfdata_config_new(void)
    cfg->send_flush = 1; // implement
    cfg->send_dump = 1; // implement
    cfg->nocomp_fs = 1;
+   cfg->nocomp_use_timer = 1;
+   cfg->nocomp_begin_timeout = 2.0;
+   cfg->hwc = 0;
    cfg->nofade = 0;
    cfg->smooth_windows = 0; // 1 if gl, 0 if not
    cfg->first_draw_delay = 0.15;
index d07384773fa4889060792d7a7003d8f852f11e60..a158a9de435a3bf178f7ef9367547c3f554f00e3 100644 (file)
@@ -27,6 +27,9 @@ struct _E_Comp_Config
    unsigned char send_flush;
    unsigned char send_dump;
    unsigned char nocomp_fs;
+   unsigned char nocomp_use_timer;
+   double        nocomp_begin_timeout;
+   unsigned char hwc;
    unsigned char smooth_windows;
    unsigned char nofade;
    double        first_draw_delay;
index 45c1fc8c1a2fded3adc48fa7834356ebf836c07e..d7bad626869a50092be88dab85c710a5b258eceb 100644 (file)
@@ -258,6 +258,9 @@ _e_comp_object_cb_mirror_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
    if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
      evas_object_smart_callback_call(cw->smart_obj, "visibility_force", cw->ec);
    cw->force_visible++;
+
+   if (e_comp->hwc && e_comp->nocomp_ec != cw->ec)
+     e_comp_nocomp_end(__FUNCTION__);
 }
 
 static void
@@ -1488,6 +1491,7 @@ _e_comp_intercept_lower(void *data, Evas_Object *obj)
    evas_object_lower(obj);
    evas_object_data_del(obj, "client_restack");
    if (!cw->visible) goto end;
+   if (e_comp->hwc &&e_comp->nocomp_ec == cw->ec) e_comp_nocomp_end(__FUNCTION__);
    e_comp_render_queue();
    e_comp_shape_queue();
 
@@ -1537,6 +1541,8 @@ _e_comp_intercept_raise(void *data, Evas_Object *obj)
           e_client_raise_latest_set(cw->ec); //modify raise list if necessary
      }
    if (!cw->visible) goto end;
+   if (e_comp->hwc &&e_comp->nocomp_ec != cw->ec)
+      e_comp_nocomp_end(__FUNCTION__);
    e_comp_render_queue();
    e_comp_shape_queue();
 
@@ -1593,6 +1599,7 @@ _e_comp_intercept_hide(void *data, Evas_Object *obj)
                e_comp_object_effect_set(obj, NULL);
           }
      }
+   if (e_comp->hwc &&e_comp->nocomp_ec == cw->ec) e_comp_nocomp_end(__FUNCTION__);
    if (cw->animating) return;
    /* if we have no animations running, go ahead and hide */
    cw->defer_hide = 0;
index 4c63211ea1ef7c340a567be54224f450b3141403..78011a87acbc08c85a69dcc58517b6d51fc030df 100644 (file)
@@ -20,6 +20,10 @@ E_API int E_EVENT_WAYLAND_GLOBAL_ADD = -1;
 # define EGL_WIDTH                     0x3057
 #endif
 
+#ifdef HAVE_HWC
+# include "e_comp_hwc.h"
+#endif
+
 /* Resource Data Mapping: (wl_resource_get_user_data)
  *
  * wl_surface == e_pixmap
@@ -2212,6 +2216,18 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
 
    _e_comp_wl_subsurface_check_below_bg_rectangle(ec);
 
+#ifdef HAVE_HWC
+   /* HWC: if the compositor fall into the nocomposite mode,
+          the compositor display e_client on the hw layer directly */
+   if (e_comp->hwc &&
+       e_comp->nocomp &&
+       e_comp->nocomp_ec == ec &&
+       buffer)
+     {
+        e_comp_hwc_display_client(ec);
+     }
+#endif
+
    if (!state->buffer_viewport.changed &&
        (buffer && buffer->type == E_COMP_WL_BUFFER_TYPE_VIDEO) &&
        e_comp->wl_comp_data->available_hw_accel.underlay)