X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tools%2Ftdm_test_server.c;h=535462f7648d17cb708d21fc6e2ab4be78fc906e;hb=3ad3e82dc0bc043697fc72d34c5cf7d051b69af4;hp=932e20dc170a323f7d3f5ece3ac9848b67c4942b;hpb=5ecd7fb59c26446e6f7a83cd2278b0cecd5393bf;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/tools/tdm_test_server.c b/tools/tdm_test_server.c index 932e20d..535462f 100644 --- a/tools/tdm_test_server.c +++ b/tools/tdm_test_server.c @@ -9,7 +9,7 @@ * Taeheon Kim , * YoungJun Cho , * SooChan Lim , - * Boram Park + * Boram Park * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the @@ -45,11 +45,11 @@ #include #include -#include -#include -#include -#include -#include +#include "tdm.h" +#include "tdm_log.h" +#include "tdm_list.h" +#include "tdm_helper.h" +#include "tdm_backend.h" #include "tdm_macro.h" #include "tdm_private.h" @@ -105,14 +105,14 @@ static struct optstrings optstrs[] = { }, { OPT_TST, "c", "catpure a output object or a layer object.\n\t\t'-l' is used to show the result on screen.", - "[,]~x[++][,x][@][*]", NULL + "[,]~x[++][,x][@][*][^stream]", NULL }, { OPT_GEN, "w", "set the property of a object", ":", 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,7 +176,13 @@ usage(char *app_name) printf("\n"); } - exit(0); + 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"); } //////////////////////////////////////////////////////////////////////////////// @@ -159,6 +194,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) \ @@ -192,7 +229,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; @@ -212,6 +249,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 { @@ -224,7 +263,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; @@ -257,7 +296,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; }; @@ -276,10 +315,11 @@ struct _tdm_test_server { tdm_display *display; }; +static void destroy(tdm_test_server *data); 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) @@ -381,6 +421,13 @@ parse_arg_c(tdm_test_server_capture *c, char *arg) arg = end + 1; capture_info->transform = strtol(arg, &end, 10); } + if (*end == '^') { + arg = end + 1; + if (strtol(arg, &end, 10) > 0) + capture_info->type = TDM_CAPTURE_TYPE_STREAM; + else + capture_info->type = TDM_CAPTURE_TYPE_ONESHOT; + } } static void @@ -470,6 +517,7 @@ parse_args(tdm_test_server *data, int argc, char *argv[]) if (argc < 2) { usage(argv[0]); + destroy(data); exit(0); } @@ -488,18 +536,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 +556,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 +576,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) @@ -548,15 +598,26 @@ parse_args(tdm_test_server *data, int argc, char *argv[]) data->do_vblank = 1; } else { usage(argv[0]); + destroy(data); 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 +631,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 +639,13 @@ 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; + tdm_output *output = tdm_display_get_output(data->display, i, NULL); + tdm_output_conn_status status; + ret = tdm_output_get_conn_status(output, &status); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + if (status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED) + continue; o = calloc(1, sizeof * o); TDM_EXIT_IF_FAIL(o != NULL); o->data = data; @@ -587,40 +653,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->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); @@ -630,180 +672,176 @@ 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); } } } - } -} - -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; - if (data->do_query) { - printf("query\n"); - return; + TDM_EXIT_IF_FAIL(primary_l != NULL); + LIST_DEL(&primary_l->link); + LIST_ADD(&primary_l->link, &o->layer_list); } + + /* fill the empty information of layers */ 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"); - } + tdm_output *output; + int minw, minh, maxw, maxh; + + 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); + + /* 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; +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) +destroy(tdm_test_server *data) { - tdm_test_server *data = &tts_data; tdm_test_server_output *o = NULL, *oo = NULL; tdm_test_server_layer *l = NULL, *ll = NULL; tdm_test_server_pp *p = NULL, *pp = NULL; tdm_test_server_capture *c = NULL, *cc = NULL; tdm_test_server_prop *w = NULL, *ww = NULL; + tdm_error ret; int i; - printf("got signal: %d\n", sig); + LIST_FOR_EACH_ENTRY_SAFE(c, cc, &data->capture_list, link) { + LIST_DEL(&c->link); + tdm_capture_destroy(c->capture); + free(c); + } - LIST_FOR_EACH_ENTRY_SAFE(o, oo, &data->output_list, link) { - LIST_DEL(&o->link); + LIST_FOR_EACH_ENTRY_SAFE(p, pp, &data->pp_list, link) { + tdm_display_lock(data->display); + tdm_event_loop_source_remove(p->timer_source); + tdm_display_unlock(data->display); + tdm_pp_destroy(p->pp); + } + + LIST_FOR_EACH_ENTRY_SAFE(o, oo, &data->output_list, link) { LIST_FOR_EACH_ENTRY_SAFE(l, ll, &o->layer_list, link) { - LIST_DEL(&l->link); + ret = tdm_layer_unset_buffer(l->layer); + TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); + } + ret = tdm_layer_commit(l->layer, NULL, NULL); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + } - tdm_layer_unset_buffer(l->layer); + LIST_FOR_EACH_ENTRY_SAFE(p, pp, &data->pp_list, link) { + LIST_DEL(&p->link); + for (i = 0; i < TDM_ARRAY_SIZE(p->bufs); i++) + tbm_surface_destroy(p->bufs[i]); + free(p); + } + LIST_FOR_EACH_ENTRY_SAFE(o, oo, &data->output_list, link) { + LIST_DEL(&o->link); + LIST_FOR_EACH_ENTRY_SAFE(l, ll, &o->layer_list, link) { + LIST_DEL(&l->link); LIST_FOR_EACH_ENTRY_SAFE(w, ww, &l->prop_list, link) { 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); } - - tdm_output_commit(o->output, 0, NULL, NULL); - LIST_FOR_EACH_ENTRY_SAFE(w, ww, &o->prop_list, link) { LIST_DEL(&w->link); free(w); @@ -812,28 +850,6 @@ exit_test(int sig) free(o); } - - LIST_FOR_EACH_ENTRY_SAFE(p, pp, &data->pp_list, link) { - LIST_DEL(&p->link); - - tdm_display_lock(data->display); - tdm_event_loop_source_remove(p->timer_source); - 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]); - } - free(p); - } - - LIST_FOR_EACH_ENTRY_SAFE(c, cc, &data->capture_list, link) { - LIST_DEL(&c->link); - tdm_capture_destroy(c->capture); - free(c); - } - if (data->display) tdm_display_deinit(data->display); @@ -848,9 +864,25 @@ main(int argc, char *argv[]) int len = sizeof temp; tdm_error ret; - signal(SIGINT, exit_test); /* 2 */ - signal(SIGSEGV, exit_test); /* 11 */ - signal(SIGTERM, exit_test); /* 15 */ +#if 1 /* for testing */ + const char *s = (const char*)getenv("XDG_RUNTIME_DIR"); + if (!s) { + char buf[32]; + snprintf(buf, sizeof(buf), "/run"); + int ret = setenv("XDG_RUNTIME_DIR", (const char*)buf, 1); + if (ret != 0) + exit(0); + } + + s = (const char*)getenv("TBM_DISPLAY_SERVER"); + if (!s) { + char buf[32]; + snprintf(buf, sizeof(buf), "1"); + int ret = setenv("TBM_DISPLAY_SERVER", (const char*)buf, 1); + if (ret != 0) + exit(0); + } +#endif memset(data, 0, sizeof * data); LIST_INITHEAD(&data->output_list); @@ -866,7 +898,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); @@ -906,7 +937,7 @@ output_setup(tdm_test_server_output *o) } if (!best) best = &modes[i]; - if (modes[i].flags & TDM_OUTPUT_MODE_TYPE_PREFERRED) + if (modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED) prefer = &modes[i]; } if (!found && prefer) { @@ -926,6 +957,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 +968,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; } } @@ -944,78 +978,87 @@ 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); if (!l->bufs[0]) { 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; + 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) ? : 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); 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); + 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); } static void -layer_cb_commit(tdm_output *output, unsigned int sequence, +layer_cb_commit(tdm_layer *layer, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, 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); - layer_show_buffer(l, b); + + if (!l->is_primary || l->o->fill_primary_layer) + 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); + TDM_EXIT_IF_FAIL(tb != NULL); + + 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; + ret = tdm_buffer_add_release_handler(b, layer_cb_buffer_release, NULL); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); if (data->do_vblank) - ret = tdm_output_commit(l->o->output, 0, layer_cb_commit, l); + ret = tdm_layer_commit(l->layer, layer_cb_commit, l); else - ret = tdm_output_commit(l->o->output, 0, NULL, NULL); + ret = tdm_layer_commit(l->layer, NULL, NULL); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); printf("show:\tl(%p) b(%p)\n", l, 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; @@ -1027,7 +1070,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; @@ -1040,6 +1083,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,31 +1098,34 @@ 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; } } } -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); if (!p->bufs[0]) { 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; - tdm_test_server_buffer *b = calloc(1, sizeof *b); + 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; + tbm_surface_h b = buffer_allocate(width, height, format, 0); 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); 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 == NULL) + continue; + + if (!tb->in_use) { + tdm_test_buffer_fill(p->bufs[i], p->data->b_fill); return p->bufs[i]; } } @@ -1082,34 +1134,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); + + dtb = get_tts_buffer(db); + TDM_EXIT_IF_FAIL(dtb != 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); + 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); @@ -1129,7 +1185,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); @@ -1152,17 +1208,23 @@ 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; + tdm_test_server *data; tbm_surface_info_s info; tdm_error ret; + if (!p || !p->l || !p->l->o || !p->l->o->data) { + TDM_ERR("invalid parameter failed"); + exit(0); + } + data = p->l->o->data; + p->pp = tdm_display_create_pp(data->display, &ret); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); /* 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; @@ -1173,7 +1235,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; @@ -1186,6 +1248,16 @@ 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(" ! "); + print_config(&p->info.dst_config); + printf(" fps(%d) transform(%s)\n", p->fps, tdm_transform_str(p->info.transform)); + 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 @@ -1207,34 +1279,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; + + tb = get_tts_buffer(b); + TDM_EXIT_IF_FAIL(tb != NULL); - ret = tdm_capture_attach(c->capture, b->buffer); + 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); @@ -1242,14 +1326,20 @@ 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_test_server *data; tdm_output *output; tdm_layer *layer; tbm_surface_info_s info; tdm_error ret; + if (!c || !c->l || !c->l->o || !c->l->o->data) { + TDM_ERR("invalid parameter failed"); + exit(0); + } + data = c->l->o->data; + if (c->output_idx != -1 && c->layer_idx == -1) { output = tdm_display_get_output(data->display, c->output_idx, &ret); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); @@ -1267,7 +1357,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; @@ -1276,10 +1366,19 @@ capture_setup(tdm_test_server_capture *c, tdm_test_server_buffer *b) c->info.dst_config.size.v = info.height; } c->info.dst_config.format = info.format; + c->info.type = TDM_CAPTURE_TYPE_ONESHOT; 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)); + printf("\toutput_idx(%d) layer_idx(%d)\n", c->l->o->idx, c->l->idx); + layer_setup(c->l, b); } @@ -1299,8 +1398,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, data->b_fill); layer_setup(l, b); layer_show_buffer(l, b); } @@ -1308,7 +1409,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); @@ -1320,7 +1421,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); @@ -1332,8 +1433,12 @@ run_test(tdm_test_server *data) printf("enter test loop\n"); - while (1) - tdm_display_handle_events(data->display); + while (1) { + ret = tdm_display_handle_events(data->display); + TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); + } + + destroy(data); return; no_pp: