From: Boram Park Date: Tue, 12 Dec 2017 02:44:44 +0000 (+0900) Subject: monitor: enhance ttrace option for layer, pp, capture X-Git-Tag: accepted/tizen/unified/20171213.040821~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F50%2F163550%2F1;p=platform%2Fcore%2Fuifw%2Flibtdm.git monitor: enhance ttrace option for layer, pp, capture Change-Id: I3c142a49bff04844734137ea912cd5a84a81e05c --- diff --git a/src/tdm.c b/src/tdm.c index 418010c..a66ebad 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -679,6 +679,8 @@ tdm_display_update(tdm_display *dpy) int tdm_debug_module; int tdm_debug_dump; +int tdm_ttrace_module; +int tdm_ttrace_output; static tdm_private_display *g_private_display; static pthread_mutex_t gLock = PTHREAD_MUTEX_INITIALIZER; @@ -1362,6 +1364,75 @@ enable_fail: } INTERN tdm_error +tdm_display_enable_ttrace(tdm_private_display *private_display, const char *ttrace, int output_id, char *reply, int *len) +{ + char temp[TDM_PATH_LEN]; + char *arg; + char *end; + tdm_output *output; + tdm_error ret; + tdm_output_type type; + + snprintf(temp, TDM_PATH_LEN, "%s", ttrace); + + tdm_ttrace_output = output_id; + tdm_ttrace_module = 0; + + output = tdm_display_get_output(private_display, output_id, &ret); + if (!output) { + TDM_SNPRINTF(reply, len, "can't find the output_id(%d)\n", output_id); + return ret; + } + + ret = tdm_output_get_output_type(output, &type); + if (ret != TDM_ERROR_NONE) { + TDM_SNPRINTF(reply, len, "can't find the type of output_id(%d)\n", output_id); + return ret; + } + + arg = strtok_r(temp, TDM_DELIM, &end); + while (arg) { + if (!strncmp(arg, "none", 4)) + tdm_ttrace_module = 0; + else if (!strncmp(arg, "all", 3)) + tdm_ttrace_module = 0xFFFFFFFF; + else if (!strncmp(arg, "vblank", 6)) + tdm_ttrace_module |= TDM_TTRACE_VBLANK; + else if (!strncmp(arg, "client", 6)) + tdm_ttrace_module |= TDM_TTRACE_CLIENT; + else if (!strncmp(arg, "layer", 5)) + tdm_ttrace_module |= TDM_TTRACE_LAYER; + else if (!strncmp(arg, "pp", 2)) + tdm_ttrace_module |= TDM_TTRACE_PP; + else if (!strncmp(arg, "capture", 7)) + tdm_ttrace_module |= TDM_TTRACE_CAPTURE; + else { + tdm_ttrace_module = 0; + tdm_display_enable_ttrace_vblank(private_display, NULL, 0); + tdm_server_enable_ttrace_client_vblank(private_display, NULL, 0); + TDM_SNPRINTF(reply, len, "unknown option: '%s'\n", arg); + return TDM_ERROR_NONE; + } + + arg = strtok_r(NULL, TDM_DELIM, &end); + } + + TDM_SNPRINTF(reply, len, "ttrace debugging... '%s' %x\n", ttrace, tdm_ttrace_module); + + if (tdm_ttrace_module & TDM_TTRACE_VBLANK) + tdm_display_enable_ttrace_vblank(private_display, output, 1); + else + tdm_display_enable_ttrace_vblank(private_display, NULL, 0); + + if (tdm_ttrace_module & TDM_TTRACE_CLIENT) + tdm_server_enable_ttrace_client_vblank(private_display, output, 1); + else + tdm_server_enable_ttrace_client_vblank(private_display, NULL, 0); + + return TDM_ERROR_NONE; +} + +INTERN tdm_error tdm_display_enable_fps(tdm_private_display *private_display, int enable) { private_display->print_fps = enable; diff --git a/src/tdm_capture.c b/src/tdm_capture.c index bfb9e40..f0b4be6 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -141,6 +141,11 @@ tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("capture(%p) done: %p", private_capture, buffer); + if (tdm_ttrace_module & TDM_TTRACE_CAPTURE) { + tbm_bo bo = tbm_surface_internal_get_bo(buffer, 0); + TDM_TRACE_ASYNC_END((int)private_capture, "[CAPTURE] %d", tbm_bo_export(bo)); + } + if (!LIST_IS_EMPTY(&private_capture->buffer_list)) { first_entry = container_of((&private_capture->buffer_list)->next, capture_buffer, link); if (first_entry->buffer != buffer) @@ -370,6 +375,12 @@ tdm_capture_destroy_internal(tdm_private_capture *private_capture) _pthread_mutex_unlock(&private_display->lock); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { LIST_DEL(&b->link); + + if (tdm_ttrace_module & TDM_TTRACE_CAPTURE) { + tbm_bo bo = tbm_surface_internal_get_bo(b->buffer, 0); + TDM_TRACE_ASYNC_END((int)private_capture, "[CAPTURE] %d", tbm_bo_export(bo)); + } + tdm_buffer_unref_backend(b->buffer); free(b); } @@ -389,6 +400,12 @@ tdm_capture_destroy_internal(tdm_private_capture *private_capture) _pthread_mutex_unlock(&private_display->lock); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { LIST_DEL(&b->link); + + if (tdm_ttrace_module & TDM_TTRACE_CAPTURE) { + tbm_bo bo = tbm_surface_internal_get_bo(b->buffer, 0); + TDM_TRACE_ASYNC_END((int)private_capture, "[CAPTURE] %d", tbm_bo_export(bo)); + } + tdm_buffer_unref_backend(b->buffer); free(b); } @@ -544,6 +561,11 @@ tdm_capture_attach(tdm_capture *capture, tbm_surface_h buffer) tdm_buffer_list_dump(&private_capture->buffer_list); } + if (tdm_ttrace_module & TDM_TTRACE_CAPTURE) { + tbm_bo bo = tbm_surface_internal_get_bo(buffer, 0); + TDM_TRACE_ASYNC_BEGIN((int)capture, "[CAPTURE] %d", tbm_bo_export(bo)); + } + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 5d3d1c9..d378622 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -453,11 +453,17 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) private_layer->pending_buffer_changed = 1; if (private_layer->pending_buffer) { - tbm_surface_internal_unref(private_layer->pending_buffer); if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p) pending_buffer(%p) skipped", private_layer, private_layer->pending_buffer); + + if (tdm_ttrace_module & TDM_TTRACE_LAYER) { + tbm_bo bo = tbm_surface_internal_get_bo(private_layer->pending_buffer, 0); + TDM_TRACE_ASYNC_END((int)private_layer, "[LAYER] %d", tbm_bo_export(bo)); + } + + tbm_surface_internal_unref(private_layer->pending_buffer); } tbm_surface_internal_ref(buffer); @@ -467,6 +473,11 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) TDM_INFO("layer(%p) pending_buffer(%p)", private_layer, private_layer->pending_buffer); + if (tdm_ttrace_module & TDM_TTRACE_LAYER) { + tbm_bo bo = tbm_surface_internal_get_bo(private_layer->pending_buffer, 0); + TDM_TRACE_ASYNC_BEGIN((int)private_layer, "[LAYER] %d", tbm_bo_export(bo)); + } + _pthread_mutex_unlock(&private_display->lock); return ret; @@ -528,8 +539,14 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer * } /* LCOV_EXCL_STOP */ - if (private_layer->showing_buffer) + if (private_layer->showing_buffer) { + if (tdm_ttrace_module & TDM_TTRACE_LAYER) { + tbm_bo bo = tbm_surface_internal_get_bo(private_layer->showing_buffer->buffer, 0); + TDM_TRACE_ASYNC_END((int)private_layer, "[LAYER] %d", tbm_bo_export(bo)); + } + _tdm_layer_free_buffer(private_layer, private_layer->showing_buffer); + } private_layer->showing_buffer = *committed_buffer; *committed_buffer = NULL; diff --git a/src/tdm_monitor_server.c b/src/tdm_monitor_server.c index ea56a8b..7dbdc3c 100644 --- a/src/tdm_monitor_server.c +++ b/src/tdm_monitor_server.c @@ -107,57 +107,22 @@ _tdm_monitor_server_dpms(unsigned int pid, char *cwd, int argc, char *argv[], ch } static void -_tdm_monitor_server_ttrace_vblank(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) +_tdm_monitor_server_ttrace(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { - int ttrace_vblank, output_id = 0; - char *arg; + int output_id = 0; char *end; + tdm_error ret; if (argc < 3) { _tdm_monitor_server_usage(argv[0], reply, len); return; } - arg = argv[2]; - ttrace_vblank = strtol(arg, &end, 10); - - if (ttrace_vblank > 0) { - tdm_output *output; - tdm_error ret; - tdm_output_type type; - char *temp; - - if (*end == '@') { - arg = end + 1; - output_id = strtol(arg, &end, 10); - } - - output = tdm_display_get_output(dpy, output_id, NULL); - if (!output) { - TDM_SNPRINTF(reply, len, "can't find the output_id(%d)\n", output_id); - return; - } - - ret = tdm_output_get_output_type(output, &type); - if (ret != TDM_ERROR_NONE) { - TDM_SNPRINTF(reply, len, "can't find the type of output_id(%d)\n", output_id); - return; - } - - temp = "server"; - tdm_display_enable_ttrace_vblank(dpy, output, 1); - - if (ttrace_vblank > 1) { - temp = "clients"; - tdm_server_enable_ttrace_vblank(dpy, output, 1); - } + if (argv[3]) + output_id = strtol(argv[3], &end, 10); - TDM_SNPRINTF(reply, len, "enable ttrace vblank for '%s': %s \n", tdm_conn_str(type), temp); - } else { - tdm_display_enable_ttrace_vblank(dpy, NULL, 0); - tdm_server_enable_ttrace_vblank(dpy, NULL, 0); - TDM_SNPRINTF(reply, len, "disable ttrace vblank\n"); - } + ret = tdm_display_enable_ttrace(dpy, argv[2], output_id, reply, len); + TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); } static void @@ -547,9 +512,10 @@ static struct { "set output dpms", ":", "0:3 or 0:0" }, { - "ttrace_vblank", _tdm_monitor_server_ttrace_vblank, - "enable/disable the vblank for ttrace [0:disable, 1:server, 2:clients]", - "[@]", "0 or 1 or 2 or 1@0 or 2@0 or 1@1 or 2@1" + "ttrace", _tdm_monitor_server_ttrace, + "enable/disable ttrace (module: none, vblank, client, layer, pp, capture, all", + "[@]", + NULL }, { "debug", _tdm_monitor_server_debug, diff --git a/src/tdm_pp.c b/src/tdm_pp.c index a58e4fc..53f8c73 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -139,9 +139,6 @@ tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, /* LCOV_EXCL_STOP */ } - if (tdm_debug_module & TDM_DEBUG_BUFFER) - TDM_INFO("pp(%p) done: src(%p) dst(%p)", private_pp, src, dst); - if (!LIST_IS_EMPTY(&private_pp->buffer_list)) { first_entry = container_of((&private_pp->buffer_list)->next, pp_buffer, link); if (first_entry->src != src || first_entry->dst != dst) @@ -154,6 +151,14 @@ tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, LIST_DEL(&pp_buffer->link); LIST_DELINIT(&pp_buffer->commit_link); + if (tdm_debug_module & TDM_DEBUG_BUFFER) + TDM_INFO("pp(%p) done: src(%p) dst(%p)", private_pp, src, dst); + + if (tdm_ttrace_module & TDM_TTRACE_PP) { + tbm_bo bo = tbm_surface_internal_get_bo(dst, 0); + TDM_TRACE_ASYNC_END((int)private_pp, "[PP] %d", tbm_bo_export(bo)); + } + _pthread_mutex_unlock(&private_display->lock); if (private_pp->done_func) private_pp->done_func(private_pp, src, dst, private_pp->done_user_data); @@ -285,6 +290,12 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp) _pthread_mutex_unlock(&private_display->lock); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { LIST_DEL(&b->link); + + if (tdm_ttrace_module & TDM_TTRACE_PP) { + tbm_bo bo = tbm_surface_internal_get_bo(b->dst, 0); + TDM_TRACE_ASYNC_END((int)private_pp, "[PP] %d", tbm_bo_export(bo)); + } + tdm_buffer_unref_backend(b->src); tdm_buffer_unref_backend(b->dst); free(b); @@ -305,6 +316,12 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp) _pthread_mutex_unlock(&private_display->lock); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { LIST_DEL(&b->link); + + if (tdm_ttrace_module & TDM_TTRACE_PP) { + tbm_bo bo = tbm_surface_internal_get_bo(b->dst, 0); + TDM_TRACE_ASYNC_END((int)private_pp, "[PP] %d", tbm_bo_export(bo)); + } + tdm_buffer_unref_backend(b->src); tdm_buffer_unref_backend(b->dst); free(b); @@ -467,6 +484,11 @@ tdm_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst) _tdm_pp_print_list(&private_pp->pending_buffer_list); } + if (tdm_ttrace_module & TDM_TTRACE_PP) { + tbm_bo bo = tbm_surface_internal_get_bo(dst, 0); + TDM_TRACE_ASYNC_BEGIN((int)pp, "[PP] %d", tbm_bo_export(bo)); + } + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private.h b/src/tdm_private.h index 37cceb0..8c710a8 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -86,8 +86,19 @@ enum { TDM_DEBUG_COMMIT = (1 << 5), }; +enum { + TDM_TTRACE_NONE, + TDM_TTRACE_VBLANK = (1 << 0), + TDM_TTRACE_CLIENT = (1 << 1), + TDM_TTRACE_LAYER = (1 << 2), + TDM_TTRACE_PP = (1 << 3), + TDM_TTRACE_CAPTURE = (1 << 4), +}; + extern int tdm_debug_module; extern int tdm_debug_dump; +extern int tdm_ttrace_module; +extern int tdm_ttrace_output; #ifdef HAVE_TTRACE #include @@ -238,7 +249,6 @@ struct _tdm_private_output { /* for ttrace vblank */ tdm_vblank *ttrace_vblank; - unsigned int ttrace_vblank_client; }; struct _tdm_private_layer { @@ -658,7 +668,7 @@ tdm_server_deinit(tdm_private_loop *private_loop); const char* tdm_server_get_client_name(pid_t pid); tdm_error -tdm_server_enable_ttrace_vblank(tdm_display *dpy, tdm_output *output, int enable); +tdm_server_enable_ttrace_client_vblank(tdm_display *dpy, tdm_output *output, int enable); char * tdm_helper_dump_make_directory(const char *path, char *reply, int *len); @@ -753,7 +763,7 @@ tdm_display_enable_dump(tdm_private_display *private_display, const char *dump_s tdm_error tdm_display_enable_path(const char *path); tdm_error -tdm_display_enable_ttrace_vblank(tdm_display *dpy, tdm_output *output, int enable); +tdm_display_enable_ttrace(tdm_private_display *private_display, const char *ttrace, int output_id, char *reply, int *len); tdm_error tdm_display_enable_fps(tdm_private_display *private_display, int enable); diff --git a/src/tdm_server.c b/src/tdm_server.c index 3932819..3d9daf3 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -88,7 +88,6 @@ typedef struct _tdm_server_client_info { pid_t pid; char name[TDM_NAME_LEN]; struct wl_resource *resource; - tdm_private_server *private_server; } tdm_server_client_info; static tdm_private_server *keep_private_server; @@ -169,7 +168,6 @@ _tdm_server_send_done(tdm_server_wait_info *wait_info, tdm_error error, { tdm_server_wait_info *found; tdm_server_vblank_info *vblank_info; - tdm_private_output *private_output; if (!keep_private_server) return; @@ -188,10 +186,6 @@ _tdm_server_send_done(tdm_server_wait_info *wait_info, tdm_error error, wl_tdm_vblank_send_done(vblank_info->resource, wait_info->req_id, sequence, tv_sec, tv_usec, error); - private_output = vblank_info->output_info->output; - if (private_output->ttrace_vblank_client) - TDM_TRACE_ASYNC_END((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp); - destroy_wait(wait_info); } /* LCOV_EXCL_STOP */ @@ -322,7 +316,6 @@ _tdm_server_vblank_cb_wait_vblank(struct wl_client *client, struct wl_resource * tdm_server_vblank_info *vblank_info = wl_resource_get_user_data(resource); tdm_server_output_info *output_info = vblank_info->output_info; tdm_private_server *private_server = output_info->private_server; - tdm_private_output *private_output = output_info->output; tdm_server_wait_info *wait_info; unsigned int enable_fake = 0; tdm_error ret; @@ -346,10 +339,6 @@ _tdm_server_vblank_cb_wait_vblank(struct wl_client *client, struct wl_resource * if (tdm_debug_module & TDM_DEBUG_VBLANK) TDM_DBG("req_id(%d) wait", req_id); - private_output = vblank_info->output_info->output; - if (private_output->ttrace_vblank_client) - TDM_TRACE_ASYNC_BEGIN((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp); - ret = tdm_vblank_wait(vblank_info->vblank, req_sec, req_usec, interval, _tdm_server_cb_vblank, wait_info); tdm_vblank_get_enable_fake(vblank_info->vblank, &enable_fake); @@ -376,7 +365,6 @@ _tdm_server_vblank_cb_wait_vblank_seq(struct wl_client *client, struct wl_resour tdm_server_vblank_info *vblank_info = wl_resource_get_user_data(resource); tdm_server_output_info *output_info = vblank_info->output_info; tdm_private_server *private_server = output_info->private_server; - tdm_private_output *private_output = output_info->output; tdm_server_wait_info *wait_info; unsigned int enable_fake = 0; tdm_error ret; @@ -400,10 +388,6 @@ _tdm_server_vblank_cb_wait_vblank_seq(struct wl_client *client, struct wl_resour if (tdm_debug_module & TDM_DEBUG_VBLANK) TDM_DBG("req_id(%d) wait", req_id); - private_output = vblank_info->output_info->output; - if (private_output->ttrace_vblank_client) - TDM_TRACE_ASYNC_BEGIN((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp); - ret = tdm_vblank_wait_seq(vblank_info->vblank, req_sec, req_usec, sequence, _tdm_server_cb_vblank, wait_info); tdm_vblank_get_enable_fake(vblank_info->vblank, &enable_fake); @@ -502,6 +486,12 @@ _tdm_server_output_cb_create_vblank(struct wl_client *client, struct wl_resource wl_tdm_vblank_send_stamp(vblank_info->resource, vblank_info->stamp); + if (tdm_ttrace_module & TDM_TTRACE_CLIENT) { + tdm_output *output = tdm_display_get_output(private_loop->dpy, tdm_ttrace_output, NULL); + if (output == output_info->output) + wl_tdm_vblank_send_ttrace(vblank_info->resource, 1); + } + return; } @@ -815,7 +805,6 @@ _tdm_server_bind(struct wl_client *client, void *data, } cinfo->resource = resource; - cinfo->private_server = data; LIST_ADDTAIL(&cinfo->link, &client_list); wl_client_get_credentials(client, &cinfo->pid, NULL, NULL); @@ -1046,26 +1035,22 @@ tdm_server_get_client_name(pid_t pid) /* LCOV_EXCL_START */ INTERN tdm_error -tdm_server_enable_ttrace_vblank(tdm_display *dpy, tdm_output *output, int enable) +tdm_server_enable_ttrace_client_vblank(tdm_display *dpy, tdm_output *output, int enable) { - tdm_server_client_info *cinfo = NULL; - - LIST_FOR_EACH_ENTRY(cinfo, &client_list, link) { - tdm_private_server *private_server = cinfo->private_server; - tdm_server_output_info *output_info = NULL; + tdm_private_server *private_server = keep_private_server; + tdm_server_output_info *output_info = NULL; - LIST_FOR_EACH_ENTRY(output_info, &private_server->output_list, link) { - tdm_server_vblank_info *vblank_info = NULL; - tdm_private_output *private_output = output_info->output; + if (!keep_private_server) + return TDM_ERROR_NONE; - if (output && output_info->output != output) - continue; + LIST_FOR_EACH_ENTRY(output_info, &private_server->output_list, link) { + tdm_server_vblank_info *vblank_info = NULL; - private_output->ttrace_vblank_client = enable; + if (output && output_info->output != output) + continue; - LIST_FOR_EACH_ENTRY(vblank_info, &output_info->vblank_list, link) { - wl_tdm_vblank_send_ttrace(vblank_info->resource, enable); - } + LIST_FOR_EACH_ENTRY(vblank_info, &output_info->vblank_list, link) { + wl_tdm_vblank_send_ttrace(vblank_info->resource, enable); } } diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 19c12dd..72b2525 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -971,8 +971,6 @@ tdm_vblank_cb_vblank_SW(tdm_vblank *vblank, double vblank_stamp) if (w->target_time != first_wait_info->target_time) break; - TDM_TRACE_ASYNC_END((int)w->req_time, "TDM_SW_Vblank:%u", (unsigned int)private_vblank->stamp); - LIST_DEL(&w->link); _tdm_vblank_valid_list_del(&w->valid_link); @@ -1044,8 +1042,6 @@ _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info) _tdm_vblank_insert_wait(wait_info, &private_vblank->SW_wait_list); - TDM_TRACE_ASYNC_BEGIN((int)wait_info->req_time, "TDM_SW_Vblank:%u", (unsigned int)private_vblank->stamp); - ret = _tdm_vblank_sw_timer_update(private_vblank); if (ret != TDM_ERROR_NONE) { /* LCOV_EXCL_START */