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;
}
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;
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)
_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);
}
_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);
}
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;
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);
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;
}
/* 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;
}
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
"set output dpms", "<output_idx>:<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]",
- "<enable>[@<output_idx>]", "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",
+ "<module>[@<output_idx>]",
+ NULL
},
{
"debug", _tdm_monitor_server_debug,
/* 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)
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);
_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);
_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);
_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;
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 <ttrace.h>
/* for ttrace vblank */
tdm_vblank *ttrace_vblank;
- unsigned int ttrace_vblank_client;
};
struct _tdm_private_layer {
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);
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);
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;
{
tdm_server_wait_info *found;
tdm_server_vblank_info *vblank_info;
- tdm_private_output *private_output;
if (!keep_private_server)
return;
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 */
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;
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);
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;
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);
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;
}
}
cinfo->resource = resource;
- cinfo->private_server = data;
LIST_ADDTAIL(&cinfo->link, &client_list);
wl_client_get_credentials(client, &cinfo->pid, NULL, NULL);
/* 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);
}
}
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);
_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 */