ttrace: enhance -ttrace_vblank option
[platform/core/uifw/libtdm.git] / src / tdm_server.c
index b11911d..f56b1ad 100644 (file)
@@ -88,6 +88,7 @@ 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;
@@ -167,6 +168,7 @@ _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;
@@ -185,7 +187,9 @@ _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);
 
-       TDM_TRACE_ASYNC_END((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp);
+       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);
 }
@@ -304,6 +308,7 @@ _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;
@@ -323,7 +328,9 @@ _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);
 
-       TDM_TRACE_ASYNC_BEGIN((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp);
+       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);
 
@@ -347,6 +354,7 @@ _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;
@@ -366,7 +374,9 @@ _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);
 
-       TDM_TRACE_ASYNC_BEGIN((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp);
+       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);
 
@@ -735,6 +745,7 @@ _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);
@@ -928,3 +939,30 @@ tdm_server_get_client_name(pid_t pid)
 
        return NULL;
 }
+
+INTERN tdm_error
+tdm_server_enable_ttrace_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;
+
+               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 (output && output_info->output != output)
+                               continue;
+
+                       private_output->ttrace_vblank_client = enable;
+
+                       LIST_FOR_EACH_ENTRY(vblank_info, &output_info->vblank_list, link) {
+                               wl_tdm_vblank_send_ttrace(vblank_info->resource, enable);
+                       }
+               }
+       }
+
+       return TDM_ERROR_NONE;
+}