From a229e0780e205fb1dc9551921c2b39fc33a6e26b Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 20 Jul 2016 13:41:33 +0900 Subject: [PATCH 01/16] code clean-up (macro, structure) Change-Id: I88124bbca87fe5206c6da5e2faa2adfaa949fb44 --- src/tdm_capture.c | 2 ++ src/tdm_macro.h | 6 ++++++ src/tdm_pp.c | 9 ++------- src/tdm_private.h | 9 +++++++++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/tdm_capture.c b/src/tdm_capture.c index f5bcfc2..2737805 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -352,6 +352,8 @@ tdm_capture_set_info(tdm_capture *capture, tdm_info_capture *info) ret = func_capture->capture_set_info(private_capture->capture_backend, info); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); + private_capture->info = *info; + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_macro.h b/src/tdm_macro.h index d56267d..fe762c2 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -128,6 +128,12 @@ extern "C" { return; \ } \ } +#define TDM_DBG_GOTO_IF_FAIL(cond, dst) { \ + if (!(cond)) { \ + TDM_SNPRINTF(reply, len, "[%s %d] '%s' failed\n", __func__, __LINE__, #cond); \ + goto dst; \ + } \ +} #define C(b, m) (((b) >> (m)) & 0xFF) #define B(c, s) ((((unsigned int)(c)) & 0xff) << (s)) diff --git a/src/tdm_pp.c b/src/tdm_pp.c index a43d257..e9d5183 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -42,13 +42,6 @@ #include "tdm_private.h" #include "tdm_helper.h" -typedef struct _tdm_pp_private_buffer { - tbm_surface_h src; - tbm_surface_h dst; - struct list_head link; - struct list_head commit_link; -} tdm_pp_private_buffer; - #define PP_FUNC_ENTRY() \ tdm_func_pp *func_pp; \ tdm_private_display *private_display; \ @@ -336,6 +329,8 @@ tdm_pp_set_info(tdm_pp *pp, tdm_info_pp *info) ret = func_pp->pp_set_info(private_pp->pp_backend, info); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); + private_pp->info = *info; + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private.h b/src/tdm_private.h index a2740a0..f66bed3 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -223,6 +223,7 @@ struct _tdm_private_pp { struct list_head pending_buffer_list; struct list_head buffer_list; + tdm_info_pp info; pid_t owner_tid; }; @@ -243,6 +244,7 @@ struct _tdm_private_capture { struct list_head pending_buffer_list; struct list_head buffer_list; + tdm_info_capture info; pid_t owner_tid; }; @@ -321,6 +323,13 @@ typedef struct _tdm_buffer_info { struct list_head link; } tdm_buffer_info; +typedef struct _tdm_pp_private_buffer { + tbm_surface_h src; + tbm_surface_h dst; + struct list_head link; + struct list_head commit_link; +} tdm_pp_private_buffer; + int tdm_display_check_module_abi(tdm_private_display *private_display, int abimaj, int abimin); -- 2.7.4 From 5fd366dd8c8e882db91851d9c5c45508e703c589 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 20 Jul 2016 13:43:45 +0900 Subject: [PATCH 02/16] enhance the display information Change-Id: Ie6a52cda9734137d9a76b4f0f1605869e108d454 --- src/tdm.c | 61 -------- src/tdm_helper.c | 387 ++++++++++++++++++++++++++---------------------- src/tdm_macro.h | 16 ++ tools/tdm_test_server.c | 5 +- 4 files changed, 224 insertions(+), 245 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index d73e816..647230b 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -222,11 +222,6 @@ _tdm_display_update_caps_pp(tdm_private_display *private_display, tdm_caps_pp *caps) { tdm_func_display *func_display = &private_display->func_display; - char buf[1024]; - int bufsize = sizeof(buf); - char *str_buf = buf; - int *len_buf = &bufsize; - int i; tdm_error ret; if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_PP)) @@ -243,15 +238,6 @@ _tdm_display_update_caps_pp(tdm_private_display *private_display, return TDM_ERROR_BAD_MODULE; } - TDM_DBG("pp capabilities: %x", caps->capabilities); - buf[0] = '\0'; - for (i = 0; i < caps->format_count; i++) - TDM_SNPRINTF(str_buf, len_buf, "%c%c%c%c ", FOURCC_STR(caps->formats[i])); - TDM_DBG("pp formats: %s", buf); - TDM_DBG("pp min : %dx%d", caps->min_w, caps->min_h); - TDM_DBG("pp max : %dx%d", caps->max_w, caps->max_h); - TDM_DBG("pp align: %d", caps->preferred_align); - return TDM_ERROR_NONE; } @@ -260,11 +246,6 @@ _tdm_display_update_caps_capture(tdm_private_display *private_display, tdm_caps_capture *caps) { tdm_func_display *func_display = &private_display->func_display; - char buf[1024]; - int bufsize = sizeof(buf); - char *str_buf = buf; - int *len_buf = &bufsize; - int i; tdm_error ret; if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_CAPTURE)) @@ -281,11 +262,6 @@ _tdm_display_update_caps_capture(tdm_private_display *private_display, return TDM_ERROR_BAD_MODULE; } - buf[0] = '\0'; - for (i = 0; i < caps->format_count; i++) - TDM_SNPRINTF(str_buf, len_buf, "%c%c%c%c ", FOURCC_STR(caps->formats[i])); - TDM_DBG("capture formats: %s", buf); - return TDM_ERROR_NONE; } @@ -294,11 +270,6 @@ _tdm_display_update_caps_layer(tdm_private_display *private_display, tdm_layer *layer_backend, tdm_caps_layer *caps) { tdm_func_layer *func_layer = &private_display->func_layer; - char buf[1024]; - int bufsize = sizeof(buf); - char *str_buf = buf; - int *len_buf = &bufsize; - int i; tdm_error ret; if (!func_layer->layer_get_capability) { @@ -312,15 +283,6 @@ _tdm_display_update_caps_layer(tdm_private_display *private_display, return TDM_ERROR_BAD_MODULE; } - TDM_DBG("layer capabilities: %x", caps->capabilities); - TDM_DBG("layer zpos : %d", caps->zpos); - buf[0] = '\0'; - for (i = 0; i < caps->format_count; i++) - TDM_SNPRINTF(str_buf, len_buf, "%c%c%c%c ", FOURCC_STR(caps->formats[i])); - TDM_DBG("layer formats: %s", buf); - for (i = 0; i < caps->prop_count; i++) - TDM_DBG("layer props: %d, %s", caps->props[i].id, caps->props[i].name); - return TDM_ERROR_NONE; } @@ -330,7 +292,6 @@ _tdm_display_update_caps_output(tdm_private_display *private_display, int pipe, { tdm_func_output *func_output = &private_display->func_output; char temp[TDM_NAME_LEN]; - int i; tdm_error ret; if (!func_output->output_get_capability) { @@ -348,28 +309,6 @@ _tdm_display_update_caps_output(tdm_private_display *private_display, int pipe, snprintf(temp, TDM_NAME_LEN, "%s-%d", caps->model, pipe); snprintf(caps->model, TDM_NAME_LEN, "%s", temp); - TDM_DBG("output maker: %s", caps->maker); - TDM_DBG("output model: %s", caps->model); - TDM_DBG("output name: %s", caps->name); - TDM_DBG("output status: %d", caps->status); - TDM_DBG("output type : %d", caps->type); - for (i = 0; i < caps->prop_count; i++) - TDM_DBG("output props: %d, %s", caps->props[i].id, caps->props[i].name); - for (i = 0; i < caps->mode_count; i++) { - TDM_DBG("output modes: name(%s), clock(%d) vrefresh(%d), flags(%x), type(%d)", - caps->modes[i].name, caps->modes[i].clock, caps->modes[i].vrefresh, - caps->modes[i].flags, caps->modes[i].type); - TDM_DBG("\t\t %d, %d, %d, %d, %d", - caps->modes[i].hdisplay, caps->modes[i].hsync_start, caps->modes[i].hsync_end, - caps->modes[i].htotal, caps->modes[i].hskew); - TDM_DBG("\t\t %d, %d, %d, %d, %d", - caps->modes[i].vdisplay, caps->modes[i].vsync_start, caps->modes[i].vsync_end, - caps->modes[i].vtotal, caps->modes[i].vscan); - } - TDM_DBG("output min : %dx%d", caps->min_w, caps->min_h); - TDM_DBG("output max : %dx%d", caps->max_w, caps->max_h); - TDM_DBG("output align: %d", caps->preferred_align); - return TDM_ERROR_NONE; } diff --git a/src/tdm_helper.c b/src/tdm_helper.c index b9ad240..f2955ec 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -494,230 +494,255 @@ tdm_helper_capture_output(tdm_output *output, tbm_surface_h dst_buffer, EXTERN void tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) { - const char *name, *vendor; - int major, minor; + tdm_private_display *private_display; + tdm_backend_module *module_data; + tdm_func_output *func_output; + tdm_func_layer *func_layer; + tdm_private_output *private_output = NULL; + tdm_private_layer *private_layer = NULL; + tdm_private_pp *private_pp = NULL; + tdm_private_capture *private_capture = NULL; tdm_error ret; - int i, count; - tdm_output *output; - const tdm_prop *props; - int min_w, min_h, max_w, max_h, preferred_align; - const tbm_format *formats; - tdm_display_capability display_caps; + int i; - ret = tdm_display_get_backend_info(dpy, &name, &vendor, &major, &minor); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); + TDM_DBG_RETURN_IF_FAIL(dpy != NULL); - TDM_SNPRINTF(reply, len, "TDM backend name: %s\n", name); - TDM_SNPRINTF(reply, len, "TDM backend vendor: %s\n", vendor); - TDM_SNPRINTF(reply, len, "TDM backend version: %d.%d\n\n", major, minor); + private_display = dpy; + func_output = &private_display->func_output; + func_layer = &private_display->func_layer; + _pthread_mutex_lock(&private_display->lock); - ret = tdm_display_get_output_count(dpy, &count); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); + /* module information */ + module_data = private_display->module_data; + TDM_SNPRINTF(reply, len, "[TDM backend information]\n"); + TDM_SNPRINTF(reply, len, "name: %s\n", module_data->name); + TDM_SNPRINTF(reply, len, "vendor: %s\n", module_data->vendor); + TDM_SNPRINTF(reply, len, "version: %d.%d\n\n", + (int)TDM_BACKEND_GET_ABI_MAJOR(module_data->abi_version), + (int)TDM_BACKEND_GET_ABI_MINOR(module_data->abi_version)); + /* output information */ TDM_SNPRINTF(reply, len, "[Output information]\n"); - TDM_SNPRINTF(reply, len, "-------------------------------------------------------------------------------------------\n"); - TDM_SNPRINTF(reply, len, "idx maker model name type status dpms subpix prefer min max phy\n"); - TDM_SNPRINTF(reply, len, "-------------------------------------------------------------------------------------------\n"); - - for (i = 0; i < count; i++) { - /* idx maker model name type status dpms subpix prefer min max phy */ - const char *maker, *model, *name; - tdm_output_type type; - tdm_output_conn_status status; - unsigned int subpixel; - unsigned int mmWidth, mmHeight; - tdm_output_dpms dpms; - const tdm_output_mode *mode, *modes; - int j, cnt; - - output = tdm_display_get_output(dpy, i, &ret); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_model_info(output, &maker, &model, &name); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_output_type(output, &type); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_conn_status(output, &status); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_dpms(output, &dpms); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_subpixel(output, &subpixel); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_available_size(output, &min_w, &min_h, &max_w, &max_h, &preferred_align); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_physical_size(output, &mmWidth, &mmHeight); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - + TDM_SNPRINTF(reply, len, "--------------------------------------------------------------------------------------------\n"); + TDM_SNPRINTF(reply, len, "idx maker model name type status dpms subpixel align_w min max phy(mm)\n"); + TDM_SNPRINTF(reply, len, "--------------------------------------------------------------------------------------------\n"); + LIST_FOR_EACH_ENTRY(private_output, &private_display->output_list, link) { TDM_SNPRINTF(reply, len, "%d %s %s %s %s %s %s %d %d %dx%d %dx%d %dx%d\n", - i, maker, model, name, tdm_conn_str(type), tdm_status_str(status), - tdm_dpms_str(dpms), subpixel, preferred_align, - min_w, min_h, max_w, max_h, mmWidth, mmHeight); - - ret = tdm_output_get_mode(output, &mode); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - - ret = tdm_output_get_available_modes(output, &modes, &cnt); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - - TDM_SNPRINTF(reply, len, "\t%d modes:\n", cnt); - - if (cnt > 0) { - TDM_SNPRINTF(reply, len, "\t\tname refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n"); - for (j = 0; j < cnt; j++) { - char *current = (mode == modes + j) ? "*" : " "; + private_output->index, private_output->caps.maker, + private_output->caps.model, private_output->caps.name, + tdm_conn_str(private_output->caps.type), + tdm_status_str(private_output->caps.status), + tdm_dpms_str(private_output->current_dpms_value), + private_output->caps.subpixel, + private_output->caps.preferred_align, + private_output->caps.min_w, private_output->caps.min_h, + private_output->caps.max_w, private_output->caps.max_h, + private_output->caps.mmWidth, private_output->caps.mmHeight); + + TDM_SNPRINTF(reply, len, "\t%d modes:\n", private_output->caps.mode_count); + + if (private_output->caps.mode_count > 0) { + const tdm_output_mode *current_mode = NULL; + + TDM_DBG_GOTO_IF_FAIL(func_output->output_get_mode, unlock); + 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"); + 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 ", current, - modes[j].name, - modes[j].vrefresh, - modes[j].hdisplay, - modes[j].hsync_start, - modes[j].hsync_end, - modes[j].htotal, - modes[j].vdisplay, - modes[j].vsync_start, - modes[j].vsync_end, - modes[j].vtotal); - tdm_mode_flag_str(modes[j].flags, &reply, len); + private_output->caps.modes[i].name, + private_output->caps.modes[i].vrefresh, + private_output->caps.modes[i].hdisplay, + private_output->caps.modes[i].hsync_start, + private_output->caps.modes[i].hsync_end, + private_output->caps.modes[i].htotal, + 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); + tdm_mode_flag_str(private_output->caps.modes[i].flags, &reply, len); TDM_SNPRINTF(reply, len, " "); - tdm_mode_type_str(modes[j].type, &reply, len); + tdm_mode_type_str(private_output->caps.modes[i].type, &reply, len); TDM_SNPRINTF(reply, len, "\n"); } } - ret = tdm_output_get_available_properties(output, &props, &cnt); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - - TDM_SNPRINTF(reply, len, "\t%d properties:\n", cnt); - if (cnt > 0) { - TDM_SNPRINTF(reply, len, "\t\tname idx value\n"); - for (j = 0; j < cnt; j++) { + TDM_SNPRINTF(reply, len, "\t%d properties:\n", private_output->caps.prop_count); + if (private_output->caps.prop_count > 0) { + TDM_SNPRINTF(reply, len, "\t\tname\tidx\tvalue\n"); + for (i = 0; i < private_output->caps.prop_count; i++) { tdm_value value; - ret = tdm_output_get_property(output, props[j].id, &value); - TDM_SNPRINTF(reply, len, "\t\t%s %d %d\n", - props[j].name, - props[j].id, + TDM_DBG_GOTO_IF_FAIL(func_output->output_get_property, unlock); + ret = func_output->output_get_property(private_output->output_backend, + private_output->caps.props[i].id, + &value); + TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); + TDM_SNPRINTF(reply, len, "\t\t%s\t%d\t%d\n", + private_output->caps.props[i].name, + private_output->caps.props[i].id, value.u32); } } - TDM_SNPRINTF(reply, len, "\n"); } + TDM_SNPRINTF(reply, len, "\n"); + /* layer information */ TDM_SNPRINTF(reply, len, "[Layer information]\n"); - for (i = 0; i < count; i++) { - int j, cnt; - - output = tdm_display_get_output(dpy, i, &ret); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - - ret = tdm_output_get_layer_count(output, &cnt); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - - if (cnt > 0) { - TDM_SNPRINTF(reply, len, "-----------------------------------------------------\n"); - TDM_SNPRINTF(reply, len, "idx output zpos buf info caps\n"); - TDM_SNPRINTF(reply, len, "-----------------------------------------------------\n"); - for (j = 0; j < cnt; j++) { - tdm_layer *layer; - tbm_surface_h buf; - tdm_layer_capability layer_caps; - int k, c, zpos; + TDM_SNPRINTF(reply, len, "-----------------------------------------------------------------------\n"); + TDM_SNPRINTF(reply, len, "idx output zpos buf format size crop geometry transform\n"); + TDM_SNPRINTF(reply, len, "-----------------------------------------------------------------------\n"); + LIST_FOR_EACH_ENTRY(private_output, &private_display->output_list, link) { + LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link) { + if (!private_layer->usable) { tdm_info_layer info; + unsigned int format; + tdm_size size; + tbm_surface_info_s buf_info; + TDM_DBG_GOTO_IF_FAIL(func_layer->layer_get_info, unlock); memset(&info, 0, sizeof info); + ret = func_layer->layer_get_info(private_layer->layer_backend, &info); + TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); - layer = tdm_output_get_layer(output, j, &ret); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_layer_get_capabilities(layer, &layer_caps); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_layer_get_zpos(layer, &zpos); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); + format = tbm_surface_get_format(private_layer->showing_buffer); + tbm_surface_get_info(private_layer->showing_buffer, &buf_info); - ret = tdm_layer_get_info(layer, &info); - buf = tdm_layer_get_displaying_buffer(layer, &ret); + if (IS_RGB(format)) + size.h = buf_info.planes[0].stride >> 2; + else + size.h = buf_info.planes[0].stride; + size.v = tbm_surface_get_height(private_layer->showing_buffer); if (info.src_config.format) - TDM_SNPRINTF(reply, len, "%d %d %d %p %c%c%c%c %dx%d (%d,%d %dx%d) (%d,%d %dx%d) trans(%d) ", - j, i, zpos, buf, - FOURCC_STR(info.src_config.format), info.src_config.size.h, info.src_config.size.v, - info.src_config.pos.x, info.src_config.pos.y, info.src_config.pos.w, info.src_config.pos.h, - info.dst_pos.x, info.dst_pos.y, info.dst_pos.w, info.dst_pos.h, - info.transform); - else - TDM_SNPRINTF(reply, len, "%d %d %d %p %c%c%c%c %dx%d (%d,%d %dx%d) (%d,%d %dx%d) trans(%d) ", - j, i, zpos, buf, - 'N', 'O', 'N', 'E', info.src_config.size.h, info.src_config.size.v, - info.src_config.pos.x, info.src_config.pos.y, info.src_config.pos.w, info.src_config.pos.h, - info.dst_pos.x, info.dst_pos.y, info.dst_pos.w, info.dst_pos.h, - info.transform); - tdm_layer_caps_str(layer_caps, &reply, len); - TDM_SNPRINTF(reply, len, "\n"); + format = (info.src_config.format)?:format; + + TDM_SNPRINTF(reply, len, "%d %d %d %p %c%c%c%c %dx%d %dx%d+%d+%d %dx%d+%d+%d %s\n", + private_layer->index, + private_output->index, + private_layer->caps.zpos, + private_layer->showing_buffer, FOURCC_STR(format), size.h, size.v, + info.src_config.pos.w, info.src_config.pos.h, info.src_config.pos.x, info.src_config.pos.y, + info.dst_pos.w, info.dst_pos.h, info.dst_pos.x, info.dst_pos.y, + tdm_transform_str(info.transform)); + } else { + TDM_SNPRINTF(reply, len, "%d %d %d -\n", + private_layer->index, + private_output->index, + private_layer->caps.zpos); + } - ret = tdm_layer_get_available_properties(layer, &props, &c); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - TDM_SNPRINTF(reply, len, "\t%d properties:\n", c); - if (c > 0) { - TDM_SNPRINTF(reply, len, "\t\tname idx value\n"); - for (k = 0; k < c; k++) { - tdm_value value; - ret = tdm_layer_get_property(layer, props[k].id, &value); - TDM_SNPRINTF(reply, len, "\t\t%s %d %d\n", - props[k].name, - props[k].id, - value.u32); - } - } + TDM_SNPRINTF(reply, len, "\tcaps\t: "); + tdm_layer_caps_str(private_layer->caps.capabilities, &reply, len); + TDM_SNPRINTF(reply, len, "\n"); - ret = tdm_layer_get_available_formats(layer, &formats, &c); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - TDM_SNPRINTF(reply, len, "\tformats:"); - for (k = 0; k < c; k++) - TDM_SNPRINTF(reply, len, " %c%c%c%c", FOURCC_STR(formats[k])); + TDM_SNPRINTF(reply, len, "\tformats\t: "); + if (private_layer->caps.format_count > 0) { + const char *sep = ""; + for (i = 0; i < private_layer->caps.format_count; i++) { + TDM_SNPRINTF(reply, len, "%s%c%c%c%c", sep, FOURCC_STR(private_layer->caps.formats[i])); + sep = ","; + } TDM_SNPRINTF(reply, len, "\n"); } + + TDM_SNPRINTF(reply, len, "\t%d properties:\n", private_layer->caps.prop_count); + if (private_layer->caps.prop_count > 0) { + TDM_SNPRINTF(reply, len, "\t\tname\tidx\tvalue\n"); + for (i = 0; i < private_layer->caps.prop_count; i++) { + tdm_value value; + TDM_DBG_GOTO_IF_FAIL(func_layer->layer_get_property, unlock); + ret = func_layer->layer_get_property(private_layer->layer_backend, + private_layer->caps.props[i].id, + &value); + TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); + TDM_SNPRINTF(reply, len, "\t\t%s\t%d\t%d\n", + private_layer->caps.props[i].name, + private_layer->caps.props[i].id, + value.u32); + } + } } } - TDM_SNPRINTF(reply, len, "\n"); - ret = tdm_display_get_capabilities(dpy, &display_caps); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - - if (display_caps & TDM_DISPLAY_CAPABILITY_PP) { - tdm_pp_capability pp_caps; - - ret = tdm_display_get_pp_capabilities(dpy, &pp_caps); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_display_get_pp_available_formats(dpy, &formats, &count); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_display_get_pp_available_size(dpy, &min_w, &min_h, &max_w, &max_h, &preferred_align); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - + if (private_display->capabilities & TDM_DISPLAY_CAPABILITY_PP) { + const char *sep = ""; TDM_SNPRINTF(reply, len, "[PP information]\n"); - TDM_SNPRINTF(reply, len, "caps: "); - tdm_pp_caps_str(pp_caps, &reply, len); + TDM_SNPRINTF(reply, len, "caps\t: "); + tdm_pp_caps_str(private_display->caps_pp.capabilities, &reply, len); TDM_SNPRINTF(reply, len, "\n"); - TDM_SNPRINTF(reply, len, "formats: "); - for (i = 0; i < count; i++) - TDM_SNPRINTF(reply, len, " %c%c%c%c", FOURCC_STR(formats[i])); + TDM_SNPRINTF(reply, len, "formats\t: "); + for (i = 0; i < private_display->caps_pp.format_count; i++) { + TDM_SNPRINTF(reply, len, "%s%c%c%c%c", sep, FOURCC_STR(private_display->caps_pp.formats[i])); + sep = ","; + } TDM_SNPRINTF(reply, len, "\n"); - TDM_SNPRINTF(reply, len, "size: min(%dx%d) max(%dx%d) preferred(%d)\n", - min_w, min_h, max_w, max_h, preferred_align); + TDM_SNPRINTF(reply, len, "size\t: min(%dx%d) max(%dx%d) align_w(%d)\n", + private_display->caps_pp.min_w, private_display->caps_pp.min_h, + private_display->caps_pp.max_w, private_display->caps_pp.max_h, + private_display->caps_pp.preferred_align); + if (!LIST_IS_EMPTY(&private_display->pp_list)) { + TDM_SNPRINTF(reply, len, "-------------------------------------------------------------\n"); + TDM_SNPRINTF(reply, len, "src(format size crop) | dst(format size crop) | transform\n"); + TDM_SNPRINTF(reply, len, "-------------------------------------------------------------\n"); + LIST_FOR_EACH_ENTRY(private_pp, &private_display->pp_list, link) { + TDM_SNPRINTF(reply, len, "%c%c%c%c %dx%d %dx%d+%d+%d | %c%c%c%c %dx%d %dx%d+%d+%d | %s\n", + FOURCC_STR(private_pp->info.src_config.format), + private_pp->info.src_config.size.h, + private_pp->info.src_config.size.v, + private_pp->info.src_config.pos.x, private_pp->info.src_config.pos.y, + private_pp->info.src_config.pos.w, private_pp->info.src_config.pos.h, + FOURCC_STR(private_pp->info.dst_config.format), + private_pp->info.dst_config.size.h, + private_pp->info.dst_config.size.v, + private_pp->info.dst_config.pos.x, private_pp->info.dst_config.pos.y, + private_pp->info.dst_config.pos.w, private_pp->info.dst_config.pos.h, + tdm_transform_str(private_pp->info.transform)); + } + } + } else { + TDM_SNPRINTF(reply, len, "[No PP capability]\n"); } + TDM_SNPRINTF(reply, len, "\n"); - if (display_caps & TDM_DISPLAY_CAPABILITY_CAPTURE) { - tdm_capture_capability capture_caps; - - ret = tdm_display_get_capture_capabilities(dpy, &capture_caps); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_display_get_catpure_available_formats(dpy, &formats, &count); - TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - + if (private_display->capabilities & TDM_DISPLAY_CAPABILITY_CAPTURE) { + const char *sep = ""; TDM_SNPRINTF(reply, len, "[Capture information]\n"); - TDM_SNPRINTF(reply, len, "caps: "); - tdm_capture_caps_str(capture_caps, &reply, len); + TDM_SNPRINTF(reply, len, "caps\t: "); + tdm_capture_caps_str(private_display->caps_capture.capabilities, &reply, len); TDM_SNPRINTF(reply, len, "\n"); - TDM_SNPRINTF(reply, len, "formats: "); - for (i = 0; i < count; i++) - TDM_SNPRINTF(reply, len, " %c%c%c%c", FOURCC_STR(formats[i])); + TDM_SNPRINTF(reply, len, "formats\t: "); + for (i = 0; i < private_display->caps_capture.format_count; i++) { + TDM_SNPRINTF(reply, len, "%s%c%c%c%c", sep, FOURCC_STR(private_display->caps_capture.formats[i])); + sep = ","; + } TDM_SNPRINTF(reply, len, "\n"); + TDM_SNPRINTF(reply, len, "size\t: min(%dx%d) max(%dx%d) align_w(%d)\n", + private_display->caps_capture.min_w, private_display->caps_capture.min_h, + private_display->caps_capture.max_w, private_display->caps_capture.max_h, + private_display->caps_capture.preferred_align); + if (!LIST_IS_EMPTY(&private_display->capture_list)) { + TDM_SNPRINTF(reply, len, "-----------------------------------\n"); + TDM_SNPRINTF(reply, len, "dst(format size crop) | transform\n"); + TDM_SNPRINTF(reply, len, "-----------------------------------\n"); + LIST_FOR_EACH_ENTRY(private_capture, &private_display->capture_list, link) { + TDM_SNPRINTF(reply, len, "%c%c%c%c %dx%d %dx%d+%d+%d | %s\n", + FOURCC_STR(private_capture->info.dst_config.format), + private_capture->info.dst_config.size.h, + private_capture->info.dst_config.size.v, + private_capture->info.dst_config.pos.x, private_capture->info.dst_config.pos.y, + private_capture->info.dst_config.pos.w, private_capture->info.dst_config.pos.h, + tdm_transform_str(private_capture->info.transform)); + } + } + } else { + TDM_SNPRINTF(reply, len, "[No Capture capability]\n"); } + TDM_SNPRINTF(reply, len, "\n"); + +unlock: + _pthread_mutex_unlock(&private_display->lock); } diff --git a/src/tdm_macro.h b/src/tdm_macro.h index fe762c2..bc4c0bd 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -200,12 +200,28 @@ static struct tdm_type_name tdm_conn_names[] = { }; TDM_TYPE_NAME_FN(conn) +static struct tdm_type_name tdm_transform_names[] = { + { TDM_TRANSFORM_NORMAL, "none" }, + { TDM_TRANSFORM_90, "90" }, + { TDM_TRANSFORM_180, "180" }, + { TDM_TRANSFORM_270, "270" }, + { TDM_TRANSFORM_FLIPPED, "flipped" }, + { TDM_TRANSFORM_FLIPPED_90, "90,flipped" }, + { TDM_TRANSFORM_FLIPPED_180, "180,flipped" }, + { TDM_TRANSFORM_FLIPPED_270, "270,flipped" }, +}; +TDM_TYPE_NAME_FN(transform) + #define TDM_BIT_NAME_FB(res) \ static inline const char * tdm_##res##_str(int type, char **reply, int *len) \ { \ unsigned int i; \ const char *sep = ""; \ + if (type == 0) { \ + TDM_SNPRINTF(*reply, len, "none"); \ + return NULL; \ + } \ for (i = 0; i < TDM_ARRAY_SIZE(tdm_##res##_names); i++) { \ if (type & (1 << i)) { \ TDM_SNPRINTF(*reply, len, "%s%s", sep, tdm_##res##_names[i]); \ diff --git a/tools/tdm_test_server.c b/tools/tdm_test_server.c index aec7aee..95d78c0 100644 --- a/tools/tdm_test_server.c +++ b/tools/tdm_test_server.c @@ -709,10 +709,9 @@ print_args(tdm_test_server *data) tdm_test_server_capture *c = NULL; tdm_test_server_prop *w = NULL; - if (data->do_query) { - printf("query\n"); + if (data->do_query) return; - } + LIST_FOR_EACH_ENTRY(o, &data->output_list, link) { printf("output %d: %s", o->idx, o->mode); if (o->refresh > 0) -- 2.7.4 From 66351811df6ed459ac3a19197e96e61884947a7f Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 21 Jul 2016 14:39:08 +0900 Subject: [PATCH 03/16] add the buffer clear helper function Change-Id: Id9b20d38b3d1558d0a59db30b7ec302775f2f943 --- include/tdm_helper.h | 17 +++++++++++++++++ src/tdm_helper.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/include/tdm_helper.h b/include/tdm_helper.h index d526981..7342e5d 100644 --- a/include/tdm_helper.h +++ b/include/tdm_helper.h @@ -69,6 +69,23 @@ void tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file); /** + * @brief fill a buffer with 0. + * @details + * This function supports only if a buffer has below formats. + * - TBM_FORMAT_ARGB8888 + * - TBM_FORMAT_XRGB8888 + * - TBM_FORMAT_YVU420 + * - TBM_FORMAT_YUV420 + * - TBM_FORMAT_NV12 + * - TBM_FORMAT_NV21 + * - TBM_FORMAT_YUYV + * - TBM_FORMAT_UYVY + * @param[in] buffer A TDM buffer + */ +void +tdm_helper_clear_buffer(tbm_surface_h buffer); + +/** * @brief Get a fd from the given enviroment variable. * @details * This function will dup the fd of the given enviroment variable. The Caller diff --git a/src/tdm_helper.c b/src/tdm_helper.c index f2955ec..92d7545 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -265,6 +265,57 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) TDM_INFO("dump %s", file); } +EXTERN void +tdm_helper_clear_buffer(tbm_surface_h buffer) +{ + tbm_surface_info_s info; + int ret; + + TDM_RETURN_IF_FAIL(buffer != NULL); + + ret = tbm_surface_map(buffer, TBM_OPTION_READ, &info); + TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); + + switch (info.format) { + case TBM_FORMAT_ARGB8888: + case TBM_FORMAT_XRGB8888: + memset(info.planes[0].ptr, 0, info.planes[0].stride * info.height); + break; + case TBM_FORMAT_YVU420: + case TBM_FORMAT_YUV420: + memset((char*)info.planes[0].ptr, 0x10, info.planes[0].stride * info.height); + memset((char*)info.planes[1].ptr, 0x80, info.planes[1].stride * (info.height >> 1)); + memset((char*)info.planes[2].ptr, 0x80, info.planes[2].stride * (info.height >> 1)); + break; + case TBM_FORMAT_NV12: + case TBM_FORMAT_NV21: + memset((char*)info.planes[0].ptr, 0x10, info.planes[0].stride * info.height); + memset((char*)info.planes[1].ptr, 0x80, info.planes[1].stride * (info.height >> 1)); + break; + case TBM_FORMAT_YUYV: { + int *ibuf = (int*)info.planes[0].ptr; + int i, size = info.planes[0].stride * info.height / 4; + + for (i = 0 ; i < size ; i++) + ibuf[i] = 0x10801080; + } + break; + case TBM_FORMAT_UYVY: { + int *ibuf = (int*)info.planes[0].ptr; + int i, size = info.planes[0].stride * info.height / 4; + + for (i = 0 ; i < size ; i++) + ibuf[i] = 0x80108010; /* YUYV -> 0xVYUY */ + } + break; + default: + TDM_ERR("can't clear %c%c%c%c buffer", FOURCC_STR(info.format)); + break; + } + + tbm_surface_unmap(buffer); +} + EXTERN int tdm_helper_get_fd(const char *env) { -- 2.7.4 From 7268ade514fc6cb79c7754e5696cbc169025ef3f Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 21 Jul 2016 10:30:23 +0900 Subject: [PATCH 04/16] correct the wrong behavior of tdm-test-server Change-Id: I5cba2ec5dbb8e8d42fda82f9d5a7b17b04ed49dd --- include/tdm.h | 9 ++ src/tdm_display.c | 21 +++ tools/buffers.c | 95 ++++++------- tools/tdm_test_server.c | 345 ++++++++++++++++++++++++------------------------ 4 files changed, 254 insertions(+), 216 deletions(-) diff --git a/include/tdm.h b/include/tdm.h index fa0a7f0..8b29a49 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -377,6 +377,15 @@ tdm_error tdm_output_get_pipe(tdm_output *output, unsigned int *pipe); /** + * @brief Get the index of a primary layer. + * @param[in] output A output object + * @param[out] index The primary layer index + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_output_get_primary_index(tdm_output *output, int *index); + +/** * @brief Set the property which has a given id. * @param[in] output A output object * @param[in] id The property id diff --git a/src/tdm_display.c b/src/tdm_display.c index f1bbca5..d84e329 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -745,6 +745,27 @@ tdm_output_get_pipe(tdm_output *output, unsigned int *pipe) return ret; } +EXTERN tdm_error +tdm_output_get_primary_index(tdm_output *output, int *index) +{ + tdm_private_layer *private_layer = NULL; + + OUTPUT_FUNC_ENTRY(); + TDM_RETURN_VAL_IF_FAIL(index != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link) { + if (private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_PRIMARY) { + *index = private_layer->index; + break; + } + } + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} EXTERN tdm_error tdm_output_set_property(tdm_output *output, unsigned int id, tdm_value value) diff --git a/tools/buffers.c b/tools/buffers.c index c4de575..805383b 100644 --- a/tools/buffers.c +++ b/tools/buffers.c @@ -41,6 +41,7 @@ #include "tdm_macro.h" #include "buffers.h" +#define ALPHA_VALUE 100 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) /* ----------------------------------------------------------------------------- @@ -401,32 +402,32 @@ fill_smpte_rgb16(const struct rgb_info *rgb, unsigned char *mem, unsigned int width, unsigned int height, unsigned int stride) { const uint16_t colors_top[] = { - MAKE_RGBA(rgb, 192, 192, 192, 255), /* grey */ - MAKE_RGBA(rgb, 192, 192, 0, 255), /* yellow */ - MAKE_RGBA(rgb, 0, 192, 192, 255), /* cyan */ - MAKE_RGBA(rgb, 0, 192, 0, 255), /* green */ - MAKE_RGBA(rgb, 192, 0, 192, 255), /* magenta */ - MAKE_RGBA(rgb, 192, 0, 0, 255), /* red */ - MAKE_RGBA(rgb, 0, 0, 192, 255), /* blue */ + MAKE_RGBA(rgb, 192, 192, 192, ALPHA_VALUE), /* grey */ + MAKE_RGBA(rgb, 192, 192, 0, ALPHA_VALUE), /* yellow */ + MAKE_RGBA(rgb, 0, 192, 192, ALPHA_VALUE), /* cyan */ + MAKE_RGBA(rgb, 0, 192, 0, ALPHA_VALUE), /* green */ + MAKE_RGBA(rgb, 192, 0, 192, ALPHA_VALUE), /* magenta */ + MAKE_RGBA(rgb, 192, 0, 0, ALPHA_VALUE), /* red */ + MAKE_RGBA(rgb, 0, 0, 192, ALPHA_VALUE), /* blue */ }; const uint16_t colors_middle[] = { - MAKE_RGBA(rgb, 0, 0, 192, 255), /* blue */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 192, 0, 192, 255), /* magenta */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 0, 192, 192, 255), /* cyan */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 192, 192, 192, 255), /* grey */ + MAKE_RGBA(rgb, 0, 0, 192, ALPHA_VALUE), /* blue */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 192, 0, 192, ALPHA_VALUE), /* magenta */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 0, 192, 192, ALPHA_VALUE), /* cyan */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 192, 192, 192, ALPHA_VALUE), /* grey */ }; const uint16_t colors_bottom[] = { - MAKE_RGBA(rgb, 0, 33, 76, 255), /* in-phase */ - MAKE_RGBA(rgb, 255, 255, 255, 255), /* super white */ - MAKE_RGBA(rgb, 50, 0, 106, 255), /* quadrature */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 9, 9, 9, 255), /* 3.5% */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* 7.5% */ - MAKE_RGBA(rgb, 29, 29, 29, 255), /* 11.5% */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ + MAKE_RGBA(rgb, 0, 33, 76, ALPHA_VALUE), /* in-phase */ + MAKE_RGBA(rgb, 255, 255, 255, ALPHA_VALUE), /* super white */ + MAKE_RGBA(rgb, 50, 0, 106, ALPHA_VALUE), /* quadrature */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 9, 9, 9, ALPHA_VALUE), /* 3.5% */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* 7.5% */ + MAKE_RGBA(rgb, 29, 29, 29, ALPHA_VALUE), /* 11.5% */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ }; unsigned int x; unsigned int y; @@ -531,32 +532,32 @@ fill_smpte_rgb32(const struct rgb_info *rgb, unsigned char *mem, unsigned int width, unsigned int height, unsigned int stride) { const uint32_t colors_top[] = { - MAKE_RGBA(rgb, 192, 192, 192, 255), /* grey */ - MAKE_RGBA(rgb, 192, 192, 0, 255), /* yellow */ - MAKE_RGBA(rgb, 0, 192, 192, 255), /* cyan */ - MAKE_RGBA(rgb, 0, 192, 0, 255), /* green */ - MAKE_RGBA(rgb, 192, 0, 192, 255), /* magenta */ - MAKE_RGBA(rgb, 192, 0, 0, 255), /* red */ - MAKE_RGBA(rgb, 0, 0, 192, 255), /* blue */ + MAKE_RGBA(rgb, 192, 192, 192, ALPHA_VALUE), /* grey */ + MAKE_RGBA(rgb, 192, 192, 0, ALPHA_VALUE), /* yellow */ + MAKE_RGBA(rgb, 0, 192, 192, ALPHA_VALUE), /* cyan */ + MAKE_RGBA(rgb, 0, 192, 0, ALPHA_VALUE), /* green */ + MAKE_RGBA(rgb, 192, 0, 192, ALPHA_VALUE), /* magenta */ + MAKE_RGBA(rgb, 192, 0, 0, ALPHA_VALUE), /* red */ + MAKE_RGBA(rgb, 0, 0, 192, ALPHA_VALUE), /* blue */ }; const uint32_t colors_middle[] = { - MAKE_RGBA(rgb, 0, 0, 192, 255), /* blue */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 192, 0, 192, 255), /* magenta */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 0, 192, 192, 255), /* cyan */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 192, 192, 192, 255), /* grey */ + MAKE_RGBA(rgb, 0, 0, 192, ALPHA_VALUE), /* blue */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 192, 0, 192, ALPHA_VALUE), /* magenta */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 0, 192, 192, ALPHA_VALUE), /* cyan */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 192, 192, 192, ALPHA_VALUE), /* grey */ }; const uint32_t colors_bottom[] = { - MAKE_RGBA(rgb, 0, 33, 76, 255), /* in-phase */ - MAKE_RGBA(rgb, 255, 255, 255, 255), /* super white */ - MAKE_RGBA(rgb, 50, 0, 106, 255), /* quadrature */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ - MAKE_RGBA(rgb, 9, 9, 9, 255), /* 3.5% */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* 7.5% */ - MAKE_RGBA(rgb, 29, 29, 29, 255), /* 11.5% */ - MAKE_RGBA(rgb, 19, 19, 19, 255), /* black */ + MAKE_RGBA(rgb, 0, 33, 76, ALPHA_VALUE), /* in-phase */ + MAKE_RGBA(rgb, 255, 255, 255, ALPHA_VALUE), /* super white */ + MAKE_RGBA(rgb, 50, 0, 106, ALPHA_VALUE), /* quadrature */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ + MAKE_RGBA(rgb, 9, 9, 9, ALPHA_VALUE), /* 3.5% */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* 7.5% */ + MAKE_RGBA(rgb, 29, 29, 29, ALPHA_VALUE), /* 11.5% */ + MAKE_RGBA(rgb, 19, 19, 19, ALPHA_VALUE), /* black */ }; unsigned int x; unsigned int y; @@ -585,7 +586,7 @@ fill_smpte_rgb32(const struct rgb_info *rgb, unsigned char *mem, colors_bottom[(x - width * 5 / 7) * 3 / (width / 7) + 4]; for (; x < width; ++x) { - ((uint32_t *)mem)[x] = (rand_r(&rand_seed) % 2) ? MAKE_RGBA(rgb, 255, 255, 255, 255) : MAKE_RGBA(rgb, 0, 0, 0, 255); + ((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; } @@ -751,7 +752,7 @@ fill_tiles_rgb16(const struct format_info *info, unsigned char *mem, uint16_t color = MAKE_RGBA(rgb, (rgb32 >> 16) & 0xff, (rgb32 >> 8) & 0xff, rgb32 & 0xff, - 255); + ALPHA_VALUE); ((uint16_t *)mem)[x] = color; } @@ -796,7 +797,7 @@ fill_tiles_rgb32(const struct format_info *info, unsigned char *mem, uint32_t color = MAKE_RGBA(rgb, (rgb32 >> 16) & 0xff, (rgb32 >> 8) & 0xff, rgb32 & 0xff, - 255); + ALPHA_VALUE); ((uint32_t *)mem)[x] = color; } diff --git a/tools/tdm_test_server.c b/tools/tdm_test_server.c index 95d78c0..3870448 100644 --- a/tools/tdm_test_server.c +++ b/tools/tdm_test_server.c @@ -112,7 +112,7 @@ static struct optstrings optstrs[] = { ":", NULL }, { - OPT_GEN, "b", "set the fill(smtpe,tiles,plane) and framebuffer type(scanout,noncachable,wc)", + OPT_GEN, "b", "set the fill(smtpe,tiles,plain) and framebuffer type(scanout,noncachable,wc)", "[:[,[,...]]]", NULL }, { @@ -121,11 +121,40 @@ static struct optstrings optstrs[] = { }, }; +struct usagestring { + const char *string; + const char *desc; +}; + +static struct usagestring usages[] = { + { + "-q", + NULL + }, + { + "-a -b plain", + "test all outputs, layers with plain buffers" + }, + { + "-o 0@1920x1080", + "Set the \"1920x1080\" mode to the output 0. And show a buffer via a primary layer of the output 0" + }, + { + "-o 0@1920x1080 -l 1~640x480+50+100", + "Create the 640x480 buffer and show it in the (50,100) pos of screen via the layer 1" + }, + { + "-p 320x240@NV12~480x360+80+40,640x480@AR24 -l 1~640x480+50+100", + "Convert the 320x240@NV12 buffer to the 640x480@AR24 buffer(480x360+80+40) and show the result via the layer 1" + }, +}; + static void usage(char *app_name) { int type_size = sizeof(typestrs) / sizeof(struct typestrings); int opt_size = sizeof(optstrs) / sizeof(struct optstrings); + int usages_size = sizeof(usages) / sizeof(struct usagestring); int t; printf("usage: %s \n\n", app_name); @@ -147,6 +176,13 @@ usage(char *app_name) printf("\n"); } + printf(" For example)\n\n"); + + for (t = 0; t < usages_size; t++) { + printf(" $ %s %s\n", app_name, usages[t].string); + printf("\t%s\n", usages[t].desc); + } + printf("\n"); exit(0); } @@ -159,6 +195,8 @@ static const char *tdm_buf_flag_names[] = { }; TDM_BIT_NAME_FB(buf_flag) +#define DEFAULT_FORMAT TBM_FORMAT_ARGB8888 + #define print_size(s) \ printf("%dx%d", (s)->h, (s)->v) #define print_pos(p) \ @@ -212,6 +250,8 @@ typedef struct _tdm_test_server_output { struct list_head layer_list; tdm_test_server *data; tdm_output *output; + + int fill_primary_layer; } tdm_test_server_output; typedef struct _tdm_test_server_pp { @@ -488,18 +528,16 @@ parse_args(tdm_test_server *data, int argc, char *argv[]) LIST_INITHEAD(&o->prop_list); LIST_ADDTAIL(&o->link, &data->output_list); parse_arg_o(o, argv[++i]); - last_option = o; last_object = o; } else if (!strncmp(argv[i] + 1, "p", 1)) { TDM_GOTO_IF_FAIL(data->do_all == 0, all); p = calloc(1, sizeof * p); TDM_EXIT_IF_FAIL(p != NULL); p->data = data; - p->fps = 30; + p->fps = 30; /* default 30 fps */ LIST_ADDTAIL(&p->link, &data->pp_list); parse_arg_p(p, argv[++i]); last_option = p; - last_object = o; } else if (!strncmp(argv[i] + 1, "c", 1)) { TDM_GOTO_IF_FAIL(data->do_all == 0, all); c = calloc(1, sizeof * c); @@ -510,11 +548,16 @@ parse_args(tdm_test_server *data, int argc, char *argv[]) LIST_ADDTAIL(&c->link, &data->capture_list); parse_arg_c(c, argv[++i]); last_option = c; - last_object = o; } else if (!strncmp(argv[i] + 1, "l", 1)) { TDM_GOTO_IF_FAIL(data->do_all == 0, all); - if (!o) - goto no_output; + if (!o) { + o = calloc(1, sizeof * o); + TDM_EXIT_IF_FAIL(o != NULL); + o->data = data; + LIST_INITHEAD(&o->layer_list); + LIST_INITHEAD(&o->prop_list); + LIST_ADDTAIL(&o->link, &data->output_list); + } l = calloc(1, sizeof * l); TDM_EXIT_IF_FAIL(l != NULL); LIST_INITHEAD(&l->prop_list); @@ -525,12 +568,11 @@ parse_args(tdm_test_server *data, int argc, char *argv[]) if (p && last_option == p) { p->l = l; l->owner_p = p; - } - else if (c && last_option == c) { + } else if (c && last_option == c) { c->l = l; l->owner_c = c; } - last_object = o; + last_object = l; } else if (!strncmp(argv[i] + 1, "w", 1)) { TDM_GOTO_IF_FAIL(data->do_all == 0, all); if (!last_object) @@ -551,12 +593,22 @@ parse_args(tdm_test_server *data, int argc, char *argv[]) exit(0); } } + + LIST_FOR_EACH_ENTRY(p, &data->pp_list, link) { + if (!p->l) + goto no_layer; + } + LIST_FOR_EACH_ENTRY(c, &data->capture_list, link) { + if (!c->l) + goto no_layer; + } + return; -no_output: - printf("Use '-o' to set a output first.\n"); +no_layer: + printf("Use '-l' to set a layer for '-p' or '-c'.\n"); exit(0); no_object: - printf("Use '-o' or '-l' or '-p' or '-c' to set a object first.\n"); + printf("Use '-o' or '-l' to set a object first.\n"); exit(0); all: printf("Can't use '-%s' with '-a'.\n", argv[i] + 1); @@ -570,6 +622,7 @@ interpret_args(tdm_test_server *data) tdm_test_server_layer *l = NULL; tdm_error ret; + /* create the objects of outputs */ if (data->do_all) { int i, output_count; @@ -577,9 +630,6 @@ interpret_args(tdm_test_server *data) TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); for (i = 0; i < output_count; i++) { - tdm_output *output; - int j, layer_count; - o = calloc(1, sizeof * o); TDM_EXIT_IF_FAIL(o != NULL); o->data = data; @@ -587,41 +637,16 @@ interpret_args(tdm_test_server *data) LIST_INITHEAD(&o->prop_list); LIST_ADDTAIL(&o->link, &data->output_list); o->idx = i; - - output = tdm_display_get_output(data->display, i, &ret); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_layer_count(output, &layer_count); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - - for (j = 0; j < layer_count; j++) { - tdm_layer *layer; - tdm_layer_capability capabilities; - - l = calloc(1, sizeof * l); - TDM_EXIT_IF_FAIL(l != NULL); - LIST_INITHEAD(&l->prop_list); - LIST_ADDTAIL(&l->link, &o->layer_list); - l->data = data; - l->o = o; - l->idx = j; - - layer = tdm_output_get_layer(output, j, &ret); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_layer_get_capabilities(layer, &capabilities); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - - if (capabilities & TDM_LAYER_CAPABILITY_PRIMARY) - l->is_primary = 1; - } + o->fill_primary_layer = 1; } } - /* fill layer information */ + /* check if the primary layer object exists */ LIST_FOR_EACH_ENTRY(o, &data->output_list, link) { tdm_output *output; const tdm_output_mode *mode; - int minw, minh, maxw, maxh; - int layer_count, i = 1; + int j, layer_count, primary_index = 0; + tdm_test_server_layer *primary_l = NULL; output_setup(o); @@ -631,142 +656,96 @@ interpret_args(tdm_test_server *data) TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); ret = tdm_output_get_layer_count(output, &layer_count); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_get_available_size(output, &minw, &minh, &maxw, &maxh, NULL); + ret = tdm_output_get_primary_index(output, &primary_index); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - if (LIST_IS_EMPTY(&o->layer_list)) { - ret = tdm_output_get_layer_count(output, &layer_count); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - - for (i = 0; i < layer_count; i++) { - tdm_layer *layer; - tdm_layer_capability capabilities; - - layer = tdm_output_get_layer(output, i, &ret); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_layer_get_capabilities(layer, &capabilities); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + if (LIST_IS_EMPTY(&o->layer_list)) + o->fill_primary_layer = 1; + else { + LIST_FOR_EACH_ENTRY(l, &o->layer_list, link) { + if (l->idx == primary_index) { + l->is_primary = 1; + o->fill_primary_layer = 1; + primary_l = l; + break; + } + } + } - if (!(capabilities & TDM_LAYER_CAPABILITY_PRIMARY)) + if (!primary_l || data->do_all) { + for (j = 0; j < layer_count; j++) { + if (j != primary_index && !data->do_all) continue; - l = calloc(1, sizeof * l); TDM_EXIT_IF_FAIL(l != NULL); LIST_INITHEAD(&l->prop_list); LIST_ADDTAIL(&l->link, &o->layer_list); l->data = data; l->o = o; - l->idx = i; - l->is_primary = 1; - l->info.src_config.pos.w = l->info.src_config.size.h = mode->hdisplay; - l->info.src_config.pos.h = l->info.src_config.size.v = mode->vdisplay; - l->info.dst_pos = l->info.src_config.pos; - } - } else { - LIST_FOR_EACH_ENTRY(l, &o->layer_list, link) { - if (l->info.dst_pos.w == 0) { - TDM_EXIT_IF_FAIL(!l->owner_p && !l->owner_c); - if (l->is_primary) { - l->info.dst_pos.w = mode->hdisplay; - l->info.dst_pos.h = mode->vdisplay; - } else { - l->info.dst_pos.w = TDM_ALIGN(mode->hdisplay / 3, 2); - l->info.dst_pos.h = TDM_ALIGN(mode->vdisplay / 3, 2); - l->info.dst_pos.x = TDM_ALIGN(((mode->hdisplay / 3) / layer_count) * i, 2); - l->info.dst_pos.y = TDM_ALIGN(((mode->vdisplay / 3) / layer_count) * i, 2); - i++; - } - } - if (minw > 0 && minh > 0) { - TDM_EXIT_IF_FAIL(l->info.dst_pos.w >= minw); - TDM_EXIT_IF_FAIL(l->info.dst_pos.h >= minh); - } - if (maxw > 0 && maxh > 0) { - TDM_EXIT_IF_FAIL(l->info.dst_pos.w <= maxw); - TDM_EXIT_IF_FAIL(l->info.dst_pos.h <= maxh); - } - if (l->owner_p) { - l->info.src_config = l->owner_p->info.dst_config; - } else if (l->owner_c) { - l->info.src_config = l->owner_c->info.dst_config; + l->idx = j; + if (j == primary_index) { + l->is_primary = 1; + l->info.dst_pos.w = mode->hdisplay; + l->info.dst_pos.h = mode->vdisplay; + primary_l = l; } else { - if (l->info.src_config.pos.w == 0) { - l->info.src_config.pos.w = l->info.dst_pos.w; - l->info.src_config.pos.h = l->info.dst_pos.h; - } + l->info.dst_pos.w = TDM_ALIGN(mode->hdisplay / 3, 2); + l->info.dst_pos.h = TDM_ALIGN(mode->vdisplay / 3, 2); + l->info.dst_pos.x = TDM_ALIGN(((mode->hdisplay / 3) / layer_count) * j, 2); + l->info.dst_pos.y = TDM_ALIGN(((mode->vdisplay / 3) / layer_count) * j, 2); } } } + + TDM_EXIT_IF_FAIL(primary_l != NULL); + LIST_DEL(&primary_l->link); + LIST_ADD(&primary_l->link, &o->layer_list); } -} -static void -print_args(tdm_test_server *data) -{ - tdm_test_server_output *o = NULL; - tdm_test_server_layer *l = NULL; - tdm_test_server_pp *p = NULL; - tdm_test_server_capture *c = NULL; - tdm_test_server_prop *w = NULL; + /* fill the empty information of layers */ + LIST_FOR_EACH_ENTRY(o, &data->output_list, link) { + tdm_output *output; + int minw, minh, maxw, maxh; - if (data->do_query) - return; + output = tdm_display_get_output(data->display, o->idx, &ret); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + ret = tdm_output_get_available_size(output, &minw, &minh, &maxw, &maxh, NULL); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - LIST_FOR_EACH_ENTRY(o, &data->output_list, link) { - printf("output %d: %s", o->idx, o->mode); - if (o->refresh > 0) - printf(" %d\n", o->refresh); - else - printf("\n"); - if (!LIST_IS_EMPTY(&o->prop_list)) { - printf("\tprops: "); - LIST_FOR_EACH_ENTRY(w, &o->prop_list, link) { - print_prop(w); - printf(" "); - } - printf("\n"); - } + /* l->info.src_config.size will be decided when a buffer shows really */ LIST_FOR_EACH_ENTRY(l, &o->layer_list, link) { - printf("\t"); - printf("layer %d: ", l->idx); - print_config(&l->info.src_config); - printf(" ! "); - print_pos(&l->info.dst_pos); - printf(" trans(%d)\n", l->info.transform); - if (!LIST_IS_EMPTY(&l->prop_list)) { - printf("\t\tprops: "); - LIST_FOR_EACH_ENTRY(w, &l->prop_list, link) { - print_prop(w); - printf(" "); + if (minw > 0 && minh > 0) { + TDM_EXIT_IF_FAIL(l->info.dst_pos.w >= minw); + TDM_EXIT_IF_FAIL(l->info.dst_pos.h >= minh); + } + if (maxw > 0 && maxh > 0) { + TDM_EXIT_IF_FAIL(l->info.dst_pos.w <= maxw); + TDM_EXIT_IF_FAIL(l->info.dst_pos.h <= maxh); + } + + if (l->owner_p) { + l->info.src_config.format = l->owner_p->info.dst_config.format; + if (l->info.src_config.pos.w == 0) { + TDM_EXIT_IF_FAIL(l->owner_p->info.dst_config.size.h > 0); + l->info.src_config.pos.w = l->owner_p->info.dst_config.size.h; + l->info.src_config.pos.h = l->owner_p->info.dst_config.size.v; + } + } else if (l->owner_c) { + l->info.src_config.format = l->owner_c->info.dst_config.format; + if (l->info.src_config.pos.w == 0) { + TDM_EXIT_IF_FAIL(l->owner_c->info.dst_config.size.h > 0); + l->info.src_config.pos.w = l->owner_c->info.dst_config.size.h; + l->info.src_config.pos.h = l->owner_c->info.dst_config.size.v; + } + } else { + if (l->info.src_config.pos.w == 0) { + TDM_EXIT_IF_FAIL(l->info.dst_pos.w > 0); + l->info.src_config.pos.w = l->info.dst_pos.w; + l->info.src_config.pos.h = l->info.dst_pos.h; } - printf("\n"); } } } - LIST_FOR_EACH_ENTRY(p, &data->pp_list, link) { - printf("pp: "); - print_config(&p->info.src_config); - printf(" ! "); - print_config(&p->info.dst_config); - printf(" fps(%d) trans(%d)\n", p->fps, p->info.transform); - if (p->l) - printf("\toutput_idx(%d) layer_idx(%d)\n", p->l->o->idx, p->l->idx); - } - LIST_FOR_EACH_ENTRY(c, &data->capture_list, link) { - printf("capture: o(%d) l(%d) ", c->output_idx, c->layer_idx); - print_config(&c->info.dst_config); - printf(" trans(%d)\n", c->info.transform); - if (c->l) - printf("\toutput_idx(%d) layer_idx(%d)\n", c->l->o->idx, c->l->idx); - } - if (data->bflags != 0) { - printf("buffer: "); - char temp[256]; - char *p = temp; - int len = sizeof temp; - tdm_buf_flag_str(data->bflags, &p, &len); - printf(" (%s)\n", temp); - } } static tdm_test_server tts_data; @@ -866,7 +845,6 @@ main(int argc, char *argv[]) parse_args(data, argc, argv); interpret_args(data); - print_args(data); if (data->do_query) { tdm_helper_get_display_information(data->display, temp, &len); @@ -926,6 +904,8 @@ output_setup(tdm_test_server_output *o) ret = tdm_output_set_mode(o->output, found); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + printf("output %d: %s %d\n", o->idx, found->name, found->vrefresh); + ret = tdm_output_get_available_properties(o->output, &props, &count); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); @@ -935,6 +915,7 @@ output_setup(tdm_test_server_output *o) continue; ret = tdm_output_set_property(o->output, props[i].id, w->value); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + printf("\tprop '%s': %d\n", props[i].name, w->value.u32); break; } } @@ -952,21 +933,19 @@ layer_get_buffer(tdm_test_server_layer *l) for (i = 0; i < size; i++) { int width = (l->info.src_config.size.h)?:l->info.src_config.pos.w; int height = (l->info.src_config.size.v)?:l->info.src_config.pos.h; - unsigned int format = (l->info.src_config.format)?:TBM_FORMAT_ARGB8888; + unsigned int format = (l->info.src_config.format)?:DEFAULT_FORMAT; int flags = l->o->data->bflags; tdm_test_server_buffer *b = calloc(1, sizeof *b); TDM_EXIT_IF_FAIL(b != NULL); b->buffer = tbm_surface_internal_create_with_flags(width, height, format, flags); TDM_EXIT_IF_FAIL(b->buffer != NULL); + tdm_helper_clear_buffer(b->buffer); l->bufs[i] = b; } } - for (i = 0; i < size; i++) { - if (!l->bufs[i]->in_use) { - tdm_test_buffer_fill(l->bufs[i]->buffer, l->data->b_fill); + for (i = 0; i < size; i++) + if (!l->bufs[i]->in_use) return l->bufs[i]; - } - } printf("no available layer buffer.\n"); exit(0); } @@ -979,8 +958,13 @@ layer_cb_commit(tdm_output *output, unsigned int sequence, tdm_test_server_layer *l = user_data; tdm_test_server_buffer *b = layer_get_buffer(l); + if (!l->is_primary || l->o->fill_primary_layer) + tdm_test_buffer_fill(b->buffer, l->data->b_fill); + TDM_EXIT_IF_FAIL(b != NULL); - layer_show_buffer(l, b); + + if (!l->is_primary || l->o->fill_primary_layer) + layer_show_buffer(l, b); } static void @@ -1040,6 +1024,12 @@ layer_setup(tdm_test_server_layer *l, tdm_test_server_buffer *b) ret = tdm_layer_set_info(l->layer, &l->info); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + printf("layer %d: output(%d) ", l->idx, l->o->idx); + print_config(&l->info.src_config); + printf(" ! "); + print_pos(&l->info.dst_pos); + printf(" transform(%s)\n", tdm_transform_str(l->info.transform)); + ret = tdm_layer_get_available_properties(l->layer, &props, &count); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); @@ -1049,6 +1039,7 @@ layer_setup(tdm_test_server_layer *l, tdm_test_server_buffer *b) continue; ret = tdm_layer_set_property(l->layer, props[i].id, w->value); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + printf("\tprop '%s': %d\n", props[i].name, w->value.u32); break; } } @@ -1062,12 +1053,12 @@ pp_get_buffer(tdm_test_server_pp *p) for (i = 0; i < size; i++) { int width = (p->info.src_config.size.h)?:p->info.src_config.pos.w; int height = (p->info.src_config.size.v)?:p->info.src_config.pos.h; - unsigned int format = (p->info.src_config.format)?:TBM_FORMAT_ARGB8888; - int flags = p->l->o->data->bflags; + unsigned int format = (p->info.src_config.format)?:DEFAULT_FORMAT; tdm_test_server_buffer *b = calloc(1, sizeof *b); TDM_EXIT_IF_FAIL(b != NULL); - b->buffer = tbm_surface_internal_create_with_flags(width, height, format, flags); + b->buffer = tbm_surface_create(width, height, format); TDM_EXIT_IF_FAIL(b->buffer != NULL); + tdm_helper_clear_buffer(b->buffer); p->bufs[i] = b; } } @@ -1186,6 +1177,14 @@ pp_setup(tdm_test_server_pp *p, tdm_test_server_buffer *sb, tdm_test_server_buff ret = tdm_pp_set_info(p->pp, &p->info); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + printf("pp: "); + print_config(&p->info.src_config); + 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); + layer_setup(p->l, db); /* tdm_event_loop_xxx() function is not for the display server. It's for TDM @@ -1280,6 +1279,12 @@ capture_setup(tdm_test_server_capture *c, tdm_test_server_buffer *b) ret = tdm_capture_set_info(c->capture, &c->info); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + 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); + layer_setup(c->l, b); } @@ -1301,6 +1306,8 @@ run_test(tdm_test_server *data) if (!l->owner_p && !l->owner_c) { tdm_test_server_buffer *b; b = layer_get_buffer(l); + if (!l->is_primary || l->o->fill_primary_layer) + tdm_test_buffer_fill(b->buffer, data->b_fill); layer_setup(l, b); layer_show_buffer(l, b); } -- 2.7.4 From 5c5bc2f6f28ea4e8ed292516ab78953519bb6c43 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 22 Jul 2016 17:13:00 +0900 Subject: [PATCH 05/16] correct the format information log Change-Id: I4331cd771a6b05cb497cab5029e54633dee68153 --- src/tdm_helper.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 92d7545..9547582 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -693,6 +693,8 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) if (private_layer->caps.format_count > 0) { const char *sep = ""; for (i = 0; i < private_layer->caps.format_count; i++) { + if (private_layer->caps.formats[i] == 0) + continue; TDM_SNPRINTF(reply, len, "%s%c%c%c%c", sep, FOURCC_STR(private_layer->caps.formats[i])); sep = ","; } @@ -727,6 +729,8 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\n"); TDM_SNPRINTF(reply, len, "formats\t: "); for (i = 0; i < private_display->caps_pp.format_count; i++) { + if (private_display->caps_pp.formats[i] == 0) + continue; TDM_SNPRINTF(reply, len, "%s%c%c%c%c", sep, FOURCC_STR(private_display->caps_pp.formats[i])); sep = ","; } @@ -767,6 +771,8 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\n"); TDM_SNPRINTF(reply, len, "formats\t: "); for (i = 0; i < private_display->caps_capture.format_count; i++) { + if (private_display->caps_capture.formats[i] == 0) + continue; TDM_SNPRINTF(reply, len, "%s%c%c%c%c", sep, FOURCC_STR(private_display->caps_capture.formats[i])); sep = ","; } -- 2.7.4 From 66da0d9230b24c2ea6f9a98087a6642387144323 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 26 Jul 2016 08:38:26 +0900 Subject: [PATCH 06/16] remove release handler when commit failed This is the temporary solution(kismo.kim@samsung.com) to avoid the release handler is called when commit failed. It looks we need something like the pp_done handler to let the display server know if the pp operation is done successfully or not. Change-Id: I1513a99c89102431fd3b74b656d1f1243528d28a --- src/tdm_buffer.c | 19 +++++++++++++++++++ src/tdm_pp.c | 3 +++ src/tdm_private.h | 3 +++ 3 files changed, 25 insertions(+) diff --git a/src/tdm_buffer.c b/src/tdm_buffer.c index 9b4bdb8..f6a5aea 100644 --- a/src/tdm_buffer.c +++ b/src/tdm_buffer.c @@ -162,6 +162,25 @@ tdm_buffer_remove_release_handler(tbm_surface_h buffer, } } +INTERN void +tdm_buffer_remove_release_handler_internal(tbm_surface_h buffer) +{ + tdm_buffer_info *buf_info; + tdm_buffer_func_info *func_info = NULL, *next = NULL; + + TDM_RETURN_IF_FAIL(buffer != NULL); + + buf_info = tdm_buffer_get_info(buffer); + TDM_RETURN_IF_FAIL(buf_info != NULL); + + LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->release_funcs, link) { + + LIST_DEL(&func_info->link); + free(func_info); + + return; + } +} EXTERN tbm_surface_h tdm_buffer_ref_backend(tbm_surface_h buffer) diff --git a/src/tdm_pp.c b/src/tdm_pp.c index e9d5183..dab6529 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -438,6 +438,9 @@ tdm_pp_commit(tdm_pp *pp) LIST_DEL(&b->commit_link); if (ret != TDM_ERROR_NONE) { + tdm_buffer_remove_release_handler_internal(b->src); + tdm_buffer_remove_release_handler_internal(b->dst); + tdm_buffer_unref_backend(b->src); tdm_buffer_unref_backend(b->dst); LIST_DEL(&b->link); diff --git a/src/tdm_private.h b/src/tdm_private.h index f66bed3..a641440 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -386,6 +386,9 @@ tdm_buffer_list_get_first_entry(struct list_head *list); void tdm_buffer_list_dump(struct list_head *list); +void +tdm_buffer_remove_release_handler_internal(tbm_surface_h buffer); + /* event functions for private */ tdm_error tdm_event_loop_init(tdm_private_display *private_display); -- 2.7.4 From d2cf78ae768f112cea87168ce47a47907c6d2eee Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 26 Jul 2016 08:53:46 +0900 Subject: [PATCH 07/16] unlock mutex before unref a buffer The frontend user release handler can be called when tdm_buffer_unref_backend is called. We have to unlock/lock the mutex before/after calling tdm_buffer_unref_backend function. Change-Id: Idd97a9286c9d7083d5a77ec23595686a81b61d8e --- src/tdm_pp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tdm_pp.c b/src/tdm_pp.c index dab6529..a87ac19 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -441,8 +441,10 @@ tdm_pp_commit(tdm_pp *pp) tdm_buffer_remove_release_handler_internal(b->src); tdm_buffer_remove_release_handler_internal(b->dst); + _pthread_mutex_unlock(&private_display->lock); tdm_buffer_unref_backend(b->src); tdm_buffer_unref_backend(b->dst); + _pthread_mutex_lock(&private_display->lock); LIST_DEL(&b->link); } } -- 2.7.4 From e71de9d3a503d0717ccc7bba7e0a347f0b8b219e Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 26 Jul 2016 18:31:07 +0900 Subject: [PATCH 08/16] add tdm_pp_set_done_handler and tdm_capture_set_done_handler Change-Id: Id6231d28be18540fe82fd1e6f8d22795539ac4b7 --- include/tdm.h | 30 ++++++++++++++++++++++++++++-- include/tdm_backend.h | 12 ------------ include/tdm_types.h | 11 +++++++++++ src/tdm_capture.c | 26 ++++++++++++++++++++++++++ src/tdm_pp.c | 26 ++++++++++++++++++++++++++ src/tdm_private.h | 6 ++++++ 6 files changed, 97 insertions(+), 14 deletions(-) diff --git a/include/tdm.h b/include/tdm.h index 8b29a49..b62beb7 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -693,12 +693,25 @@ tdm_error tdm_pp_set_info(tdm_pp *pp, tdm_info_pp *info); /** + * @brief Set the PP done handler to a pp object + * @details + * The user PP done handler will be called after converting a source buffer's image + * to a destination buffer. + * @param[in] pp A pp object + * @param[in] func A user PP done handler + * @param[in] user_data The user data + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_pp_set_done_handler(tdm_pp *pp, tdm_pp_done_handler func, void *user_data); + +/** * @brief Attach a source buffer and a destination buffer to a pp object * @param[in] pp A pp object * @param[in] src A source buffer * @param[in] dst A destination buffer * @return #TDM_ERROR_NONE if success. Otherwise, error value. - * @see tdm_pp_commit, tdm_buffer_add_release_handler, tdm_buffer_release_handler + * @see tdm_pp_commit, tdm_pp_set_done_handler */ tdm_error tdm_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst); @@ -730,11 +743,24 @@ tdm_error tdm_capture_set_info(tdm_capture *capture, tdm_info_capture *info); /** + * @brief Set the capture done handler to a capture object + * @details + * The user capture done handler will be called after capturing a screen into a + * buffer. + * @param[in] capture A capture object + * @param[in] func A user capture done handler + * @param[in] user_data The user data + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_capture_set_done_handler(tdm_capture *capture, tdm_capture_done_handler func, void *user_data); + +/** * @brief Attach a TDM buffer to a capture object * @param[in] capture A capture object * @param[in] buffer A TDM buffer * @return #TDM_ERROR_NONE if success. Otherwise, error value. - * @see tdm_capture_commit, tdm_buffer_add_release_handler, tdm_buffer_release_handler + * @see tdm_capture_commit, tdm_capture_set_done_handler */ tdm_error tdm_capture_attach(tdm_capture *capture, tbm_surface_h buffer); diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 77b1e9b..8076fa2 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -639,12 +639,6 @@ typedef struct _tdm_func_layer { } tdm_func_layer; /** - * @brief The done handler of a pp object - */ -typedef void (*tdm_pp_done_handler)(tdm_pp *pp, tbm_surface_h src, - tbm_surface_h dst, void *user_data); - -/** * @brief The pp functions for a backend module. */ typedef struct _tdm_func_pp { @@ -713,12 +707,6 @@ typedef struct _tdm_func_pp { } tdm_func_pp; /** - * @brief The done handler of a capture object - */ -typedef void (*tdm_capture_done_handler)(tdm_capture *capture, - tbm_surface_h buffer, void *user_data); - -/** * @brief The capture functions for a backend module. */ typedef struct _tdm_func_capture { diff --git a/include/tdm_types.h b/include/tdm_types.h index 6073646..b11b3f5 100644 --- a/include/tdm_types.h +++ b/include/tdm_types.h @@ -167,6 +167,17 @@ typedef void (*tdm_output_vblank_handler)(tdm_output *output, unsigned int seque typedef void (*tdm_output_commit_handler)(tdm_output *output, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data); +/** + * @brief The done handler of a pp object + */ +typedef void (*tdm_pp_done_handler)(tdm_pp *pp, tbm_surface_h src, + tbm_surface_h dst, void *user_data); + +/** + * @brief The done handler of a capture object + */ +typedef void (*tdm_capture_done_handler)(tdm_capture *capture, + tbm_surface_h buffer, void *user_data); #ifdef __cplusplus } diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 2737805..2069487 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -123,6 +123,8 @@ tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, LIST_DEL(&buf_info->link); _pthread_mutex_unlock(&private_display->lock); + if (private_capture->done_func) + private_capture->done_func(private_capture, buffer, private_capture->done_user_data); tdm_buffer_unref_backend(buffer); _pthread_mutex_lock(&private_display->lock); } @@ -360,6 +362,30 @@ tdm_capture_set_info(tdm_capture *capture, tdm_info_capture *info) } EXTERN tdm_error +tdm_capture_set_done_handler(tdm_capture *capture, tdm_capture_done_handler func, void *user_data) +{ + tdm_private_display *private_display; + tdm_private_capture *private_capture; + tdm_error ret = TDM_ERROR_NONE; + + TDM_RETURN_VAL_IF_FAIL(capture != NULL, TDM_ERROR_INVALID_PARAMETER); + + private_capture = (tdm_private_capture*)capture; + private_display = private_capture->private_display; + + TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + private_capture->done_func = func; + private_capture->done_user_data = user_data; + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + +EXTERN tdm_error tdm_capture_attach(tdm_capture *capture, tbm_surface_h buffer) { CAPTURE_FUNC_ENTRY(); diff --git a/src/tdm_pp.c b/src/tdm_pp.c index a87ac19..a1ba203 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -152,6 +152,8 @@ tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, LIST_DEL(&pp_buffer->link); _pthread_mutex_unlock(&private_display->lock); + if (private_pp->done_func) + private_pp->done_func(private_pp, src, dst, private_pp->done_user_data); tdm_buffer_unref_backend(src); tdm_buffer_unref_backend(dst); _pthread_mutex_lock(&private_display->lock); @@ -337,6 +339,30 @@ tdm_pp_set_info(tdm_pp *pp, tdm_info_pp *info) } EXTERN tdm_error +tdm_pp_set_done_handler(tdm_pp *pp, tdm_pp_done_handler func, void *user_data) +{ + tdm_private_display *private_display; + tdm_private_pp *private_pp; + tdm_error ret = TDM_ERROR_NONE; + + TDM_RETURN_VAL_IF_FAIL(pp != NULL, TDM_ERROR_INVALID_PARAMETER); + + private_pp = (tdm_private_pp*)pp; + private_display = private_pp->private_display; + + TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + private_pp->done_func = func; + private_pp->done_user_data = user_data; + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + +EXTERN tdm_error tdm_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst) { tdm_pp_private_buffer *pp_buffer; diff --git a/src/tdm_private.h b/src/tdm_private.h index a641440..a15ffc5 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -225,6 +225,9 @@ struct _tdm_private_pp { tdm_info_pp info; pid_t owner_tid; + + tdm_pp_done_handler done_func; + void *done_user_data; }; struct _tdm_private_capture { @@ -246,6 +249,9 @@ struct _tdm_private_capture { tdm_info_capture info; pid_t owner_tid; + + tdm_capture_done_handler done_func; + void *done_user_data; }; /* CAUTION: -- 2.7.4 From f39e97f6a038a4384151c6663c3b31b9b998be22 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 26 Jul 2016 20:01:00 +0900 Subject: [PATCH 09/16] Use the user done handler instead of the buffer release handler Change-Id: Id44228ee21e648fddc0249f32c80f8178ac4ac94 --- tools/tdm_test_server.c | 216 +++++++++++++++++++++++++++++------------------- 1 file changed, 129 insertions(+), 87 deletions(-) diff --git a/tools/tdm_test_server.c b/tools/tdm_test_server.c index 3870448..0045be5 100644 --- a/tools/tdm_test_server.c +++ b/tools/tdm_test_server.c @@ -230,7 +230,7 @@ typedef struct _tdm_test_server_prop { typedef struct _tdm_test_server_buffer { /* variables for test */ - tbm_surface_h buffer; + tbm_surface_h b; int in_use; tdm_test_server_layer *l; @@ -264,7 +264,7 @@ typedef struct _tdm_test_server_pp { tdm_test_server *data; tdm_test_server_layer *l; tdm_pp *pp; - tdm_test_server_buffer *bufs[6]; + tbm_surface_h bufs[6]; int buf_idx; tdm_event_loop_source *timer_source; @@ -297,7 +297,7 @@ struct _tdm_test_server_layer { int is_primary; tdm_test_server_pp *owner_p; tdm_test_server_capture *owner_c; - tdm_test_server_buffer *bufs[3]; + tbm_surface_h bufs[3]; int buf_idx; }; @@ -318,8 +318,8 @@ struct _tdm_test_server { static void run_test(tdm_test_server *data); static void output_setup(tdm_test_server_output *o); -static void layer_show_buffer(tdm_test_server_layer *l, tdm_test_server_buffer *b); -static void capture_attach(tdm_test_server_capture *c, tdm_test_server_buffer *b); +static void layer_show_buffer(tdm_test_server_layer *l, tbm_surface_h b); +static void capture_attach(tdm_test_server_capture *c, tbm_surface_h b); static char* parse_size(tdm_size *size, char *arg) @@ -749,6 +749,29 @@ interpret_args(tdm_test_server *data) } static tdm_test_server tts_data; +static int tts_buffer_key; +#define TTS_BUFFER_KEY ((unsigned long)&tts_buffer_key) + +static tbm_surface_h +buffer_allocate(int width, int height, int format, int flags) +{ + tdm_test_server_buffer *tb = calloc(1, sizeof *tb); + TDM_EXIT_IF_FAIL(tb != NULL); + tb->b = tbm_surface_internal_create_with_flags(width, height, format, flags); + TDM_EXIT_IF_FAIL(tb->b != NULL); + tdm_helper_clear_buffer(tb->b); + tbm_surface_internal_add_user_data(tb->b, TTS_BUFFER_KEY, free); + tbm_surface_internal_set_user_data(tb->b, TTS_BUFFER_KEY, tb); + return tb->b; +} + +static tdm_test_server_buffer* +get_tts_buffer(tbm_surface_h b) +{ + tdm_test_server_buffer *tb = NULL; + tbm_surface_internal_get_user_data(b, TTS_BUFFER_KEY, (void **)&tb); + return tb; +} static void exit_test(int sig) @@ -775,10 +798,8 @@ exit_test(int sig) LIST_DEL(&w->link); free(w); } - for (i = 0; i < TDM_ARRAY_SIZE(l->bufs); i++) { - tbm_surface_destroy(l->bufs[i]->buffer); - free(l->bufs[i]); - } + for (i = 0; i < TDM_ARRAY_SIZE(l->bufs); i++) + tbm_surface_destroy(l->bufs[i]); free(l); } @@ -801,10 +822,8 @@ exit_test(int sig) tdm_display_unlock(data->display); tdm_pp_destroy(p->pp); - for (i = 0; i < TDM_ARRAY_SIZE(p->bufs); i++) { - tbm_surface_destroy(p->bufs[i]->buffer); - free(p->bufs[i]); - } + for (i = 0; i < TDM_ARRAY_SIZE(p->bufs); i++) + tbm_surface_destroy(p->bufs[i]); free(p); } @@ -925,7 +944,7 @@ output_setup(tdm_test_server_output *o) TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); } -static tdm_test_server_buffer* +static tbm_surface_h layer_get_buffer(tdm_test_server_layer *l) { int i, size = TDM_ARRAY_SIZE(l->bufs); @@ -935,17 +954,17 @@ layer_get_buffer(tdm_test_server_layer *l) int height = (l->info.src_config.size.v)?:l->info.src_config.pos.h; unsigned int format = (l->info.src_config.format)?:DEFAULT_FORMAT; int flags = l->o->data->bflags; - tdm_test_server_buffer *b = calloc(1, sizeof *b); + tbm_surface_h b = buffer_allocate(width, height, format, flags); TDM_EXIT_IF_FAIL(b != NULL); - b->buffer = tbm_surface_internal_create_with_flags(width, height, format, flags); - TDM_EXIT_IF_FAIL(b->buffer != NULL); - tdm_helper_clear_buffer(b->buffer); l->bufs[i] = b; } } - for (i = 0; i < size; i++) - if (!l->bufs[i]->in_use) + for (i = 0; i < size; i++) { + tdm_test_server_buffer *tb = get_tts_buffer(l->bufs[i]); + TDM_EXIT_IF_FAIL(tb != NULL); + if (!tb->in_use) return l->bufs[i]; + } printf("no available layer buffer.\n"); exit(0); } @@ -956,38 +975,41 @@ layer_cb_commit(tdm_output *output, unsigned int sequence, void *user_data) { tdm_test_server_layer *l = user_data; - tdm_test_server_buffer *b = layer_get_buffer(l); + tbm_surface_h b = layer_get_buffer(l); + TDM_EXIT_IF_FAIL(b != NULL); if (!l->is_primary || l->o->fill_primary_layer) - tdm_test_buffer_fill(b->buffer, l->data->b_fill); - - TDM_EXIT_IF_FAIL(b != NULL); + tdm_test_buffer_fill(b, l->data->b_fill); if (!l->is_primary || l->o->fill_primary_layer) layer_show_buffer(l, b); } static void -layer_cb_buffer_release(tbm_surface_h buffer, void *user_data) +layer_cb_buffer_release(tbm_surface_h b, void *user_data) { - tdm_test_server_buffer *b = user_data; - b->in_use = 0; - tdm_buffer_remove_release_handler(b->buffer, layer_cb_buffer_release, b); - if (b->done) - b->done(buffer, user_data); + tdm_test_server_buffer *tb = get_tts_buffer(b); + tb->in_use = 0; + tdm_buffer_remove_release_handler(b, layer_cb_buffer_release, NULL); + if (tb->done) + tb->done(b, user_data); } static void -layer_show_buffer(tdm_test_server_layer *l, tdm_test_server_buffer *b) +layer_show_buffer(tdm_test_server_layer *l, tbm_surface_h b) { tdm_test_server *data = l->o->data; + tdm_test_server_buffer *tb; tdm_error ret; - ret = tdm_layer_set_buffer(l->layer, b->buffer); + ret = tdm_layer_set_buffer(l->layer, b); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - b->in_use = 1; - tdm_buffer_add_release_handler(b->buffer, layer_cb_buffer_release, b); + tb = get_tts_buffer(b); + TDM_EXIT_IF_FAIL(tb != NULL); + + tb->in_use = 1; + tdm_buffer_add_release_handler(b, layer_cb_buffer_release, NULL); if (data->do_vblank) ret = tdm_output_commit(l->o->output, 0, layer_cb_commit, l); @@ -999,7 +1021,7 @@ layer_show_buffer(tdm_test_server_layer *l, tdm_test_server_buffer *b) } static void -layer_setup(tdm_test_server_layer *l, tdm_test_server_buffer *b) +layer_setup(tdm_test_server_layer *l, tbm_surface_h b) { tdm_test_server_prop *w = NULL; const tdm_prop *props; @@ -1011,7 +1033,7 @@ layer_setup(tdm_test_server_layer *l, tdm_test_server_buffer *b) TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); /* The size and format information should be same with buffer's */ - tbm_surface_get_info(b->buffer, &info); + tbm_surface_get_info(b, &info); if (IS_RGB(info.format)) { l->info.src_config.size.h = info.planes[0].stride >> 2; l->info.src_config.size.v = info.height; @@ -1045,7 +1067,7 @@ layer_setup(tdm_test_server_layer *l, tdm_test_server_buffer *b) } } -static tdm_test_server_buffer* +static tbm_surface_h pp_get_buffer(tdm_test_server_pp *p) { int i, size = TDM_ARRAY_SIZE(p->bufs); @@ -1054,17 +1076,15 @@ pp_get_buffer(tdm_test_server_pp *p) int width = (p->info.src_config.size.h)?:p->info.src_config.pos.w; int height = (p->info.src_config.size.v)?:p->info.src_config.pos.h; unsigned int format = (p->info.src_config.format)?:DEFAULT_FORMAT; - tdm_test_server_buffer *b = calloc(1, sizeof *b); + tbm_surface_h b = buffer_allocate(width, height, format, 0); TDM_EXIT_IF_FAIL(b != NULL); - b->buffer = tbm_surface_create(width, height, format); - TDM_EXIT_IF_FAIL(b->buffer != NULL); - tdm_helper_clear_buffer(b->buffer); p->bufs[i] = b; } } for (i = 0; i < size; i++) { - if (!p->bufs[i]->in_use) { - tdm_test_buffer_fill(p->bufs[i]->buffer, p->data->b_fill); + tdm_test_server_buffer *tb = get_tts_buffer(p->bufs[i]); + if (!tb->in_use) { + tdm_test_buffer_fill(p->bufs[i], p->data->b_fill); return p->bufs[i]; } } @@ -1073,34 +1093,38 @@ pp_get_buffer(tdm_test_server_pp *p) } static void -pp_cb_sb_release(tbm_surface_h buffer, void *user_data) +pp_cb_done(tdm_pp *pp, tbm_surface_h sb, tbm_surface_h db, void *user_data) { - tdm_test_server_buffer *b = user_data; - b->in_use = 0; - tdm_buffer_remove_release_handler(b->buffer, pp_cb_sb_release, b); -} + tdm_test_server_buffer *stb, *dtb; -static void -pp_cb_db_release(tbm_surface_h buffer, void *user_data) -{ - tdm_test_server_buffer *b = user_data; - b->in_use = 0; - tdm_buffer_remove_release_handler(b->buffer, pp_cb_db_release, b); - layer_show_buffer(b->l, b); + stb = get_tts_buffer(sb); + TDM_EXIT_IF_FAIL(stb != NULL); + + dtb = get_tts_buffer(db); + TDM_EXIT_IF_FAIL(dtb != NULL); + + stb->in_use = dtb->in_use = 0; + + layer_show_buffer(dtb->l, db); } static void -pp_convert_buffer(tdm_test_server_pp *p, tdm_test_server_buffer *sb, tdm_test_server_buffer *db) +pp_convert_buffer(tdm_test_server_pp *p, tbm_surface_h sb, tbm_surface_h db) { + tdm_test_server_buffer *stb, *dtb; tdm_error ret; - ret = tdm_pp_attach(p->pp, sb->buffer, db->buffer); - TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + stb = get_tts_buffer(sb); + TDM_EXIT_IF_FAIL(stb != NULL); - sb->in_use = db->in_use = 1; - db->l = p->l; - tdm_buffer_add_release_handler(sb->buffer, pp_cb_sb_release, sb); - tdm_buffer_add_release_handler(db->buffer, pp_cb_db_release, db); + dtb = get_tts_buffer(db); + TDM_EXIT_IF_FAIL(dtb != NULL); + + stb->in_use = dtb->in_use = 1; + dtb->l = p->l; + + ret = tdm_pp_attach(p->pp, sb, db); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); ret = tdm_pp_commit(p->pp); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); @@ -1120,7 +1144,7 @@ pp_cb_timeout(void *user_data) { tdm_test_server_pp *p = user_data; tdm_test_server *data = p->l->o->data; - tdm_test_server_buffer *sb, *db; + tbm_surface_h sb, db; tdm_error ret; tdm_display_unlock(data->display); @@ -1143,7 +1167,7 @@ pp_cb_timeout(void *user_data) } static void -pp_setup(tdm_test_server_pp *p, tdm_test_server_buffer *sb, tdm_test_server_buffer *db) +pp_setup(tdm_test_server_pp *p, tbm_surface_h sb, tbm_surface_h db) { tdm_test_server *data = p->l->o->data; tbm_surface_info_s info; @@ -1153,7 +1177,7 @@ pp_setup(tdm_test_server_pp *p, tdm_test_server_buffer *sb, tdm_test_server_buff TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); /* The size and format information should be same with buffer's */ - tbm_surface_get_info(sb->buffer, &info); + tbm_surface_get_info(sb, &info); if (IS_RGB(info.format)) { p->info.src_config.size.h = info.planes[0].stride >> 2; p->info.src_config.size.v = info.height; @@ -1164,7 +1188,7 @@ pp_setup(tdm_test_server_pp *p, tdm_test_server_buffer *sb, tdm_test_server_buff p->info.src_config.format = info.format; /* The size and format information should be same with buffer's */ - tbm_surface_get_info(db->buffer, &info); + tbm_surface_get_info(db, &info); if (IS_RGB(info.format)) { p->info.dst_config.size.h = info.planes[0].stride >> 2; p->info.dst_config.size.v = info.height; @@ -1177,6 +1201,9 @@ pp_setup(tdm_test_server_pp *p, tdm_test_server_buffer *sb, tdm_test_server_buff ret = tdm_pp_set_info(p->pp, &p->info); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + ret = tdm_pp_set_done_handler(p->pp, pp_cb_done, NULL); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + printf("pp: "); print_config(&p->info.src_config); printf(" ! "); @@ -1206,34 +1233,46 @@ pp_setup(tdm_test_server_pp *p, tdm_test_server_buffer *sb, tdm_test_server_buff } static void -capture_cb_buffer_done(tbm_surface_h buffer, void *user_data) +capture_cb_buffer_done(tbm_surface_h b, void *user_data) { - tdm_test_server_buffer *b = user_data; - capture_attach(b->c, b); + tdm_test_server_buffer *tb; + + tb = get_tts_buffer(b); + TDM_EXIT_IF_FAIL(tb != NULL); + + capture_attach(tb->c, b); } static void -capture_cb_buffer_release(tbm_surface_h buffer, void *user_data) +capture_cb_done(tdm_capture *capture, tbm_surface_h b, void *user_data) { - tdm_test_server_buffer *b = user_data; - b->in_use = 0; - tdm_buffer_remove_release_handler(b->buffer, capture_cb_buffer_release, b); - b->done = capture_cb_buffer_done; - layer_show_buffer(b->l, b); + tdm_test_server_buffer *tb; + + tb = get_tts_buffer(b); + TDM_EXIT_IF_FAIL(tb != NULL); + + tb->in_use = 0; + + tb->done = capture_cb_buffer_done; + layer_show_buffer(tb->l, b); } static void -capture_attach(tdm_test_server_capture *c, tdm_test_server_buffer *b) +capture_attach(tdm_test_server_capture *c, tbm_surface_h b) { tdm_error ret; + tdm_test_server_buffer *tb; - ret = tdm_capture_attach(c->capture, b->buffer); + tb = get_tts_buffer(b); + TDM_EXIT_IF_FAIL(tb != NULL); + + tb->in_use = 1; + tb->l = c->l; + tb->c = c; + + ret = tdm_capture_attach(c->capture, b); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); - b->in_use = 1; - b->l = c->l; - b->c = c; - tdm_buffer_add_release_handler(b->buffer, capture_cb_buffer_release, b); printf("capture:\tc(%p) b(%p)\n", c, b); ret = tdm_capture_commit(c->capture); @@ -1241,7 +1280,7 @@ capture_attach(tdm_test_server_capture *c, tdm_test_server_buffer *b) } static void -capture_setup(tdm_test_server_capture *c, tdm_test_server_buffer *b) +capture_setup(tdm_test_server_capture *c, tbm_surface_h b) { tdm_test_server *data = c->l->o->data; tdm_output *output; @@ -1266,7 +1305,7 @@ capture_setup(tdm_test_server_capture *c, tdm_test_server_buffer *b) TDM_EXIT_IF_FAIL(c->capture != NULL); /* The size and format information should be same with buffer's */ - tbm_surface_get_info(b->buffer, &info); + tbm_surface_get_info(b, &info); if (IS_RGB(info.format)) { c->info.dst_config.size.h = info.planes[0].stride >> 2; c->info.dst_config.size.v = info.height; @@ -1279,6 +1318,9 @@ capture_setup(tdm_test_server_capture *c, tdm_test_server_buffer *b) ret = tdm_capture_set_info(c->capture, &c->info); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + ret = tdm_capture_set_done_handler(c->capture, capture_cb_done, NULL); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + 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)); @@ -1304,10 +1346,10 @@ run_test(tdm_test_server *data) LIST_FOR_EACH_ENTRY(o, &data->output_list, link) { LIST_FOR_EACH_ENTRY(l, &o->layer_list, link) { if (!l->owner_p && !l->owner_c) { - tdm_test_server_buffer *b; + tbm_surface_h b; b = layer_get_buffer(l); if (!l->is_primary || l->o->fill_primary_layer) - tdm_test_buffer_fill(b->buffer, data->b_fill); + tdm_test_buffer_fill(b, data->b_fill); layer_setup(l, b); layer_show_buffer(l, b); } @@ -1315,7 +1357,7 @@ run_test(tdm_test_server *data) } LIST_FOR_EACH_ENTRY(p, &data->pp_list, link) { - tdm_test_server_buffer *sb, *db; + tbm_surface_h sb, db; TDM_GOTO_IF_FAIL(caps & TDM_DISPLAY_CAPABILITY_PP, no_pp); sb = pp_get_buffer(p); TDM_EXIT_IF_FAIL(sb != NULL); @@ -1327,7 +1369,7 @@ run_test(tdm_test_server *data) LIST_FOR_EACH_ENTRY(c, &data->capture_list, link) { TDM_GOTO_IF_FAIL(caps & TDM_DISPLAY_CAPABILITY_CAPTURE, no_capture); - tdm_test_server_buffer *b; + tbm_surface_h b; b = layer_get_buffer(c->l); capture_setup(c, b); capture_attach(c, b); -- 2.7.4 From 659d42e03dc6b53ba8df9baad6dceb533abdcce5 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 26 Jul 2016 21:41:14 +0900 Subject: [PATCH 10/16] rename tdm-dbg to tdm-monitor Change-Id: I72ab616f6b0c6365708160633eedd9ab74085d98 --- client/Makefile.am | 16 ++++---- client/{tdm_dbg.c => tdm_monitor.c} | 34 ++++++++-------- packaging/libtdm.spec | 2 +- src/Makefile.am | 2 +- src/{tdm_dbg_server.c => tdm_monitor_server.c} | 54 +++++++++++++------------- src/tdm_private.h | 2 +- src/tdm_server.c | 2 +- 7 files changed, 56 insertions(+), 56 deletions(-) rename client/{tdm_dbg.c => tdm_monitor.c} (81%) rename src/{tdm_dbg_server.c => tdm_monitor_server.c} (81%) diff --git a/client/Makefile.am b/client/Makefile.am index 739c2f1..becccc6 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -27,18 +27,18 @@ libtdm_client_la_SOURCES = \ tdm_client.c ########################################################################## -### tdm-dbg +### tdm-monitor ########################################################################## bin_PROGRAMS = \ - tdm-dbg + tdm-monitor -#tdm-dbg -tdm_dbg_SOURCES = \ +#tdm-monitor +tdm_monitor_SOURCES = \ $(top_srcdir)/protocol/tdm-protocol.c \ - tdm_dbg.c -tdm_dbg_LDFLAGS = ${LDFLAGS} -tdm_dbg_LDADD = $(TDM_CLIENT_LIBS) ../common/libtdm-common.la -tdm_dbg_CFLAGS = \ + tdm_monitor.c +tdm_monitor_LDFLAGS = ${LDFLAGS} +tdm_monitor_LDADD = $(TDM_CLIENT_LIBS) ../common/libtdm-common.la +tdm_monitor_CFLAGS = \ $(TDM_CFLAGS) \ -I$(top_srcdir)/include \ -I$(top_srcdir)/protocol \ diff --git a/client/tdm_dbg.c b/client/tdm_monitor.c similarity index 81% rename from client/tdm_dbg.c rename to client/tdm_monitor.c index a6fc0a7..fe69cce 100644 --- a/client/tdm_dbg.c +++ b/client/tdm_monitor.c @@ -50,56 +50,56 @@ } \ } -typedef struct _tdm_dbg_info { +typedef struct _tdm_monitor_info { struct wl_display *display; struct wl_registry *registry; struct wl_tdm *tdm; -} tdm_dbg_info; +} tdm_monitor_info; -static tdm_dbg_info td_info; +static tdm_monitor_info td_info; static int done; static void -_tdm_dbg_cb_debug_done(void *data, struct wl_tdm *wl_tdm, const char *message) +_tdm_monitor_cb_debug_done(void *data, struct wl_tdm *wl_tdm, const char *message) { printf("%s", message); done = 1; } -static const struct wl_tdm_listener tdm_dbg_listener = { - _tdm_dbg_cb_debug_done, +static const struct wl_tdm_listener tdm_monitor_listener = { + _tdm_monitor_cb_debug_done, }; static void -_tdm_dbg_cb_global(void *data, struct wl_registry *registry, - uint32_t name, const char *interface, - uint32_t version) +_tdm_monitor_cb_global(void *data, struct wl_registry *registry, + uint32_t name, const char *interface, + uint32_t version) { - tdm_dbg_info *info = data; + tdm_monitor_info *info = data; if (strncmp(interface, "wl_tdm", 6) == 0) { info->tdm = wl_registry_bind(registry, name, &wl_tdm_interface, version); exit_if_fail(info->tdm != NULL); - wl_tdm_add_listener(info->tdm, &tdm_dbg_listener, info); + wl_tdm_add_listener(info->tdm, &tdm_monitor_listener, info); wl_display_flush(info->display); } } static void -_tdm_dbg_cb_global_remove(void *data, struct wl_registry *registry, uint32_t name) +_tdm_monitor_cb_global_remove(void *data, struct wl_registry *registry, uint32_t name) { } -static const struct wl_registry_listener tdm_dbg_registry_listener = { - _tdm_dbg_cb_global, - _tdm_dbg_cb_global_remove +static const struct wl_registry_listener tdm_monitor_registry_listener = { + _tdm_monitor_cb_global, + _tdm_monitor_cb_global_remove }; int main(int argc, char ** argv) { - tdm_dbg_info *info = &td_info; + tdm_monitor_info *info = &td_info; int i, ret = 0; char cwd[1024]; char options[1024]; @@ -124,7 +124,7 @@ main(int argc, char ** argv) exit_if_fail(info->registry != NULL); wl_registry_add_listener(info->registry, - &tdm_dbg_registry_listener, info); + &tdm_monitor_registry_listener, info); wl_display_roundtrip(info->display); exit_if_fail(info->tdm != NULL); diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 536cd8e..070e174 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -93,7 +93,7 @@ rm -f %{_unitdir_user}/default.target.wants/tdm-socket-user.path %defattr(-,root,root,-) %{TZ_SYS_RO_SHARE}/license/%{name} %{_libdir}/libtdm.so.* -%attr(750,root,root) %{_bindir}/tdm-dbg +%attr(750,root,root) %{_bindir}/tdm-monitor %{_unitdir}/tdm-socket.path %{_unitdir}/tdm-socket.service %{_unitdir_user}/tdm-socket-user.path diff --git a/src/Makefile.am b/src/Makefile.am index 2af9638..2d6f458 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,5 +22,5 @@ libtdm_la_SOURCES = \ tdm_display.c \ tdm_pp.c \ tdm_capture.c \ - tdm_dbg_server.c \ + tdm_monitor_server.c \ tdm.c diff --git a/src/tdm_dbg_server.c b/src/tdm_monitor_server.c similarity index 81% rename from src/tdm_dbg_server.c rename to src/tdm_monitor_server.c index 83ea135..a3683fd 100644 --- a/src/tdm_dbg_server.c +++ b/src/tdm_monitor_server.c @@ -45,16 +45,16 @@ #define TDM_DBG_SERVER_ARGS_MAX 32 -static void _tdm_dbg_server_usage(char *app_name, char *reply, int *len); +static void _tdm_monitor_server_usage(char *app_name, char *reply, int *len); static void -_tdm_dbg_server_query(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) +_tdm_monitor_server_query(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { tdm_helper_get_display_information(dpy, reply, len); } static void -_tdm_dbg_server_dpms(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) +_tdm_monitor_server_dpms(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { tdm_output *output; int output_idx, dpms_value; @@ -63,7 +63,7 @@ _tdm_dbg_server_dpms(unsigned int pid, char *cwd, int argc, char *argv[], char * tdm_error ret; if (argc < 3) { - _tdm_dbg_server_usage(argv[0], reply, len); + _tdm_monitor_server_usage(argv[0], reply, len); return; } @@ -87,14 +87,14 @@ _tdm_dbg_server_dpms(unsigned int pid, char *cwd, int argc, char *argv[], char * } static void -_tdm_dbg_server_debug(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) +_tdm_monitor_server_debug(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { int level; char *arg; char *end; if (argc < 3) { - _tdm_dbg_server_usage(argv[0], reply, len); + _tdm_monitor_server_usage(argv[0], reply, len); return; } @@ -114,14 +114,14 @@ _tdm_dbg_server_debug(unsigned int pid, char *cwd, int argc, char *argv[], char } static void -_tdm_dbg_server_log_path(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) +_tdm_monitor_server_log_path(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { static int old_stdout = -1; char fd_name[TDM_PATH_LEN]; char *path; if (argc < 3) { - _tdm_dbg_server_usage(argv[0], reply, len); + _tdm_monitor_server_usage(argv[0], reply, len); return; } @@ -160,7 +160,7 @@ done: } static void -_tdm_dbg_server_prop(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) +_tdm_monitor_server_prop(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { tdm_output *output; tdm_output *layer = NULL; @@ -175,7 +175,7 @@ _tdm_dbg_server_prop(unsigned int pid, char *cwd, int argc, char *argv[], char * const tdm_prop *props; if (argc < 3) { - _tdm_dbg_server_usage(argv[0], reply, len); + _tdm_monitor_server_usage(argv[0], reply, len); return; } @@ -245,10 +245,10 @@ _tdm_dbg_server_prop(unsigned int pid, char *cwd, int argc, char *argv[], char * } static void -_tdm_dbg_server_dump(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) +_tdm_monitor_server_dump(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { if (argc < 3) { - _tdm_dbg_server_usage(argv[0], reply, len); + _tdm_monitor_server_usage(argv[0], reply, len); return; } @@ -265,33 +265,33 @@ static struct { const char *ex; } option_proc[] = { { - "info", _tdm_dbg_server_query, + "info", _tdm_monitor_server_query, "show tdm output, layer information", NULL, NULL }, { - "dpms", _tdm_dbg_server_dpms, + "dpms", _tdm_monitor_server_dpms, "set output dpms", ":", "0:3 or 0:0" }, { - "debug", _tdm_dbg_server_debug, + "debug", _tdm_monitor_server_debug, "set the debug level and modules(none,mutex,buffer,thread,vblank)", "[@[,]]", NULL }, { - "log_path", _tdm_dbg_server_log_path, + "log_path", _tdm_monitor_server_log_path, "set the log path (console,dlog,filepath)", "", "console" }, { - "prop", _tdm_dbg_server_prop, + "prop", _tdm_monitor_server_prop, "set the property of a output or a layer", "[,]:,", NULL }, { - "dump", _tdm_dbg_server_dump, + "dump", _tdm_monitor_server_dump, "dump buffers (type: layer, pp, capture, none)", "[,[,...]]", NULL @@ -299,7 +299,7 @@ static struct { }; static void -_tdm_dbg_server_usage(char *app_name, char *reply, int *len) +_tdm_monitor_server_usage(char *app_name, char *reply, int *len) { int opt_size = sizeof(option_proc) / sizeof(option_proc[0]); int i; @@ -317,13 +317,13 @@ _tdm_dbg_server_usage(char *app_name, char *reply, int *len) } static void -_tdm_dbg_server_command(unsigned int pid, char *cwd, tdm_display *dpy, int argc, char *argv[], char *reply, int *len) +_tdm_monitor_server_command(unsigned int pid, char *cwd, tdm_display *dpy, int argc, char *argv[], char *reply, int *len) { int opt_size = sizeof(option_proc) / sizeof(option_proc[0]); int i; if (argc < 2) { - _tdm_dbg_server_usage(argv[0], reply, len); + _tdm_monitor_server_usage(argv[0], reply, len); return; } @@ -339,13 +339,13 @@ _tdm_dbg_server_command(unsigned int pid, char *cwd, tdm_display *dpy, int argc, } } - _tdm_dbg_server_usage(argv[0], reply, len); + _tdm_monitor_server_usage(argv[0], reply, len); return; } INTERN void -tdm_dbg_server_command(tdm_display *dpy, const char *options, char *reply, int *len) +tdm_monitor_server_command(tdm_display *dpy, const char *options, char *reply, int *len) { unsigned int pid; char cwd[1024]; @@ -359,14 +359,14 @@ tdm_dbg_server_command(tdm_display *dpy, const char *options, char *reply, int * arg = strtok_r(temp, " ", &end); if (!arg) { - TDM_SNPRINTF(reply, len, "no pid for tdm-dbg"); + TDM_SNPRINTF(reply, len, "no pid for tdm-monitor"); return; } pid = strtol(arg, &e, 10); arg = strtok_r(NULL, " ", &end); if (!arg) { - TDM_SNPRINTF(reply, len, "no cwd for tdm-dbg"); + TDM_SNPRINTF(reply, len, "no cwd for tdm-monitor"); return; } snprintf(cwd, sizeof(cwd), "%s", arg); @@ -377,11 +377,11 @@ tdm_dbg_server_command(tdm_display *dpy, const char *options, char *reply, int * while (argv[argc]) { argc++; if (argc == TDM_DBG_SERVER_ARGS_MAX) { - TDM_SNPRINTF(reply, len, "too many arguments for tdm-dbg"); + TDM_SNPRINTF(reply, len, "too many arguments for tdm-monitor"); break; } argv[argc] = strtok_r(NULL, " ", &end); } - _tdm_dbg_server_command(pid, cwd, dpy, argc, argv, reply, len); + _tdm_monitor_server_command(pid, cwd, dpy, argc, argv, reply, len); } diff --git a/src/tdm_private.h b/src/tdm_private.h index a15ffc5..21649b6 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -579,7 +579,7 @@ tdm_error tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, unsigned int interval, tdm_vblank_handler func, void *user_data); void -tdm_dbg_server_command(tdm_display *dpy, const char *options, char *reply, int *len); +tdm_monitor_server_command(tdm_display *dpy, const char *options, char *reply, int *len); #ifdef __cplusplus } diff --git a/src/tdm_server.c b/src/tdm_server.c index ab6467e..ef45abe 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -424,7 +424,7 @@ _tdm_server_cb_debug(struct wl_client *client, struct wl_resource *resource, con char message[TDM_SERVER_REPLY_MSG_LEN]; int size = sizeof(message); - tdm_dbg_server_command(private_loop->dpy, options, message, &size); + tdm_monitor_server_command(private_loop->dpy, options, message, &size); wl_tdm_send_debug_done(resource, message); } -- 2.7.4 From 1eaf8612e77bf19eac1110c9bd7289fe83bd416a Mon Sep 17 00:00:00 2001 From: Gwanglim Lee Date: Thu, 4 Aug 2016 10:44:51 +0900 Subject: [PATCH 11/16] Packaging: update version to 1.3.1 Change-Id: I891bcb5318ea9c3e8cfc59f7cdaba38f3aa6d41d --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 070e174..74b93e0 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,5 +1,5 @@ Name: libtdm -Version: 1.3.0 +Version: 1.3.1 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From a18be1c14ab996cf0c9aad64778b97f8af111a70 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 5 Aug 2016 18:33:08 +0900 Subject: [PATCH 12/16] impl for using dump path Change-Id: I8b0f5a5812b79330fe7c6f0a6f861f5c95dc333f --- src/tdm.c | 90 +++++++++++++++++++++++++++++++++++++----------- src/tdm_capture.c | 2 +- src/tdm_display.c | 4 +-- src/tdm_helper.c | 47 +++++++++++++++++++++++-- src/tdm_monitor_server.c | 13 +++---- src/tdm_pp.c | 4 +-- src/tdm_private.h | 9 +++-- 7 files changed, 133 insertions(+), 36 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 647230b..2f83a78 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -840,25 +840,25 @@ tdm_display_init(tdm_error *error) return g_private_display; } + private_display = calloc(1, sizeof(tdm_private_display)); + if (!private_display) { + ret = TDM_ERROR_OUT_OF_MEMORY; + TDM_ERR("'private_display != NULL' failed"); + goto failed_alloc; + } + debug = getenv("TDM_DEBUG_MODULE"); if (debug) tdm_display_enable_debug_module(debug); debug = getenv("TDM_DEBUG_DUMP"); if (debug) - tdm_display_enable_dump(debug); + tdm_display_enable_dump(private_display, debug, NULL, NULL); debug = getenv("TDM_DEBUG_PATH"); if (debug) tdm_display_enable_path(debug); - private_display = calloc(1, sizeof(tdm_private_display)); - if (!private_display) { - ret = TDM_ERROR_OUT_OF_MEMORY; - TDM_ERR("'private_display != NULL' failed"); - goto failed_alloc; - } - if (pthread_mutex_init(&private_display->lock, NULL)) { ret = TDM_ERROR_OPERATION_FAILED; TDM_ERR("mutex init failed: %m"); @@ -1023,39 +1023,87 @@ tdm_display_enable_debug_module(const char*modules) } INTERN tdm_error -tdm_display_enable_dump(const char *dump_str) +tdm_display_enable_dump(tdm_private_display *private_display, const char *dump_str, char *reply, int *len) { - char temp[1024]; + char temp[TDM_PATH_LEN] = {0,}, temp2[TDM_PATH_LEN] = {0,}; + char *path, *path2; char *arg; char *end; + snprintf(temp2, TDM_PATH_LEN, "%s", dump_str); + path2 = strtostr(temp, TDM_PATH_LEN, temp2, "@"); + if (!path2 || path2[0] == '\0') + path2 = TDM_DUMP_DIR; + else + path2++; + + path = tdm_helper_dump_make_directory(path2, reply, len); + TDM_GOTO_IF_FAIL(path != NULL, done); + tdm_debug_dump = 0; snprintf(temp, sizeof(temp), "%s", dump_str); arg = strtok_r(temp, ",", &end); - while (arg) { - if (!strncmp(arg, "none", 4)) { - tdm_debug_dump = 0; - return TDM_ERROR_NONE; + + if (!strncmp(arg, "none", 4)) { + tdm_debug_dump = 0; + if (tdm_debug_dump_dir) { + free(tdm_debug_dump_dir); + tdm_debug_dump_dir = NULL; } + TDM_SNPRINTF(reply, len, "path: %s\n", path); + goto done; + } + + if (!strncmp(arg, "current", 7)) { + tdm_private_output *o = NULL; + if (!private_display) { + TDM_WRN("no private_display"); + goto done; + } + + LIST_FOR_EACH_ENTRY(o, &private_display->output_list, link) { + tdm_private_layer *l = NULL; + LIST_FOR_EACH_ENTRY(l, &o->layer_list, link) { + char str[TDM_PATH_LEN]; + if (l->usable) + continue; + snprintf(str, TDM_PATH_LEN, "layer_%d_%d", o->index, l->index); + tdm_helper_dump_buffer_str(l->showing_buffer, path, str); + } + } + + TDM_SNPRINTF(reply, len, "path: %s\n", path); + goto done; + } + + TDM_SNPRINTF(reply, len, "dump: %s\n", arg); + + while (arg) { if (!strncmp(arg, "all", 3)) { tdm_debug_dump = 0xFFFFFFFF; - return TDM_ERROR_NONE; - } - if (!strncmp(arg, "layer", 5)) + goto done; + } else if (!strncmp(arg, "layer", 5)) { tdm_debug_dump |= TDM_DUMP_FLAG_LAYER; - else if (!strncmp(arg, "pp", 2)) + } else if (!strncmp(arg, "pp", 2)) { tdm_debug_dump |= TDM_DUMP_FLAG_PP; - else if (!strncmp(arg, "capture", 7)) + } else if (!strncmp(arg, "capture", 7)) { tdm_debug_dump |= TDM_DUMP_FLAG_CAPTURE; - else - return TDM_ERROR_BAD_REQUEST; + } else + goto done; arg = strtok_r(NULL, ",", &end); } + if (tdm_debug_dump_dir) + free(tdm_debug_dump_dir); + + tdm_debug_dump_dir = strndup(path, TDM_PATH_LEN); + TDM_INFO("dump... '%s'", dump_str); +done: + free(path); return TDM_ERROR_NONE; } diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 2069487..abf3f6d 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -109,7 +109,7 @@ tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, char str[TDM_PATH_LEN]; static int i; snprintf(str, TDM_PATH_LEN, "capture_%03d", i++); - tdm_helper_dump_buffer_str(buffer, str); + tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str); } if (tdm_debug_module & TDM_DEBUG_BUFFER) diff --git a/src/tdm_display.c b/src/tdm_display.c index d84e329..20dc77c 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -1477,8 +1477,8 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) char str[TDM_PATH_LEN]; static int i; snprintf(str, TDM_PATH_LEN, "layer_%d_%d_%03d", - private_output->pipe, private_layer->caps.zpos, i++); - tdm_helper_dump_buffer_str(buffer, str); + private_output->index, private_layer->index, i++); + tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str); } func_layer = &private_display->func_layer; diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 9547582..6ea3e54 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -54,6 +54,7 @@ static const char *file_exts[2] = {"png", "yuv"}; int tdm_dump_enable; +char *tdm_debug_dump_dir; INTERN unsigned long tdm_helper_get_time_in_millis(void) @@ -168,11 +169,48 @@ _tdm_helper_dump_png(const char *file, const void *data, int width, fclose(fp); } +INTERN char * +tdm_helper_dump_make_directory(const char *path, char *reply, int *len) +{ + char *fullpath = NULL; + time_t timer; + struct tm *t, *buf = NULL; + + timer = time(NULL); + + buf = calloc(1, sizeof (struct tm)); + TDM_GOTO_IF_FAIL(buf != NULL, failed_make); + + fullpath = calloc(1, TDM_PATH_LEN * sizeof(char)); + TDM_GOTO_IF_FAIL(fullpath != NULL, failed_make); + + t = localtime_r(&timer, buf); + TDM_GOTO_IF_FAIL(t != NULL, failed_make); + + snprintf(fullpath, TDM_PATH_LEN, "%s/dump_%04d%02d%02d.%02d%02d%02d", path, + t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); + + if ((mkdir(fullpath, 0755)) < 0) { + TDM_ERR("mkdir '%s' fail\n", fullpath); + TDM_SNPRINTF(reply, len, "mkdir '%s' fail\n", fullpath); + goto failed_make; + } + + free(buf); + + return fullpath; +failed_make: + if (fullpath) + free(fullpath); + if (buf) + free(buf); + return NULL; +} + INTERN void -tdm_helper_dump_buffer_str(tbm_surface_h buffer, const char *str) +tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) { tbm_surface_info_s info; - const char *dir = "/tmp/dump-tdm"; const char *ext; char file[TDM_PATH_LEN]; int ret, bw; @@ -180,6 +218,11 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, const char *str) 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); + } + ret = tbm_surface_get_info(buffer, &info); TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); diff --git a/src/tdm_monitor_server.c b/src/tdm_monitor_server.c index a3683fd..c5bda95 100644 --- a/src/tdm_monitor_server.c +++ b/src/tdm_monitor_server.c @@ -252,9 +252,7 @@ _tdm_monitor_server_dump(unsigned int pid, char *cwd, int argc, char *argv[], ch return; } - tdm_display_enable_dump((const char*)argv[2]); - - TDM_SNPRINTF(reply, len, "%s done\n", argv[2]); + tdm_display_enable_dump(dpy, (const char*)argv[2], reply, len); } static struct { @@ -274,7 +272,7 @@ static struct { }, { "debug", _tdm_monitor_server_debug, - "set the debug level and modules(none,mutex,buffer,thread,vblank)", + "set the debug level and modules(module: none, mutex, buffer, thread, vblank)", "[@[,]]", NULL }, @@ -292,8 +290,11 @@ static struct { }, { "dump", _tdm_monitor_server_dump, - "dump buffers (type: layer, pp, capture, none)", - "[,[,...]]", + "dump buffers (type: none, layer, pp, capture, current)\n" + "\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 }, }; diff --git a/src/tdm_pp.c b/src/tdm_pp.c index a1ba203..cffaba0 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -134,7 +134,7 @@ tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, char str[TDM_PATH_LEN]; static int i; snprintf(str, TDM_PATH_LEN, "pp_dst_%03d", i++); - tdm_helper_dump_buffer_str(dst, str); + tdm_helper_dump_buffer_str(dst, tdm_debug_dump_dir, str); } if (tdm_debug_module & TDM_DEBUG_BUFFER) @@ -396,7 +396,7 @@ tdm_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst) char str[TDM_PATH_LEN]; static int i; snprintf(str, TDM_PATH_LEN, "pp_src_%03d", i++); - tdm_helper_dump_buffer_str(src, str); + tdm_helper_dump_buffer_str(src, tdm_debug_dump_dir, str); } pp_buffer = calloc(1, sizeof *pp_buffer); diff --git a/src/tdm_private.h b/src/tdm_private.h index 21649b6..186ac14 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -105,6 +105,8 @@ enum { TDM_DUMP_FLAG_CAPTURE = (1 << 2), }; +#define TDM_DUMP_DIR "/tmp" + typedef struct _tdm_private_display tdm_private_display; typedef struct _tdm_private_output tdm_private_output; typedef struct _tdm_private_layer tdm_private_layer; @@ -481,8 +483,10 @@ tdm_server_init(tdm_private_loop *private_loop); void tdm_server_deinit(tdm_private_loop *private_loop); +char * +tdm_helper_dump_make_directory(const char *path, char *reply, int *len); void -tdm_helper_dump_buffer_str(tbm_surface_h buffer, const char *str); +tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str); unsigned long tdm_helper_get_time_in_millis(void); unsigned long @@ -491,6 +495,7 @@ tdm_helper_get_time_in_micros(void); extern pthread_mutex_t tdm_mutex_check_lock; extern int tdm_mutex_locked; extern int tdm_dump_enable; +extern char *tdm_debug_dump_dir; #define _pthread_mutex_unlock(l) \ do { \ @@ -553,7 +558,7 @@ tdm_display_update_output(tdm_private_display *private_display, tdm_error tdm_display_enable_debug_module(const char*modules); tdm_error -tdm_display_enable_dump(const char *dump_str); +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); -- 2.7.4 From 733d6051c16439cac03928c3f8dd0a945a23471d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 8 Aug 2016 10:34:31 +0900 Subject: [PATCH 13/16] fix syntax error Change-Id: I7050f9426ee4cfd62d3affae21416e2021791b82 --- doc/tdm_doc.h | 4 ++-- include/tdm_backend.h | 7 ++++--- src/tdm.c | 9 ++++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/tdm_doc.h b/doc/tdm_doc.h index afe08eb..a98c7da 100644 --- a/doc/tdm_doc.h +++ b/doc/tdm_doc.h @@ -89,7 +89,7 @@ * ... * * memset(&drm_func_display, 0, sizeof(drm_func_display)); - * drm_func_display.display_get_capabilitiy = drm_display_get_capabilitiy; + * drm_func_display.display_get_capability = drm_display_get_capability; * ... * ret = tdm_backend_register_func_display(dpy, &drm_func_display); * if (ret != TDM_ERROR_NONE) @@ -134,7 +134,7 @@ $ git clone ssh://{user_id}@review.tizen.org:29418/platform/core/uifw/libtdm-drm * @endcode * \n - * After loading a TDM backend module, TDM will call @b display_get_capabilitiy(), + * After loading a TDM backend module, TDM will call @b display_get_capability(), * @b display_get_outputs(), @b output_get_capability(), @b output_get_layers(), * @b layer_get_capability() functions to get the hardware information. That is, * a TDM backend module @b SHOULD implement these 5 functions basically.\n diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 8076fa2..bf270e2 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -73,7 +73,7 @@ typedef void (*tdm_output_status_handler)(tdm_output *output, /** * @brief The display capabilities structure of a backend module - * @see The display_get_capabilitiy() function of #tdm_func_display + * @see The display_get_capability() function of #tdm_func_display */ typedef struct _tdm_caps_display { int max_layer_count; /**< The maximum layer count. -1 means "not defined" */ @@ -205,7 +205,7 @@ typedef struct _tdm_func_display { * a backend module can set the max count to max_layer_count of #tdm_caps_display * structure. Otherwise, set -1. */ - tdm_error (*display_get_capabilitiy)(tdm_backend_data *bdata, tdm_caps_display *caps); + tdm_error (*display_get_capability)(tdm_backend_data *bdata, tdm_caps_display *caps); /** * @brief Get the pp capabilities of a backend module @@ -324,7 +324,8 @@ typedef struct _tdm_func_display { */ tdm_pp *(*display_create_pp)(tdm_backend_data *bdata, tdm_error *error); - void (*reserved1)(void); + tdm_error (*display_get_capabilitiy)(tdm_backend_data *bdata, tdm_caps_display *caps); + void (*reserved2)(void); void (*reserved3)(void); void (*reserved4)(void); diff --git a/src/tdm.c b/src/tdm.c index 2f83a78..8c7843a 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -676,15 +676,18 @@ _tdm_display_check_backend_functions(tdm_private_display *private_display) /* below functions should be implemented in backend side */ TDM_RETURN_VAL_IF_FAIL(func_display != NULL, TDM_ERROR_BAD_MODULE); - TDM_RETURN_VAL_IF_FAIL(func_display->display_get_capabilitiy, TDM_ERROR_BAD_MODULE); +// TDM_RETURN_VAL_IF_FAIL(func_display->display_get_capabilitiy, TDM_ERROR_BAD_MODULE); TDM_RETURN_VAL_IF_FAIL(func_display->display_get_outputs, TDM_ERROR_BAD_MODULE); TDM_RETURN_VAL_IF_FAIL(func_output->output_get_capability, TDM_ERROR_BAD_MODULE); TDM_RETURN_VAL_IF_FAIL(func_output->output_get_layers, TDM_ERROR_BAD_MODULE); TDM_RETURN_VAL_IF_FAIL(func_layer->layer_get_capability, TDM_ERROR_BAD_MODULE); - ret = func_display->display_get_capabilitiy(private_display->bdata, &private_display->caps_display); + if (func_display->display_get_capability) + ret = func_display->display_get_capability(private_display->bdata, &private_display->caps_display); + else + ret = func_display->display_get_capabilitiy(private_display->bdata, &private_display->caps_display); if (ret != TDM_ERROR_NONE) { - TDM_ERR("display_get_capabilitiy() failed"); + TDM_ERR("display_get_capability() failed"); return TDM_ERROR_BAD_MODULE; } -- 2.7.4 From a6091b4d9dd53b37d31f693b95b56dbfd10ed3e0 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 8 Aug 2016 10:59:34 +0900 Subject: [PATCH 14/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 15/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 16/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