From: Changyeon Lee Date: Tue, 17 Nov 2020 04:10:49 +0000 (+0900) Subject: e_info_server: add -trace damage option X-Git-Tag: submit/tizen/20201119.103351~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ef73dcb180bbd24c533861417c5fef7367854e5f;p=platform%2Fupstream%2Fenlightenment.git e_info_server: add -trace damage option if -trace damage is enabled, log of damage is printed by ELOGF and green rectangle is rendered. Change-Id: I783d9cfeae8363031b434d9a409c8b819c1bf043 --- diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index 453db91bf3..cbe438c9f8 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -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; +} diff --git a/src/bin/e_comp_object.h b/src/bin/e_comp_object.h index 3434715d9d..071a3fcb56 100644 --- a/src/bin/e_comp_object.h +++ b/src/bin/e_comp_object.h @@ -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 diff --git a/src/bin/e_info_client.c b/src/bin/e_info_client.c index 5810e36892..a685021bfc 100644 --- a/src/bin/e_info_client.c +++ b/src/bin/e_info_client.c @@ -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: diff --git a/src/bin/e_info_server.c b/src/bin/e_info_server.c index 55407a8324..cd41a0f3ff 100644 --- a/src/bin/e_info_server.c +++ b/src/bin/e_info_server.c @@ -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) { @@ -4939,6 +4938,24 @@ e_info_server_cb_serial_trace_message(const Eldbus_Service_Interface *iface EINA return reply; } +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) { @@ -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}, diff --git a/src/bin/e_info_shared_types.h b/src/bin/e_info_shared_types.h index 791b2188fc..ba53c3bb7c 100644 --- a/src/bin/e_info_shared_types.h +++ b/src/bin/e_info_shared_types.h @@ -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 */