e_info_server: add -trace damage option 08/247808/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 17 Nov 2020 04:10:49 +0000 (13:10 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 17 Nov 2020 05:18:59 +0000 (14:18 +0900)
if -trace damage is enabled, log of damage is printed by ELOGF
and green rectangle is rendered.

Change-Id: I783d9cfeae8363031b434d9a409c8b819c1bf043

src/bin/e_comp_object.c
src/bin/e_comp_object.h
src/bin/e_info_client.c
src/bin/e_info_server.c
src/bin/e_info_shared_types.h

index 453db91..cbe438c 100644 (file)
@@ -214,6 +214,10 @@ static Eina_Inlist *_e_comp_object_intercept_hooks[] =
 };
 #endif
 
+static Eina_Bool _damage_trace = EINA_FALSE;
+static Eina_List *_damage_trace_objs = NULL;
+static Eina_List *_damage_trace_post_objs = NULL;
+
 /* sekrit functionzzz */
 EINTERN void e_client_focused_set(E_Client *ec);
 
@@ -4773,6 +4777,38 @@ e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
    e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
 }
 
+static void
+_e_comp_object_damage_trace_rect_set(Evas_Object *obj, Eina_Rectangle *origin, int dmg_x, int dmg_y, int dmg_w, int dmg_h)
+{
+   Evas_Object *o;
+   int obj_x, obj_y;
+
+   if (!_damage_trace) return;
+
+   API_ENTRY;
+
+   if (!evas_object_visible_get(cw->obj)) return;
+
+   evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
+
+   o = evas_object_rectangle_add(e_comp->evas);
+   evas_object_layer_set(o, E_LAYER_MAX);
+   evas_object_name_set(o, "damage_trace");
+   evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
+   evas_object_resize(o, dmg_w, dmg_h);
+   evas_object_color_set(o, 0, 128, 0, 128);
+   evas_object_render_op_set(o, EVAS_RENDER_BLEND);
+   evas_object_pass_events_set(o, EINA_TRUE);
+   evas_object_show(o);
+
+   ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
+         cw->ec,
+         dmg_w, dmg_h, dmg_x, dmg_y,
+         origin->w, origin->h, origin->x, origin->y);
+
+   _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
+}
+
 /* mark an object as dirty and setup damages */
 E_API void
 e_comp_object_dirty(Evas_Object *obj)
@@ -4837,9 +4873,13 @@ e_comp_object_dirty(Evas_Object *obj)
              _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
                                                       &damage_x, &damage_y, &damage_w, &damage_h);
              evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
+             _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
           }
         else
-          evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
+          {
+             evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
+             _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
+          }
 
         EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
           evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
@@ -6236,3 +6276,68 @@ e_comp_object_image_filter_get(Evas_Object *obj)
 
    return cw->image_filter;
 }
+
+static void
+_e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Evas_Object *obj;
+
+   if (!_damage_trace) return;
+
+   EINA_LIST_FREE(_damage_trace_post_objs, obj)
+     evas_object_del(obj);
+
+   _damage_trace_post_objs = NULL;
+}
+
+static void
+_e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   if (!_damage_trace) return;
+
+   _damage_trace_post_objs = _damage_trace_objs;
+   _damage_trace_objs = NULL;
+}
+
+EINTERN void
+e_comp_object_damage_trace_debug(Eina_Bool onoff)
+{
+   if (_damage_trace == onoff) return;
+
+   if (onoff)
+     {
+        evas_event_callback_add(e_comp->evas,
+                                EVAS_CALLBACK_RENDER_PRE,
+                                _e_comp_object_damage_trace_render_pre_cb,
+                                NULL);
+
+        evas_event_callback_add(e_comp->evas,
+                                EVAS_CALLBACK_RENDER_POST,
+                                _e_comp_object_damage_trace_render_post_cb,
+                                NULL);
+     }
+   else
+     {
+        Evas_Object *obj;
+
+        EINA_LIST_FREE(_damage_trace_objs, obj)
+          evas_object_del(obj);
+
+        _damage_trace_objs = NULL;
+
+        EINA_LIST_FREE(_damage_trace_post_objs, obj)
+          evas_object_del(obj);
+
+        _damage_trace_post_objs = NULL;
+
+        evas_event_callback_del(e_comp->evas,
+                                EVAS_CALLBACK_RENDER_PRE,
+                                _e_comp_object_damage_trace_render_pre_cb);
+
+        evas_event_callback_del(e_comp->evas,
+                                EVAS_CALLBACK_RENDER_POST,
+                                _e_comp_object_damage_trace_render_post_cb);
+     }
+
+   _damage_trace = onoff;
+}
index 3434715..071a3fc 100644 (file)
@@ -198,6 +198,9 @@ E_API Eina_Bool e_comp_object_native_usable_get(Evas_Object *obj);
 
 E_API Eina_Bool e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter);
 EINTERN E_Comp_Image_Filter e_comp_object_image_filter_get(Evas_Object *obj);
