Fix invalid assignment with unsigned values
[platform/core/uifw/libtdm.git] / tools / tdm_test_client.c
index 11976fb..a3f9cb2 100644 (file)
@@ -9,7 +9,7 @@
  *          Taeheon Kim <th908.kim@samsung.com>,
  *          YoungJun Cho <yj44.cho@samsung.com>,
  *          SooChan Lim <sc1.lim@samsung.com>,
- *          Boram Park <sc1.lim@samsung.com>
+ *          Boram Park <boram1288.park@samsung.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the
@@ -43,6 +43,9 @@
 
 #include "tdm_client.h"
 #include "tdm_macro.h"
+#include "buffers.h"
+
+#define CHECK_V_STEP 0
 
 typedef struct _tdm_test_client_arg {
        char *output_name;
@@ -60,9 +63,12 @@ typedef struct _tdm_test_client {
 
        int do_query;
        int do_vblank;
+       int do_voutput;
        int waiting;
 
        tdm_client *client;
+       tdm_client_voutput *voutput;
+       tdm_client_output *output;
 } tdm_test_client;
 
 struct typestrings {
@@ -93,6 +99,7 @@ static struct typestrings typestrs[] = {
 static struct optstrings optstrs[] = {
        {OPT_QRY, "qo", "output objects info", "<output_name>", "primary"},
        {OPT_TST, "v", "vblank test", "<output_name>[,<sync>][@<fps>][~<interval>][+<offset>][*fake][^vblank_name]", "primary,0@60~1+0*1^test"},
+       {OPT_TST, "V", "virtual output test", NULL, NULL},
 };
 
 static void
@@ -181,7 +188,7 @@ parse_args(tdm_test_client *data, int argc, char *argv[])
 {
        int i;
 
-       if (argc < 3) {
+       if (argc < 2) {
                usage(argv[0]);
                exit(0);
        }
@@ -196,6 +203,8 @@ parse_args(tdm_test_client *data, int argc, char *argv[])
                } else if (!strncmp(argv[i] + 1, "v", 1)) {
                        data->do_vblank = 1;
                        parse_arg_v(data, argv[++i]);
+               } else if (!strncmp(argv[i] + 1, "V", 1)) {
+                       data->do_voutput = 1;
                } else {
                        usage(argv[0]);
                        exit(0);
@@ -374,6 +383,165 @@ done:
                tdm_client_vblank_destroy(vblank);
 }
 
+static void
+_dump_buffer(tbm_surface_h buffer, int count)
+{
+       char temp[TDM_PATH_LEN] = {0,};
+       tbm_format tformat;
+       const char *ext, *file_exts[2] = {"png", "yuv"};
+
+       tformat = tbm_surface_get_format(buffer);
+
+       if (IS_RGB(tformat))
+               ext = file_exts[0];
+       else
+               ext = file_exts[1];
+
+       snprintf(temp, TDM_PATH_LEN, "%c%c%c%c_%dx%d_%d",
+               FOURCC_STR(tbm_surface_get_format(buffer)),
+               tbm_surface_get_width(buffer),
+               tbm_surface_get_height(buffer),
+               count);
+       tbm_surface_internal_capture_buffer(buffer, "/tmp", temp, ext);
+}
+
+static void
+_voutput_commit(tdm_client_voutput *voutput, tbm_surface_h buffer, void *user_data)
+{
+       tdm_test_client *data = (tdm_test_client *)user_data;
+       static int count = 0;
+
+       TDM_EXIT_IF_FAIL(data != NULL);
+       TDM_EXIT_IF_FAIL(buffer != NULL);
+
+       if ((count < 10) || (count >= 31 && count <= 40))
+               _dump_buffer(buffer, count);
+       count++;
+
+       if (count == 30) {
+               printf("client: %d commited(%p), mode change request to index 1\n", count, buffer);
+               tdm_client_voutput_set_mode(data->voutput, 1);
+       } else if (count == 50) {
+               printf("client: %d commited(%p), disconnect\n", count, buffer);
+               tdm_client_voutput_disconnect(data->voutput);
+       } else {
+               printf("client: %d commited(%p)\n", count, buffer);
+       }
+
+       tdm_client_voutput_commit_done(voutput);
+}
+
+static void
+_voutput_output_handler(tdm_client_output *output, tdm_output_change_type type,
+                                          tdm_value value, void *user_data)
+{
+       tdm_client_voutput *voutput = NULL;
+       tdm_output_conn_status status;
+       tdm_test_client *data;
+       unsigned int width, height;
+
+       data = (tdm_test_client *) user_data;
+       TDM_RETURN_IF_FAIL(data != NULL);
+       voutput = data->voutput;
+       TDM_RETURN_IF_FAIL(voutput != NULL);
+
+       if (type == TDM_OUTPUT_CHANGE_CONNECTION) {
+               status = (tdm_output_conn_status)value.u32;
+               printf("output %s.\n", conn_str[value.u32]);
+
+               if (status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED) {
+                       printf("client: disconnected, destroy voutput\n");
+                       tdm_client_output_remove_change_handler(output, _voutput_output_handler, data);
+#if CHECK_V_STEP
+                       printf("press enter to continuet\n");
+                       getchar();
+#endif
+                       tdm_client_voutput_destroy(voutput);
+               } else if (status == TDM_OUTPUT_CONN_STATUS_CONNECTED) {
+                       printf("client: connected\n");
+               } else if (status == TDM_OUTPUT_CONN_STATUS_MODE_SETTED) {
+                       tdm_client_output_get_mode(output, &width, &height);
+                       printf("client: mode setted(%dx%d)\n", width, height);
+#if CHECK_V_STEP
+                       printf("press enter to continuet\n");
+                       getchar();
+#endif
+               }
+       } else if (type == TDM_OUTPUT_CHANGE_DPMS) {
+               printf("output %s.\n", dpms_str[value.u32]);
+       }
+}
+
+static void
+_voutput_make_available_mode(tdm_client_output_mode *modes, int count)
+{
+       int i;
+       for (i = 0 ; i < count; i++) {
+               modes[i].clock = 25200;
+               modes[i].hdisplay = 640 * (count - i);
+               modes[i].hsync_start = 656;
+               modes[i].hsync_end = 752;
+               modes[i].htotal = 800;
+               modes[i].hskew = 0;
+               modes[i].vdisplay = 480 * (count - i);
+               modes[i].vsync_start = 490;
+               modes[i].vsync_end = 492;
+               modes[i].vtotal = 525;
+               modes[i].vscan = 0;
+               modes[i].vrefresh = 30;
+               modes[i].flags = 0;
+               modes[i].type = 0;
+               snprintf(modes[i].name, TDM_NAME_LEN, "%dx%d_%d", modes[i].hdisplay, modes[i].vdisplay, i);
+       }
+}
+
+static void
+do_voutput(tdm_test_client *data)
+{
+       tdm_client_voutput *voutput = NULL;
+       tdm_client_output *output = NULL;
+       tdm_client_output_mode modes[2];
+       tdm_error ret = TDM_ERROR_NONE;
+
+       printf("virtual output test - client\n");
+
+       voutput = tdm_client_create_voutput(data->client, "virtual-test", &ret);
+       TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+
+       ret = tdm_client_voutput_add_commit_handler(voutput, _voutput_commit, data);
+       TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
+
+       output = tdm_client_voutput_get_client_output(voutput, &ret);
+       TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
+
+       ret = tdm_client_output_add_change_handler(output, _voutput_output_handler, data);
+       TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
+
+       ret = tdm_client_voutput_set_physical_size(voutput, 300, 200);
+       TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
+
+       _voutput_make_available_mode(modes, 2);
+       ret = tdm_client_voutput_set_available_modes(voutput, modes, 2);
+       TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
+#if CHECK_V_STEP
+       printf("virtual output test - press enter to connect\n");
+       getchar();
+#endif
+       ret = tdm_client_voutput_connect(voutput);
+       TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
+
+       data->voutput = voutput;
+       data->output = output;
+
+       while (1) {
+               tdm_client_handle_events_timeout(data->client, 1000);
+       }
+
+done:
+       if (voutput)
+               tdm_client_voutput_destroy(voutput);
+}
+
 static tdm_test_client ttc_data;
 
 int
@@ -382,7 +550,7 @@ main(int argc, char *argv[])
        tdm_test_client *data = &ttc_data;
        tdm_error error;
 
-#if 1 /* for testing */
+       /* for testing */
        const char *xdg = (const char*)getenv("XDG_RUNTIME_DIR");
        if (!xdg) {
                char buf[32];
@@ -391,7 +559,16 @@ main(int argc, char *argv[])
                if (ret != 0)
                        exit(0);
        }
-#endif
+
+       /* for tbm_bufmgr_init */
+       const char *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);
+       }
 
        parse_args(data, argc, argv);
 
@@ -409,6 +586,8 @@ main(int argc, char *argv[])
                do_query(data);
        if (data->do_vblank)
                do_vblank(data);
+       if (data->do_voutput)
+               do_voutput(data);
 
 done:
        if (data->args.output_name)