tdm_layer *layer;
tbm_surface_h bufs[3];
int buf_idx;
+ int need_mode_change;
+ int index;
};
struct _tdm_test_server {
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)
}
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)
{
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, ¤t);
+ 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);
}
}
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;
}
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);
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);
}
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);
}