+
+EINTERN void e_comp_object_damage_trace_debug(Eina_Bool onoff);
+
 #endif
 #endif
 
index 5810e36..a685021 100644 (file)
@@ -3393,6 +3393,14 @@ _e_info_client_proc_trace(int argc, char **argv)
                }
              return;
           }
+        else if (eina_streq(argv[2], "damage"))
+          {
+             if (!_e_info_client_eldbus_message_with_args("trace_message_damage", NULL, "i", onoff))
+               {
+                  printf("_e_info_client_eldbus_message_with_args error");
+               }
+             return;
+          }
      }
 
 arg_err:
index 55407a8..cd41a0f 100644 (file)
@@ -4920,7 +4920,6 @@ e_info_server_cb_hwc_trace_message(const Eldbus_Service_Interface *iface EINA_UN
    return reply;
 }
 
-
 static Eldbus_Message *
 e_info_server_cb_serial_trace_message(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
 {
@@ -4940,6 +4939,24 @@ e_info_server_cb_serial_trace_message(const Eldbus_Service_Interface *iface EINA
 }
 
 static Eldbus_Message *
+e_info_server_cb_damage_trace_message(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+   uint32_t on;
+
+   if (!eldbus_message_arguments_get(msg, "i", &on))
+     {
+        ERR("Error getting arguments.");
+        return reply;
+     }
+
+   if (on == 0 || on == 1)
+     e_comp_object_damage_trace_debug(on);
+
+   return reply;
+}
+
+static Eldbus_Message *
 e_info_server_cb_prstt_trace_message(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
 {
    Eldbus_Message *reply = eldbus_message_method_return_new(msg);
@@ -7050,6 +7067,7 @@ static const Eldbus_Method methods[] = {
    { "trace_message_serial", ELDBUS_ARGS({"i", "trace_message_serial"}), NULL, e_info_server_cb_serial_trace_message, 0},
    { "trace_message_prstt", ELDBUS_ARGS({"i", "trace_message_presentation_time"}), NULL, e_info_server_cb_prstt_trace_message, 0},
    { "trace_message_exsync", ELDBUS_ARGS({"i", "trace_message_ex_sync"}), NULL, e_info_server_cb_exsync_trace_message, 0},
+   { "trace_message_damage", ELDBUS_ARGS({"i", "trace_message_damage"}), NULL, e_info_server_cb_damage_trace_message, 0},
    { "hwc", ELDBUS_ARGS({"i", "hwc"}), NULL, e_info_server_cb_hwc, 0},
    { "show_plane_state", NULL, NULL, e_info_server_cb_show_plane_state, 0},
    { "show_pending_commit", NULL, ELDBUS_ARGS({"a("VALUE_TYPE_FOR_PENDING_COMMIT")", "array of pending commit"}), e_info_server_cb_show_pending_commit, 0},
index 791b218..ba53c3b 100644 (file)
@@ -241,8 +241,10 @@ typedef enum
    "\tenlightenment_info -trace serial 0\n"                          \
    "\tenlightenment_info -trace prstt 1\n"                           \
    "\tenlightenment_info -trace prstt 0\n"                           \
-   "\tenlightenment_info -trace exsync 1\n"                           \
-   "\tenlightenment_info -trace exsync 0\n"
+   "\tenlightenment_info -trace exsync 1\n"                          \
+   "\tenlightenment_info -trace exsync 0\n"                          \
+   "\tenlightenment_info -trace damage 1\n"                          \
+   "\tenlightenment_info -trace damage 0\n"
 
 /* -------------------------------------------------------------------------- */
 /* HWC WINS                                                                   */