From a6091b4d9dd53b37d31f693b95b56dbfd10ed3e0 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 8 Aug 2016 10:59:34 +0900 Subject: [PATCH 01/16] apply tizen coding style Change-Id: I67736c86ad6b2e11feeaa697d7b4dd721794fcc3 --- src/tdm_helper.c | 2 +- src/tdm_server.c | 7 +++---- src/tdm_vblank.c | 11 +++++------ tools/buffers.c | 7 +++---- tools/tdm_test_client.c | 4 ++-- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 6ea3e54..7c2f36f 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -178,7 +178,7 @@ tdm_helper_dump_make_directory(const char *path, char *reply, int *len) timer = time(NULL); - buf = calloc(1, sizeof (struct tm)); + buf = calloc(1, sizeof(struct tm)); TDM_GOTO_IF_FAIL(buf != NULL, failed_make); fullpath = calloc(1, TDM_PATH_LEN * sizeof(char)); diff --git a/src/tdm_server.c b/src/tdm_server.c index ef45abe..d92b7a1 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -195,9 +195,8 @@ destroy_vblank_callback(struct wl_resource *resource) tdm_vblank_destroy(vblank_info->vblank); LIST_FOR_EACH_ENTRY_SAFE(w, ww, &keep_private_server->wait_list, link) { - if (w->vblank_info == vblank_info) { + if (w->vblank_info == vblank_info) destroy_wait(w); - } } LIST_DEL(&vblank_info->link); @@ -367,7 +366,7 @@ _tdm_server_cb_create_output(struct wl_client *client, struct wl_resource *resou if (!output) { TDM_ERR("There is no '%s' output", name); wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT, - "There is no '%s' output", name); + "There is no '%s' output", name); return; } @@ -375,7 +374,7 @@ _tdm_server_cb_create_output(struct wl_client *client, struct wl_resource *resou if (!mode) { TDM_ERR("no mode for '%s' output", name); wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT, - "no mode for '%s' output", name); + "no mode for '%s' output", name); return; } diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 0f278c2..53554fa 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -52,10 +52,10 @@ * - use a tdm_event_loop_source object only. */ -#define VER(fmt,arg...) TDM_ERR("[%p] "fmt, private_vblank, ##arg) -#define VWR(fmt,arg...) TDM_WRN("[%p] "fmt, private_vblank, ##arg) -#define VIN(fmt,arg...) TDM_INFO("[%p] "fmt, private_vblank, ##arg) -#define VDB(fmt,arg...) TDM_DBG("[%p] "fmt, private_vblank, ##arg) +#define VER(fmt, arg...) TDM_ERR("[%p] "fmt, private_vblank, ##arg) +#define VWR(fmt, arg...) TDM_WRN("[%p] "fmt, private_vblank, ##arg) +#define VIN(fmt, arg...) TDM_INFO("[%p] "fmt, private_vblank, ##arg) +#define VDB(fmt, arg...) TDM_DBG("[%p] "fmt, private_vblank, ##arg) typedef struct _tdm_vblank_wait_info tdm_vblank_wait_info; @@ -912,8 +912,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, TDM_WRN("try to use SW"); ret = _tdm_vblank_wait_SW(wait_info); } - } - else + } else ret = _tdm_vblank_wait_SW(wait_info); if (ret != TDM_ERROR_NONE) { diff --git a/tools/buffers.c b/tools/buffers.c index 805383b..907e6f8 100644 --- a/tools/buffers.c +++ b/tools/buffers.c @@ -159,7 +159,7 @@ unsigned int format_fourcc(const char *name) */ struct color_rgb24 { - unsigned int value: 24; + unsigned int value:24; } __attribute__((__packed__)); struct color_yuv { @@ -169,7 +169,7 @@ struct color_yuv { }; #define MAKE_YUV_601_Y(r, g, b) \ - ((( 66 * (r) + 129 * (g) + 25 * (b) + 128) >> 8) + 16) + (((66 * (r) + 129 * (g) + 25 * (b) + 128) >> 8) + 16) #define MAKE_YUV_601_U(r, g, b) \ (((-38 * (r) - 74 * (g) + 112 * (b) + 128) >> 8) + 128) #define MAKE_YUV_601_V(r, g, b) \ @@ -585,9 +585,8 @@ fill_smpte_rgb32(const struct rgb_info *rgb, unsigned char *mem, ((uint32_t *)mem)[x] = colors_bottom[(x - width * 5 / 7) * 3 / (width / 7) + 4]; - for (; x < width; ++x) { + for (; x < width; ++x) ((uint32_t *)mem)[x] = (rand_r(&rand_seed) % 2) ? MAKE_RGBA(rgb, 255, 255, 255, ALPHA_VALUE) : MAKE_RGBA(rgb, 0, 0, 0, ALPHA_VALUE); - } mem += stride; } } diff --git a/tools/tdm_test_client.c b/tools/tdm_test_client.c index ab322aa..ba9b257 100644 --- a/tools/tdm_test_client.c +++ b/tools/tdm_test_client.c @@ -159,7 +159,7 @@ parse_arg_v(tdm_test_client *data, char *arg) if (*end == '*') { arg = end + 1; - data->args.enable_fake= strtol(arg, &end, 10); + data->args.enable_fake = strtol(arg, &end, 10); } } @@ -365,7 +365,7 @@ main(int argc, char *argv[]) snprintf(buf, sizeof(buf), "/run"); int ret = setenv("XDG_RUNTIME_DIR", (const char*)buf, 1); if (ret != 0) - exit (0); + exit(0); } #endif -- 2.7.4 From 2b011cc10c8a0ada85914d6f05f591026f7cfe13 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 9 Aug 2016 12:59:19 +0900 Subject: [PATCH 02/16] first implementation for the output capability Change-Id: I87f8321f3fc0475ee926ca69b2fae09c75f62f3c --- include/tdm.h | 10 ++++++++++ include/tdm_backend.h | 2 ++ include/tdm_common.h | 9 +++++++++ src/tdm_display.c | 16 ++++++++++++++++ 4 files changed, 37 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index b62beb7..4fa6e21 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -234,6 +234,16 @@ tdm_pp * tdm_display_create_pp(tdm_display *dpy, tdm_error *error); /** + * @brief Get the capabilities of a output object. + * @param[in] output A output object + * @param[out] capabilities The capabilities of a output object + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_output_get_capabilities(tdm_output *output, + tdm_output_capability *capabilities); + +/** * @brief Get the model information of a output object. * @param[in] output A output object * @param[out] maker The output maker. diff --git a/include/tdm_backend.h b/include/tdm_backend.h index bf270e2..d455d1d 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -108,6 +108,8 @@ typedef struct _tdm_caps_output { int max_w; /**< The maximum width. -1 means "not defined" */ int max_h; /**< The maximum height. -1 means "not defined" */ int preferred_align; /**< The prefered align. -1 means "not defined" */ + + tdm_output_capability capabilities; /**< The capabilities of output. @since 1.4.1 */ } tdm_caps_output; /** diff --git a/include/tdm_common.h b/include/tdm_common.h index fae1224..b5a9c2e 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -83,6 +83,15 @@ typedef enum { } tdm_transform; /** + * @brief The output capability enumeration + * @details + * @remark + */ +typedef enum { + TDM_OUTPUT_CAPABILITY_ASYNC_DPMS = (1 << 0), /**< if a outupt supports asynchronous DPMS operation */ +} tdm_output_capability; + +/** * @brief The layer capability enumeration * @details * A layer can have one of CURSOR, PRIMARY and OVERLAY capability. And a layer diff --git a/src/tdm_display.c b/src/tdm_display.c index 20dc77c..e31b563 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -415,6 +415,22 @@ tdm_output_get_model_info(tdm_output *output, const char **maker, } EXTERN tdm_error +tdm_output_get_capabilities(tdm_output *output, tdm_output_capability *capabilities) +{ + OUTPUT_FUNC_ENTRY(); + + TDM_RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + *capabilities = private_output->caps.capabilities; + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + +EXTERN tdm_error tdm_output_get_conn_status(tdm_output *output, tdm_output_conn_status *status) { OUTPUT_FUNC_ENTRY(); -- 2.7.4 From 4abdd9b1e53fa6f86312eac591b7e4b7120fbdfa Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 10 Aug 2016 10:33:58 +0900 Subject: [PATCH 03/16] support the asynchronous DPMS operation Change-Id: Ie7f43fc8abb8f93d3fa6472b34525ca2c7f34982 --- include/tdm_backend.h | 23 ++++++++++++++++++- src/tdm_display.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/tdm_private.h | 13 +++++++++++ src/tdm_thread.c | 11 +++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index d455d1d..c7328ec 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -72,6 +72,15 @@ typedef void (*tdm_output_status_handler)(tdm_output *output, void *user_data); /** + * @brief The output dpms handler + * @details This handler will be called when the dpms of a output object is + * changed in runtime. + */ +typedef void (*tdm_output_dpms_handler)(tdm_output *output, + tdm_output_dpms dpms, + void *user_data); + +/** * @brief The display capabilities structure of a backend module * @see The display_get_capability() function of #tdm_func_display */ @@ -501,7 +510,19 @@ typedef struct _tdm_func_output { tdm_output_status_handler func, void *user_data); - void (*reserved1)(void); + /** + * @brief Set a output dpms handler + * @details A backend module needs to call the output dpms handler when the + * output DPMS has been changed to let the TDM frontend know the change. + * @param[in] output A output object + * @param[in] func A output dpms handler + * @param[in] user_data The user data + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @since 1.4.0 + */ + tdm_error (*output_set_dpms_handler)(tdm_output *output, + tdm_output_dpms_handler func, + void *user_data); void (*reserved2)(void); void (*reserved3)(void); void (*reserved4)(void); diff --git a/src/tdm_display.c b/src/tdm_display.c index e31b563..38cec19 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -1130,6 +1130,51 @@ _tdm_output_dpms_changed_timeout(void *user_data) return TDM_ERROR_NONE; } +INTERN void +tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_data) +{ + tdm_private_display *private_display; + tdm_private_output *private_output = user_data; + tdm_value value; + + TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); + TDM_RETURN_IF_FAIL(private_output); + + private_display = private_output->private_display; + + if (!tdm_thread_in_display_thread(syscall(SYS_gettid))) { + tdm_thread_cb_output_dpms output_dpms; + tdm_error ret; + + _tdm_output_update(output_backend, user_data); + + output_dpms.base.type = TDM_THREAD_CB_OUTPUT_DPMS; + output_dpms.base.length = sizeof output_dpms; + output_dpms.output_stamp = private_output->stamp; + output_dpms.dpms = dpms; + output_dpms.user_data = user_data; + + value.u32 = dpms; + tdm_output_call_change_handler_internal(private_output, + &private_output->change_handler_list_sub, + TDM_OUTPUT_CHANGE_DPMS, + value, 0); + + ret = tdm_thread_send_cb(private_display->private_loop, &output_dpms.base); + TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); + + return; + } + + private_output->current_dpms_value = dpms; + + value.u32 = dpms; + tdm_output_call_change_handler_internal(private_output, + &private_output->change_handler_list_main, + TDM_OUTPUT_CHANGE_DPMS, + value, 0); +} + EXTERN tdm_error tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) { @@ -1146,6 +1191,12 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) return TDM_ERROR_NONE; } + /** Use timer to call the output change callback of the sub-thread. + * The output change callback of tdm_server and tdm_vblank was called + * in the main thread. And it made the multi thread issue. If we use + * the timer, we can call the sub-thread's output change callback in + * sub-thread. + */ if (!private_output->dpms_changed_timer) { private_output->dpms_changed_timer = tdm_event_loop_add_timer_handler(private_output->private_display, @@ -1166,8 +1217,17 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) return TDM_ERROR_NONE; } + if (func_output->output_set_dpms_handler) { + if (!private_output->regist_dpms_cb) { + private_output->regist_dpms_cb = 1; + ret = func_output->output_set_dpms_handler(private_output->output_backend, + tdm_output_cb_dpms, private_output); + } + } + ret = func_output->output_set_dpms(private_output->output_backend, dpms_value); - if (ret == TDM_ERROR_NONE) { + + if (ret == TDM_ERROR_NONE && !func_output->output_set_dpms_handler) { tdm_value value; private_output->current_dpms_value = dpms_value; diff --git a/src/tdm_private.h b/src/tdm_private.h index 186ac14..e56a19a 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -176,6 +176,7 @@ struct _tdm_private_output { int regist_vblank_cb; int regist_commit_cb; int regist_change_cb; + int regist_dpms_cb; struct list_head layer_list; struct list_head capture_list; @@ -359,6 +360,9 @@ void tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, void *user_data); void +tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, + void *user_data); +void tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, void *user_data); void @@ -416,6 +420,7 @@ typedef enum { TDM_THREAD_CB_OUTPUT_COMMIT, TDM_THREAD_CB_OUTPUT_VBLANK, TDM_THREAD_CB_OUTPUT_STATUS, + TDM_THREAD_CB_OUTPUT_DPMS, TDM_THREAD_CB_PP_DONE, TDM_THREAD_CB_CAPTURE_DONE, } tdm_thread_cb_type; @@ -424,6 +429,7 @@ typedef struct _tdm_thread_cb_base tdm_thread_cb_base; typedef struct _tdm_thread_cb_output_vblank tdm_thread_cb_output_commit; typedef struct _tdm_thread_cb_output_vblank tdm_thread_cb_output_vblank; typedef struct _tdm_thread_cb_output_status tdm_thread_cb_output_status; +typedef struct _tdm_thread_cb_output_dpms tdm_thread_cb_output_dpms; typedef struct _tdm_thread_cb_pp_done tdm_thread_cb_pp_done; typedef struct _tdm_thread_cb_capture_done tdm_thread_cb_capture_done; @@ -448,6 +454,13 @@ struct _tdm_thread_cb_output_status { void *user_data; }; +struct _tdm_thread_cb_output_dpms { + tdm_thread_cb_base base; + unsigned long output_stamp; + tdm_output_dpms dpms; + void *user_data; +}; + struct _tdm_thread_cb_pp_done { tdm_thread_cb_base base; unsigned long pp_stamp; diff --git a/src/tdm_thread.c b/src/tdm_thread.c index 03ce03a..7c1067c 100644 --- a/src/tdm_thread.c +++ b/src/tdm_thread.c @@ -318,6 +318,17 @@ tdm_thread_handle_cb(tdm_private_loop *private_loop) output_status->user_data); break; } + case TDM_THREAD_CB_OUTPUT_DPMS: { + tdm_thread_cb_output_dpms *output_dpms = (tdm_thread_cb_output_dpms*)base; + tdm_output *output_backend = + tdm_display_find_output_stamp(private_loop->dpy, output_dpms->output_stamp); + if (!output_backend) { + TDM_WRN("no output(%ld)", output_dpms->output_stamp); + break; + } + tdm_output_cb_dpms(output_backend, output_dpms->dpms, output_dpms->user_data); + break; + } case TDM_THREAD_CB_PP_DONE: { tdm_thread_cb_pp_done *pp_done = (tdm_thread_cb_pp_done*)base; tdm_pp *pp_backend = -- 2.7.4 From a75c692b7bb7f8e0b1d2d57f00c3389ceb935a02 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 10 Aug 2016 16:07:15 +0900 Subject: [PATCH 04/16] version up to 1.4.0 Change-Id: I4d31b84a1a99fc8d793724b0ac75fe15f232ae05 --- configure.ac | 2 +- doc/tdm_doc.h | 2 +- packaging/libtdm.spec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index c2bb484..ada64f8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ AC_PREREQ([2.60]) m4_define([tdm_major_version], [1]) -m4_define([tdm_minor_version], [3]) +m4_define([tdm_minor_version], [4]) m4_define([tdm_micro_version], [0]) m4_define([tdm_version], [tdm_major_version.tdm_minor_version.tdm_micro_version]) diff --git a/doc/tdm_doc.h b/doc/tdm_doc.h index a98c7da..ec0d3f3 100644 --- a/doc/tdm_doc.h +++ b/doc/tdm_doc.h @@ -39,7 +39,7 @@ /** * @mainpage TDM * @author Boram Park, boram1288.park@samsung.com - * @version 1.3.0 + * @version 1.4.0 * @par Introduction * TDM stands for Tizen Display Manager. It's the display HAL layer for tizen * display server. It offers the frontend APIs(@ref tdm.h) for a frontend user diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 74b93e0..789371f 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,5 +1,5 @@ Name: libtdm -Version: 1.3.1 +Version: 1.4.0 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 2a14e2738cd96eb66e839721d4eb77270751cc98 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 18 Aug 2016 16:29:30 +0900 Subject: [PATCH 05/16] fix function description Change-Id: Ida3819b5e4873e1cac136831f72f24dbcd9b76d1 --- include/tdm_backend.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index c7328ec..0cfc3cd 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -596,7 +596,7 @@ typedef struct _tdm_func_layer { * @return #TDM_ERROR_NONE if success. Otherwise, error value. * @see output_commit() function of #tdm_func_output * @remark - * A backend module would apply a TDM buffer when the output object + * A backend module would show a TDM buffer on screen when the output object * of a layer object is committed. */ tdm_error (*layer_set_buffer)(tdm_layer *layer, tbm_surface_h buffer); @@ -606,8 +606,7 @@ typedef struct _tdm_func_layer { * @param[in] layer A layer object * @return #TDM_ERROR_NONE if success. Otherwise, error value. * @remark - * A backend module @b SHOULD hide the current showing buffer from screen. - * If needed, cleanup a layer object resource. + * A backend module @b SHOULD remove the current showing buffer from screen. */ tdm_error (*layer_unset_buffer)(tdm_layer *layer); -- 2.7.4 From 2566dabf632bb933c648bf124b8f5e293773d55d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 18 Aug 2016 16:30:01 +0900 Subject: [PATCH 06/16] enhance the log information Change-Id: Idefad691b51b7b309d0ceb1cabe77a487085387f --- src/tdm_helper.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 7c2f36f..0d51670 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -642,13 +642,14 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) ret = func_output->output_get_mode(private_output->output_backend, ¤t_mode); TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); - TDM_SNPRINTF(reply, len, "\t\t name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n"); + TDM_SNPRINTF(reply, len, "\t\t name refresh (Hz) clk hdisp hss hse htot vdisp vss vse vtot vscan\n"); for (i = 0; i < private_output->caps.mode_count; i++) { char *current = (current_mode == private_output->caps.modes + i) ? "*" : " "; - TDM_SNPRINTF(reply, len, "\t\t%s%s %d %d %d %d %d %d %d %d %d ", + TDM_SNPRINTF(reply, len, "\t\t%s%s %d %d %d %d %d %d %d %d %d %d %d ", current, private_output->caps.modes[i].name, private_output->caps.modes[i].vrefresh, + private_output->caps.modes[i].clock, private_output->caps.modes[i].hdisplay, private_output->caps.modes[i].hsync_start, private_output->caps.modes[i].hsync_end, @@ -656,7 +657,8 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) private_output->caps.modes[i].vdisplay, private_output->caps.modes[i].vsync_start, private_output->caps.modes[i].vsync_end, - private_output->caps.modes[i].vtotal); + private_output->caps.modes[i].vtotal, + private_output->caps.modes[i].vscan); tdm_mode_flag_str(private_output->caps.modes[i].flags, &reply, len); TDM_SNPRINTF(reply, len, " "); tdm_mode_type_str(private_output->caps.modes[i].type, &reply, len); -- 2.7.4 From 27146b62eac2097bb21a3ebc109513e19290faab Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 19 Aug 2016 10:43:40 +0900 Subject: [PATCH 07/16] enhance log during loading backend module Change-Id: I362f196ac7d5e3acf040f6a38448d4c742cb9dc2 --- src/tdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 8c7843a..371553d 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -756,7 +756,7 @@ _tdm_display_load_module_with_file(tdm_private_display *private_display, private_display->bdata = module_data->init((tdm_display *)private_display, &ret); TDM_TRACE_END(); if (ret != TDM_ERROR_NONE) { - TDM_ERR("'%s' init failed", file); + TDM_ERR("failed to init '%s' module", module_data->name); goto failed_load; } @@ -767,7 +767,7 @@ _tdm_display_load_module_with_file(tdm_private_display *private_display, goto failed_load; } - TDM_INFO("Success to load module(%s)", file); + TDM_INFO("Success to load '%s' module", module_data->name); return TDM_ERROR_NONE; failed_load: -- 2.7.4 From ed8ff15a0f917f57387d444a6cd4845e05bd7803 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 19 Aug 2016 13:44:23 +0900 Subject: [PATCH 08/16] systemd: support for lazy mount of user data Change-Id: Ib328791d52f6c8a107984c88611842a39c2ebc19 --- packaging/libtdm.spec | 11 +++++++++++ service/tdm-socket-user.service | 1 + 2 files changed, 12 insertions(+) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 789371f..2817a78 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -80,13 +80,24 @@ install -m 644 service/tdm-socket-user.path %{buildroot}%{_unitdir_user} %pre %__mkdir_p %{_unitdir}/graphical.target.wants ln -sf ../tdm-socket.path %{_unitdir}/graphical.target.wants/ + +%if "%{?profile}" == "mobile" || "%{?profile}" == "wearable" +%__mkdir_p %{_unitdir_user}/basic.target.wants +ln -sf ../tdm-socket-user.path %{_unitdir_user}/basic.target.wants/ +%else %__mkdir_p %{_unitdir_user}/default.target.wants ln -sf ../tdm-socket-user.path %{_unitdir_user}/default.target.wants/ +%endif %post -p /sbin/ldconfig %postun -p /sbin/ldconfig rm -f %{_unitdir}/graphical.target.wants/tdm-socket.path + +%if "%{?profile}" == "mobile" || "%{?profile}" == "wearable" +rm -f %{_unitdir_user}/basic.target.wants/tdm-socket-user.path +%else rm -f %{_unitdir_user}/default.target.wants/tdm-socket-user.path +%endif %files %manifest %{name}.manifest diff --git a/service/tdm-socket-user.service b/service/tdm-socket-user.service index 97d0f6f..367a531 100644 --- a/service/tdm-socket-user.service +++ b/service/tdm-socket-user.service @@ -1,5 +1,6 @@ [Unit] Description=Creating a link file for user to access tdm-socket +DefaultDependencies=no [Service] Type=oneshot -- 2.7.4 From 969d9f15369b577ba5b8cd29c1e818e6e7e0c2ca Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 22 Aug 2016 21:32:48 +0900 Subject: [PATCH 09/16] avoid dereference null, fix memory leak Change-Id: I8981af9e4b1dd888382cd52d9cc5e17c536329d2 Signed-off-by: Junkyeong Kim --- src/tdm.c | 6 ++++++ src/tdm_monitor_server.c | 8 ++++++++ tools/tdm_test_server.c | 28 ++++++++++++++++++++++------ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 371553d..3f6388c 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -966,6 +966,11 @@ tdm_display_deinit(tdm_display *dpy) free(private_display); g_private_display = NULL; + if (tdm_debug_dump_dir) { + free(tdm_debug_dump_dir); + tdm_debug_dump_dir = NULL; + } + _pthread_mutex_unlock(&gLock); TDM_INFO("done"); @@ -1047,6 +1052,7 @@ tdm_display_enable_dump(tdm_private_display *private_display, const char *dump_s snprintf(temp, sizeof(temp), "%s", dump_str); arg = strtok_r(temp, ",", &end); + TDM_GOTO_IF_FAIL(arg != NULL, done); if (!strncmp(arg, "none", 4)) { tdm_debug_dump = 0; diff --git a/src/tdm_monitor_server.c b/src/tdm_monitor_server.c index c5bda95..25874ab 100644 --- a/src/tdm_monitor_server.c +++ b/src/tdm_monitor_server.c @@ -195,6 +195,10 @@ _tdm_monitor_server_prop(unsigned int pid, char *cwd, int argc, char *argv[], ch arg = end + 1; prop_name = strtok_r(arg, ",", &end); + if (!prop_name) { + TDM_SNPRINTF(reply, len, "failed: get prop_name by strtok_r\n"); + return; + } if (*end == '\0') { TDM_SNPRINTF(reply, len, "failed: no value\n"); @@ -202,6 +206,10 @@ _tdm_monitor_server_prop(unsigned int pid, char *cwd, int argc, char *argv[], ch } arg = strtok_r(NULL, TDM_DELIM, &end); + if (!arg) { + TDM_SNPRINTF(reply, len, "failed: get arg by strtok_r\n"); + return; + } value.u32 = strtol(arg, &end, 10); output = tdm_display_get_output(dpy, output_idx, &ret); diff --git a/tools/tdm_test_server.c b/tools/tdm_test_server.c index 0045be5..d59c6ce 100644 --- a/tools/tdm_test_server.c +++ b/tools/tdm_test_server.c @@ -989,6 +989,8 @@ static void layer_cb_buffer_release(tbm_surface_h b, void *user_data) { tdm_test_server_buffer *tb = get_tts_buffer(b); + TDM_EXIT_IF_FAIL(tb != NULL); + tb->in_use = 0; tdm_buffer_remove_release_handler(b, layer_cb_buffer_release, NULL); if (tb->done) @@ -1083,6 +1085,10 @@ pp_get_buffer(tdm_test_server_pp *p) } for (i = 0; i < size; i++) { tdm_test_server_buffer *tb = get_tts_buffer(p->bufs[i]); + + if (tb == NULL) + continue; + if (!tb->in_use) { tdm_test_buffer_fill(p->bufs[i], p->data->b_fill); return p->bufs[i]; @@ -1169,10 +1175,16 @@ pp_cb_timeout(void *user_data) static void pp_setup(tdm_test_server_pp *p, tbm_surface_h sb, tbm_surface_h db) { - tdm_test_server *data = p->l->o->data; + tdm_test_server *data; tbm_surface_info_s info; tdm_error ret; + if (!p || !p->l || !p->l->o || !p->l->o->data) { + TDM_ERR("invalid parameter failed"); + exit(0); + } + data = p->l->o->data; + p->pp = tdm_display_create_pp(data->display, &ret); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); @@ -1209,8 +1221,7 @@ pp_setup(tdm_test_server_pp *p, tbm_surface_h sb, tbm_surface_h db) printf(" ! "); print_config(&p->info.dst_config); printf(" fps(%d) transform(%s)\n", p->fps, tdm_transform_str(p->info.transform)); - if (p->l) - printf("\toutput_idx(%d) layer_idx(%d)\n", p->l->o->idx, p->l->idx); + printf("\toutput_idx(%d) layer_idx(%d)\n", p->l->o->idx, p->l->idx); layer_setup(p->l, db); @@ -1282,12 +1293,18 @@ capture_attach(tdm_test_server_capture *c, tbm_surface_h b) static void capture_setup(tdm_test_server_capture *c, tbm_surface_h b) { - tdm_test_server *data = c->l->o->data; + tdm_test_server *data; tdm_output *output; tdm_layer *layer; tbm_surface_info_s info; tdm_error ret; + if (!c || !c->l || !c->l->o || !c->l->o->data) { + TDM_ERR("invalid parameter failed"); + exit(0); + } + data = c->l->o->data; + if (c->output_idx != -1 && c->layer_idx == -1) { output = tdm_display_get_output(data->display, c->output_idx, &ret); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); @@ -1324,8 +1341,7 @@ capture_setup(tdm_test_server_capture *c, tbm_surface_h b) printf("capture: o(%d) l(%d) ", c->output_idx, c->layer_idx); print_config(&c->info.dst_config); printf(" transform(%s)\n", tdm_transform_str(c->info.transform)); - if (c->l) - printf("\toutput_idx(%d) layer_idx(%d)\n", c->l->o->idx, c->l->idx); + printf("\toutput_idx(%d) layer_idx(%d)\n", c->l->o->idx, c->l->idx); layer_setup(c->l, b); } -- 2.7.4 From bd87786f990480e392080faf42405a055dadd2d1 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 23 Aug 2016 11:32:06 +0900 Subject: [PATCH 10/16] fix memory leak Change-Id: I28934b0ddcbf1df4e6d079db9ca2dbc7ba79216c --- src/tdm_helper.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 0d51670..e9da37f 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -214,17 +214,20 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) const char *ext; char file[TDM_PATH_LEN]; int ret, bw; + char *dump_dir = NULL; TDM_RETURN_IF_FAIL(buffer != NULL); TDM_RETURN_IF_FAIL(str != NULL); - if (!dir) { - dir = tdm_helper_dump_make_directory(TDM_DUMP_DIR, NULL, NULL); - TDM_RETURN_IF_FAIL(dir != NULL); - } + dump_dir = tdm_helper_dump_make_directory(TDM_DUMP_DIR, NULL, NULL); + + if (!dir) + dir = dump_dir; + + TDM_GOTO_IF_FAIL(dir != NULL, done); ret = tbm_surface_get_info(buffer, &info); - TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); + TDM_GOTO_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE, done); if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888) { ext = file_exts[0]; @@ -238,6 +241,9 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) dir, FOURCC_STR(info.format), bw, info.height, str, ext); tdm_helper_dump_buffer(buffer, file); + +done: + free(dump_dir); } EXTERN void -- 2.7.4 From 9863c6acbed5b8f9c07221a7e82a54f03012300d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 23 Aug 2016 13:49:34 +0900 Subject: [PATCH 11/16] make sure the directory path is not null for dump Change-Id: I87849dc858ad5011e4fc1d10b7f811a38cc513c0 --- src/tdm_helper.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index e9da37f..69278fc 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -214,20 +214,13 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) const char *ext; char file[TDM_PATH_LEN]; int ret, bw; - char *dump_dir = NULL; TDM_RETURN_IF_FAIL(buffer != NULL); + TDM_RETURN_IF_FAIL(dir != NULL); TDM_RETURN_IF_FAIL(str != NULL); - dump_dir = tdm_helper_dump_make_directory(TDM_DUMP_DIR, NULL, NULL); - - if (!dir) - dir = dump_dir; - - TDM_GOTO_IF_FAIL(dir != NULL, done); - ret = tbm_surface_get_info(buffer, &info); - TDM_GOTO_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE, done); + TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888) { ext = file_exts[0]; @@ -241,9 +234,6 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) dir, FOURCC_STR(info.format), bw, info.height, str, ext); tdm_helper_dump_buffer(buffer, file); - -done: - free(dump_dir); } EXTERN void -- 2.7.4 From 689f54dea968a207ec421ea57020205446de2529 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 23 Aug 2016 18:51:41 +0900 Subject: [PATCH 12/16] fix reallocation-free issue of output modes Change-Id: I76fb49f0d00906ff380531e5ab021da9ecc122a1 --- include/tdm_backend.h | 1 + src/tdm.c | 36 ++++++++++++++++++++++++++++++------ src/tdm_display.c | 14 +++----------- src/tdm_private.h | 1 + 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 0cfc3cd..18d0f72 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -477,6 +477,7 @@ typedef struct _tdm_func_output { /** * @brief Get the mode of a output object + * @deprecated * @param[in] output A output object * @param[out] mode A output mode * @return #TDM_ERROR_NONE if success. Otherwise, error value. diff --git a/src/tdm.c b/src/tdm.c index 3f6388c..a4dcdf8 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -389,13 +389,35 @@ tdm_display_update_output(tdm_private_display *private_display, private_output->regist_change_cb = 1; } - } else - _tdm_display_destroy_caps_output(&private_output->caps); + ret = _tdm_display_update_caps_output(private_display, pipe, output_backend, + &private_output->caps); + if (ret != TDM_ERROR_NONE) + return ret; + } else { + tdm_caps_output new_caps; - ret = _tdm_display_update_caps_output(private_display, pipe, output_backend, - &private_output->caps); - if (ret != TDM_ERROR_NONE) - return ret; + ret = _tdm_display_update_caps_output(private_display, pipe, output_backend, + &new_caps); + if (ret != TDM_ERROR_NONE) + return ret; + + /* FIXME: This is very ugly. need to fix after the TDM ABI is changed. */ + if (private_output->caps.status != new_caps.status) { + _tdm_display_destroy_caps_output(&private_output->caps); + private_output->caps = new_caps; + private_output->current_mode = NULL; + } else { + tdm_output_mode *old_modes = private_output->caps.modes; + unsigned int old_mode_count = private_output->caps.mode_count; + if (new_caps.modes) + free(new_caps.modes); + new_caps.modes = old_modes; + new_caps.mode_count = old_mode_count; + if (private_output->caps.props) + free(private_output->caps.props); + private_output->caps = new_caps; + } + } layers = func_output->output_get_layers(output_backend, &layer_count, &ret); if (ret != TDM_ERROR_NONE) @@ -503,6 +525,8 @@ _tdm_display_get_ordered_outputs(tdm_private_display *private_display, int *coun break; } } + + _tdm_display_destroy_caps_output(&caps); } /* ordering : main output is first */ diff --git a/src/tdm_display.c b/src/tdm_display.c index 38cec19..7d9b08f 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -1084,7 +1084,8 @@ tdm_output_set_mode(tdm_output *output, const tdm_output_mode *mode) } ret = func_output->output_set_mode(private_output->output_backend, mode); - + if (ret == TDM_ERROR_NONE) + private_output->current_mode = mode; _pthread_mutex_unlock(&private_display->lock); return ret; @@ -1093,22 +1094,13 @@ tdm_output_set_mode(tdm_output *output, const tdm_output_mode *mode) EXTERN tdm_error tdm_output_get_mode(tdm_output *output, const tdm_output_mode **mode) { - tdm_func_output *func_output; OUTPUT_FUNC_ENTRY(); TDM_RETURN_VAL_IF_FAIL(mode != NULL, TDM_ERROR_INVALID_PARAMETER); _pthread_mutex_lock(&private_display->lock); - func_output = &private_display->func_output; - - if (!func_output->output_get_mode) { - _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("not implemented!!"); - return TDM_ERROR_NOT_IMPLEMENTED; - } - - ret = func_output->output_get_mode(private_output->output_backend, mode); + *mode = private_output->current_mode; _pthread_mutex_unlock(&private_display->lock); diff --git a/src/tdm_private.h b/src/tdm_private.h index e56a19a..bc04971 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -172,6 +172,7 @@ struct _tdm_private_output { unsigned int pipe; tdm_output_dpms current_dpms_value; + const tdm_output_mode *current_mode; int regist_vblank_cb; int regist_commit_cb; -- 2.7.4 From adff2d3031547ac6d596346e521bc1502bdee598 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 29 Aug 2016 14:37:02 +0900 Subject: [PATCH 13/16] add -ttrace_vblank option to tdm-monitor Change-Id: I9939c5bd2cca6f2fed1a9cc1f9d518cc5bf068c0 --- src/tdm.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ src/tdm_monitor_server.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ src/tdm_private.h | 4 ++++ 3 files changed, 103 insertions(+) diff --git a/src/tdm.c b/src/tdm.c index a4dcdf8..550b043 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -1172,3 +1172,53 @@ tdm_display_enable_path(const char *path) return TDM_ERROR_NONE; } + + +static void +_tdm_display_ttrace_vblank_cb(tdm_vblank *vblank, tdm_error error, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, void *user_data) +{ + tdm_error ret = TDM_ERROR_NONE; + + TDM_TRACE_COUNT(VBlank, sequence); + + ret = tdm_vblank_wait(vblank, 0, 0, 1, _tdm_display_ttrace_vblank_cb, NULL); + TDM_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); +} + +INTERN tdm_error +tdm_display_enable_ttrace_vblank(tdm_display *dpy, tdm_output *output, int enable) +{ + static tdm_vblank *vblank = NULL; + tdm_error ret = TDM_ERROR_NONE; + + if (!enable) { + if (vblank) + tdm_vblank_destroy(vblank); + vblank = NULL; + return TDM_ERROR_NONE; + } else { + const tdm_output_mode *mode = NULL; + + if (vblank) + return TDM_ERROR_NONE; + + vblank = tdm_vblank_create(dpy, output, &ret); + TDM_RETURN_VAL_IF_FAIL(vblank != NULL, ret); + + ret = tdm_output_get_mode(output, &mode); + TDM_RETURN_VAL_IF_FAIL(mode != NULL, ret); + + ret = tdm_vblank_set_fps(vblank, mode->vrefresh); + TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + + ret = tdm_vblank_set_enable_fake(vblank, 1); + TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + + ret = tdm_vblank_wait(vblank, 0, 0, 1, _tdm_display_ttrace_vblank_cb, NULL); + TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + } + + return TDM_ERROR_NONE; +} + diff --git a/src/tdm_monitor_server.c b/src/tdm_monitor_server.c index 25874ab..a3e24b4 100644 --- a/src/tdm_monitor_server.c +++ b/src/tdm_monitor_server.c @@ -87,6 +87,50 @@ _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) +{ + int enable, output_id = 0; + tdm_output *output; + const char *name = NULL; + char *arg; + char *end; + tdm_error ret; + tdm_output_type type; + + if (argc < 3) { + _tdm_monitor_server_usage(argv[0], reply, len); + return; + } + + arg = argv[2]; + enable = strtol(arg, &end, 10); + + 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; + } + + tdm_output_get_model_info(output, NULL, NULL, &name); + + tdm_display_enable_ttrace_vblank(dpy, output, enable); + + TDM_SNPRINTF(reply, len, "%s ttrace vblank for '%s'\n", + (enable)?"enable":"disable", tdm_conn_str(type)); +} + +static void _tdm_monitor_server_debug(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { int level; @@ -279,6 +323,11 @@ 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:enable]", + "[@]", "0 or 1" + }, + { "debug", _tdm_monitor_server_debug, "set the debug level and modules(module: none, mutex, buffer, thread, vblank)", "[@[,]]", diff --git a/src/tdm_private.h b/src/tdm_private.h index bc04971..5cfddc7 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -89,9 +89,11 @@ extern int tdm_debug_dump; #include #define TDM_TRACE_BEGIN(NAME) traceBegin(TTRACE_TAG_GRAPHICS, "TDM:"#NAME) #define TDM_TRACE_END() traceEnd(TTRACE_TAG_GRAPHICS) +#define TDM_TRACE_COUNT(NAME, COUNT) traceCounter(TTRACE_TAG_GRAPHICS, COUNT, "TDM:"#NAME) #else #define TDM_TRACE_BEGIN(NAME) #define TDM_TRACE_END() +#define TDM_TRACE_COUNT(NAME, COUNT) #endif typedef enum { @@ -575,6 +577,8 @@ tdm_error tdm_display_enable_dump(tdm_private_display *private_display, const char *dump_str, 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); /** * @brief The tdm vblank object -- 2.7.4 From 58c6aaa1b7df5ae6c0c74305a7bec634e4f53e6a Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 29 Aug 2016 17:17:09 +0900 Subject: [PATCH 14/16] destroy a vblank object when failed Change-Id: I699b81b18efc3d9323dcea3d605f7247f3abb742 --- src/tdm.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 550b043..e4e8eb5 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -1207,18 +1207,24 @@ tdm_display_enable_ttrace_vblank(tdm_display *dpy, tdm_output *output, int enabl TDM_RETURN_VAL_IF_FAIL(vblank != NULL, ret); ret = tdm_output_get_mode(output, &mode); - TDM_RETURN_VAL_IF_FAIL(mode != NULL, ret); + TDM_GOTO_IF_FAIL(mode != NULL, enable_fail); ret = tdm_vblank_set_fps(vblank, mode->vrefresh); - TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, enable_fail); ret = tdm_vblank_set_enable_fake(vblank, 1); - TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, enable_fail); ret = tdm_vblank_wait(vblank, 0, 0, 1, _tdm_display_ttrace_vblank_cb, NULL); - TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, enable_fail); } return TDM_ERROR_NONE; + +enable_fail: + if (vblank) + tdm_vblank_destroy(vblank); + vblank = NULL; + return ret; } -- 2.7.4 From 6a4b60c921ac8d37c5084ba1d9fa00411ac2ecad Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 29 Aug 2016 17:29:18 +0900 Subject: [PATCH 15/16] remove no effective code Change-Id: Id043e59eef996ad74e7d63f5f704b454d549b8be --- src/tdm_monitor_server.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/tdm_monitor_server.c b/src/tdm_monitor_server.c index a3e24b4..5b4ff18 100644 --- a/src/tdm_monitor_server.c +++ b/src/tdm_monitor_server.c @@ -91,7 +91,6 @@ _tdm_monitor_server_ttrace_vblank(unsigned int pid, char *cwd, int argc, char *a { int enable, output_id = 0; tdm_output *output; - const char *name = NULL; char *arg; char *end; tdm_error ret; @@ -122,8 +121,6 @@ _tdm_monitor_server_ttrace_vblank(unsigned int pid, char *cwd, int argc, char *a return; } - tdm_output_get_model_info(output, NULL, NULL, &name); - tdm_display_enable_ttrace_vblank(dpy, output, enable); TDM_SNPRINTF(reply, len, "%s ttrace vblank for '%s'\n", -- 2.7.4 From 17b8b22a6a8317d913eb396dab0452844cadfc76 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 29 Aug 2016 17:42:45 +0900 Subject: [PATCH 16/16] fix syntax error Change-Id: If6463e9661c94d3c6332855e4af8a5eba0b96d78 --- src/tdm_monitor_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tdm_monitor_server.c b/src/tdm_monitor_server.c index 5b4ff18..4ea1184 100644 --- a/src/tdm_monitor_server.c +++ b/src/tdm_monitor_server.c @@ -348,7 +348,7 @@ static struct { "\t\t layer, pp, capture - start to dump buffers of layer, pp, capture\n" "\t\t none - stop to dump buffers\n" "\t\t current - dump the current buffer of all layers", - "[,[,...]]@[]", + "[,[,...]][@]", NULL }, }; -- 2.7.4