virtual: add virtual output mode set test to tdm_test
[platform/core/uifw/libtdm.git] / tools / tdm_test_server.c
index 98b10db..af48e5c 100644 (file)
@@ -312,6 +312,8 @@ struct _tdm_test_server_voutput {
        tdm_layer *layer;
        tbm_surface_h bufs[3];
        int buf_idx;
+       int need_mode_change;
+       int index;
 };
 
 struct _tdm_test_server {
@@ -337,6 +339,7 @@ static void output_setup(tdm_test_server_output *o);
 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 void _vlayer_show_buffer(tdm_test_server_voutput *voutput);
+static void _voutput_layer_init(tdm_test_server_voutput *voutput);
 
 static char*
 parse_size(tdm_size *size, char *arg)
@@ -809,6 +812,37 @@ get_tts_buffer(tbm_surface_h b)
 }
 
 static void
+_voutput_buff_deinit(tdm_test_server_voutput *voutput)
+{
+       int i;
+
+       for (i = 0; i < 3; i++) {
+               if (!voutput->bufs[i]) continue;
+
+               tbm_surface_destroy(voutput->bufs[i]);
+               voutput->bufs[i] = NULL;
+       }
+}
+
+static void
+_voutput_buff_init(tdm_test_server_voutput *voutput)
+{
+       tdm_output *output = voutput->output;
+       const tdm_output_mode *mode;
+       tdm_error ret = TDM_ERROR_NONE;
+       int i;
+
+       ret = tdm_output_get_mode(output, &mode);
+       TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+
+       for (i = 0; i < 3; i++) {
+               tbm_surface_h b = tbm_surface_internal_create_with_flags(mode->hdisplay, mode->vdisplay, DEFAULT_FORMAT, 0);
+               TDM_EXIT_IF_FAIL(b != NULL);
+               tdm_test_buffer_fill(b, i);
+               voutput->bufs[i] = b;
+       }
+}
+static void
 _vlayer_cb_commit(tdm_layer *layer, unsigned int sequence,
                                unsigned int tv_sec, unsigned int tv_usec, void *user_data)
 {
@@ -817,13 +851,42 @@ _vlayer_cb_commit(tdm_layer *layer, unsigned int sequence,
        tdm_output_conn_status status;
        tdm_error ret;
 
-       printf("voutput cb commit:\t %d: l(%p) b(%p)\n", voutput->buf_idx, voutput->layer, voutput->bufs[voutput->buf_idx]);
+       printf("voutput cb:\t %d: l(%p) b(%p)\n", voutput->buf_idx, voutput->layer, voutput->bufs[voutput->buf_idx]);
 
        ret = tdm_output_get_conn_status(voutput->output, &status);
        TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
 
        if (status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED) return;
 
+       if (voutput->need_mode_change) {
+               const tdm_output_mode *modes;
+               int count = 0;
+
+               tdm_output_get_available_modes(voutput->output, &modes, &count);
+               if (count > voutput->index) {
+                       const tdm_output_mode *mode, *current;
+
+                       ret = tdm_output_get_mode(voutput->output, &current);
+                       TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+
+                       mode = &modes[voutput->index];
+
+                       if (mode != current) {
+                               printf("mode change to %d (%dx%d, %d)\n",
+                                       voutput->index, mode->hdisplay, mode->vdisplay, mode->vrefresh);
+                               _voutput_buff_deinit(voutput);
+                               _voutput_buff_init(voutput);
+
+                               ret = tdm_output_set_mode(voutput->output, mode);
+                               TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+
+                               _voutput_layer_init(voutput);
+                               voutput->buf_idx = 2;
+                       }
+               }
+               voutput->need_mode_change = 0;
+       }
+
        voutput->buf_idx++;
        _vlayer_show_buffer(voutput);
 }
@@ -848,25 +911,6 @@ _vlayer_show_buffer(tdm_test_server_voutput *voutput)
 }
 
 static void
-_voutput_buff_init(tdm_test_server_voutput *voutput)
-{
-       tdm_output *output = voutput->output;
-       const tdm_output_mode *mode;
-       tdm_error ret = TDM_ERROR_NONE;
-       int i;
-
-       ret = tdm_output_get_mode(output, &mode);
-       TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
-
-       for (i = 0; i < 3; i++) {
-               tbm_surface_h b = tbm_surface_internal_create_with_flags(mode->hdisplay, mode->vdisplay, DEFAULT_FORMAT, 0);
-               TDM_EXIT_IF_FAIL(b != NULL);
-               tdm_test_buffer_fill(b, i);
-               voutput->bufs[i] = b;
-       }
-}
-
-static void
 _voutput_layer_init(tdm_test_server_voutput *voutput)
 {
        tdm_output *output = voutput->output;
@@ -993,22 +1037,41 @@ _tdm_test_server_cb_output_change(tdm_output *output, tdm_output_change_type typ
 }
 
 static void
+_tdm_test_server_cb_output_mode_change(tdm_output *output, unsigned int index, void *user_data)
+{
+       tdm_test_server_voutput *voutput = NULL;
+       const tdm_output_mode *modes;
+       int count = 0;
+       tdm_error ret;
+
+       voutput = (tdm_test_server_voutput *)user_data;
+       TDM_EXIT_IF_FAIL(voutput != NULL);
+
+       ret = tdm_output_get_available_modes(output, &modes, &count);
+       TDM_RETURN_IF_FAIL(ret == TDM_ERROR_NONE);
+       TDM_RETURN_IF_FAIL(index < count);
+
+       voutput->need_mode_change = 1;
+       voutput->index = index;
+
+       printf("mode change request. index:%d\n", index);
+}
+
+static void
 _tdm_output_cb_destroy_handler(tdm_output *output, void *user_data)
 {
        tdm_test_server_voutput *voutput = NULL;
-       int i;
 
        voutput = (tdm_test_server_voutput *)user_data;
        TDM_EXIT_IF_FAIL(voutput != NULL);
 
+       tdm_output_remove_mode_change_request_handler(output, _tdm_test_server_cb_output_mode_change, voutput);
        tdm_output_remove_change_handler(output, _tdm_test_server_cb_output_change, voutput);
        tdm_output_remove_destroy_handler(output, _tdm_output_cb_destroy_handler, voutput);
 
        LIST_DEL(&voutput->link);
 
-       for (i = 0; i < 3; i++) {
-               tbm_surface_destroy(voutput->bufs[i]);
-       }
+       _voutput_buff_deinit(voutput);
 
        printf("voutput: %p destroy\n", voutput);
 
@@ -1033,6 +1096,9 @@ _tdm_output_cb_create_handler(tdm_display *dpy, tdm_output *output, void *user_d
        ret = tdm_output_add_change_handler(output, _tdm_test_server_cb_output_change, voutput);
        TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
 
+       ret = tdm_output_add_mode_change_request_handler(output, _tdm_test_server_cb_output_mode_change, voutput);
+       TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+
        ret = tdm_output_add_destroy_handler(output, _tdm_output_cb_destroy_handler, voutput);
        TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
 
@@ -1107,9 +1173,7 @@ destroy(tdm_test_server *data)
        }
 
        LIST_FOR_EACH_ENTRY_SAFE(v, vv, &data->voutput_list, link) {
-               for (int i = 0; i < 3; i++) {
-                       tbm_surface_destroy(v->bufs[i]);
-               }
+               _voutput_buff_deinit(v);
                LIST_DEL(&v->link);
                free(v);
        }