change function name to tdm_output_attach_buffer.
fix voutput buffer handling error of tdm_server.
Change-Id: I081e9a1e0c562df1b31513f2161240ba422cb4d1
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_CONNECTED,
TDM_ERROR_BAD_REQUEST);
- private_output->connection = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+ if (!private_output->watch_output_changes)
+ private_output->connection = TDM_OUTPUT_CONN_STATUS_CONNECTED;
_tdm_client_voutput_send_available_modes(private_voutput);
TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_DISCONNECTED,
TDM_ERROR_BAD_REQUEST);
- private_output->connection = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+ if (!private_output->watch_output_changes)
+ private_output->connection = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
/* To Do : change voutput to output */
wl_tdm_voutput_disconnect(private_voutput->wl_voutput);
TDM_GOTO_IF_FAIL(buffer != NULL, commit_failed);
_pthread_mutex_unlock(&private_display->lock);
- ret = tdm_output_send_buffer(private_output, buffer);
+ ret = tdm_output_attach_buffer(private_output, buffer);
TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed);
ret = tdm_output_commit_buffer(private_output);
TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed);
tdm_error
tdm_output_set_disconnect(tdm_output *output);
tdm_error
-tdm_output_send_buffer(tdm_output *output, tbm_surface_h buffer);
+tdm_output_attach_buffer(tdm_output *output, tbm_surface_h buffer);
tdm_error
tdm_output_commit_buffer(tdm_output *output);
tdm_error
return;
}
- TDM_DBG("send the output changes: %d", (unsigned int)pid);
+ TDM_DBG("send the output changes: %d, type:%d, value:%d", (unsigned int)pid, type, value.u32);
switch (type) {
case TDM_OUTPUT_CHANGE_DPMS:
voutput_info->mmwidth = 0;
voutput_info->mmheight = 0;
+ if (voutput_info->attach_buffer) {
+ tbm_surface_h buffer = voutput_info->attach_buffer->buffer;
+ tbm_surface_internal_unref(buffer);
+ voutput_info->committing = 0;
+ voutput_info->attach_buffer = NULL;
+ }
+
tdm_output_set_disconnect(voutput_info->output);
}
tbm_surface_h buffer;
voutput_info = wl_resource_get_user_data(resource);
- if (voutput_info->status != TDM_OUTPUT_CONN_STATUS_CONNECTED)
- {
- // handle error
+ if (voutput_info->status != TDM_OUTPUT_CONN_STATUS_CONNECTED) {
+ TDM_DBG("not connected.");
return;
}
buffer = voutput_info->attach_buffer->buffer;
tbm_surface_internal_unref(buffer);
-
voutput_info->committing = 0;
voutput_info->attach_buffer = NULL;
}
INTERN tdm_error
-tdm_output_send_buffer(tdm_output *output, tbm_surface_h buffer)
+tdm_output_attach_buffer(tdm_output *output, tbm_surface_h buffer)
{
tdm_private_server *private_server = keep_private_server;
tdm_server_voutput_info *voutput_info = NULL, *vo = NULL;
TDM_RETURN_VAL_IF_FAIL(voutput_info->attach_buffer != NULL, TDM_ERROR_OPERATION_FAILED);
TDM_RETURN_VAL_IF_FAIL(voutput_info->committing == 0, TDM_ERROR_OPERATION_FAILED);
+ tbm_surface_internal_ref(voutput_info->attach_buffer->buffer);
voutput_info->committing = 1;
wl_tdm_voutput_send_commit(voutput_info->resource);
if (ret != TDM_ERROR_NONE)
TDM_ERR("_tdm_voutput_cb_destroy fail");
+ if (voutput_info->attach_buffer) {
+ tbm_surface_h buffer = voutput_info->attach_buffer->buffer;
+ tbm_surface_internal_unref(buffer);
+ voutput_info->committing = 0;
+ voutput_info->attach_buffer = NULL;
+ }
+
LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) {
if (!vb) continue;
int waiting;
tdm_client *client;
+ tdm_client_voutput *voutput;
+ tdm_client_output *output;
} tdm_test_client;
struct typestrings {
TDM_EXIT_IF_FAIL(data != NULL);
TDM_EXIT_IF_FAIL(buffer != NULL);
- if (count < 11)
+ if (count < 10)
_dump_buffer(buffer, count);
count++;
- printf("client: %d commited(%p)\n", count, buffer);
+ if (count == 70) {
+ printf("client: %d commited(%p), disconnect\n", count, buffer);
+ tdm_client_output_disconnect(data->output);
+ } 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;
+
+ 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);
+ tdm_client_voutput_destroy(voutput);
+ } else if (status == TDM_OUTPUT_CONN_STATUS_CONNECTED) {
+ printf("client: connected\n");
+ }
+ } 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)
{
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);
ret = tdm_client_output_connect(output);
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);
}
output = voutput->output;
+ printf("output: %p disconnect\n", voutput);
+
ret = tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_OFF);
TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
}
tbm_surface_destroy(voutput->bufs[i]);
}
+ printf("voutput: %p destroy\n", voutput);
+
free(voutput);
}
voutput->output = output;
voutput->data = data;
- printf("voutput create done\n");
+ printf("voutput %p create done\n", voutput);
LIST_ADDTAIL(&voutput->link, &data->voutput_list);
}