#define TDM_ARRAY_NTH_DATA(array, type, n) (((type*)((array)->data)) + n)
typedef struct _tdm_private_client_vblank tdm_private_client_vblank;
+typedef struct _tdm_private_client_voutput tdm_private_client_voutput;
typedef struct _tdm_private_client {
pthread_mutex_t lock;
struct wl_registry *registry;
struct wl_tdm *tdm;
struct list_head output_list;
+ struct list_head voutput_list;
unsigned int enable_ttrace;
unsigned int stamp;
} tdm_private_client;
typedef struct _tdm_private_client_output {
+ struct list_head link;
+
tdm_private_client *private_client;
char name[TDM_NAME_LEN];
unsigned int req_id;
unsigned int watch_output_changes;
- struct list_head link;
+ tdm_private_client_voutput *voutput;
} tdm_private_client_output;
typedef struct _tdm_private_client_buffer {
struct wl_buffer *wl_buffer;
} tdm_private_client_buffer;
-typedef struct _tdm_private_client_voutput {
- tdm_private_client_output base;
+struct _tdm_private_client_voutput {
+ struct list_head link;
struct wl_tdm_voutput *wl_voutput;
struct list_head commit_handler_list;
- struct
- {
+ struct {
int count;
tdm_client_output_mode *modes;
} available_modes;
struct list_head buffer_list;
tbm_bufmgr bufmgr;
tdm_private_client_buffer *attach_buffer;
-} tdm_private_client_voutput;
+
+ tdm_private_client *private_client;
+ tdm_private_client_output *private_output;
+ char name[TDM_NAME_LEN];
+ int get_output;
+};
struct _tdm_private_client_vblank {
tdm_private_client_output *private_output;
}
LIST_INITHEAD(&private_client->output_list);
+ LIST_INITHEAD(&private_client->voutput_list);
private_client->display = wl_display_connect("tdm-socket");
TDM_GOTO_IF_FAIL(private_client->display != NULL, create_failed);
{
tdm_private_client *private_client = (tdm_private_client*)client;
tdm_private_client_output *o = NULL, *oo = NULL;
+ tdm_private_client_voutput *vo = NULL, *voo = NULL;
if (!private_client)
return;
_tdm_client_output_destroy(o);
}
+ LIST_FOR_EACH_ENTRY_SAFE(vo, voo, &private_client->voutput_list, link) {
+ tdm_client_voutput_destroy(vo);
+ }
+
if (private_client->tdm)
wl_tdm_destroy(private_client->tdm);
if (private_client->registry)
if (!name) {
name = "primary";
- } else if (strncmp(name, "primary", 7) && strncmp(name, "default", 7)) {
- if (error)
- *error = TDM_ERROR_INVALID_PARAMETER;
- pthread_mutex_unlock(&private_client->lock);
- return NULL;
+ } else if (!strncmp(name, "primary", 7) || !strncmp(name, "default", 7)) {
+ TDM_DBG("get primary or default output");
+ } else {
+ tdm_private_client_voutput *private_voutput = NULL;
+ int find = 0;
+
+ LIST_FOR_EACH_ENTRY(private_voutput, &private_client->voutput_list, link) {
+ if (!strncmp(private_voutput->name, name, TDM_NAME_LEN)) {
+ find = 1;
+ break;
+ }
+ }
+ if (!find) {
+ if (error)
+ *error = TDM_ERROR_INVALID_PARAMETER;
+ pthread_mutex_unlock(&private_client->lock);
+ return NULL;
+ }
}
LIST_FOR_EACH_ENTRY(private_output, &private_client->output_list, link) {
{
tdm_private_client_voutput *private_voutput;
tdm_private_client *private_client;
+ tbm_surface_h buffer = NULL;
tdm_client_voutput_commit_handler_info *h = NULL, *hh = NULL;
struct list_head call_list;
private_voutput = (tdm_private_client_voutput *)data;
TDM_RETURN_IF_FAIL(private_voutput != NULL);
+ TDM_RETURN_IF_FAIL(private_voutput->attach_buffer != NULL);
+
+ buffer = (tbm_surface_h)wl_buffer_get_user_data(private_voutput->attach_buffer->wl_buffer);
+ TDM_RETURN_IF_FAIL(buffer != NULL);
- private_client = private_voutput->base.private_client;
+ tbm_surface_internal_ref(buffer);
+
+ private_client = private_voutput->private_client;
LIST_INITHEAD(&call_list);
pthread_mutex_unlock(&private_client->lock);
LIST_FOR_EACH_ENTRY_SAFE(h, hh, &call_list, call_link) {
if (h->func)
- h->func(private_voutput, h->user_data);
+ h->func(private_voutput, buffer, h->user_data);
}
pthread_mutex_lock(&private_client->lock);
+
+ /* if no added commit_handler call commit done immediately */
+ if (LIST_IS_EMPTY(&private_voutput->commit_handler_list))
+ tdm_client_voutput_commit_done(private_voutput);
}
void
LIST_INITHEAD(&private_voutput->commit_handler_list);
LIST_INITHEAD(&private_voutput->buffer_list);
- private_voutput->base.private_client = private_client;
+ private_voutput->private_client = private_client;
+ strncpy(private_voutput->name, name, TDM_NAME_LEN);
- private_voutput->wl_voutput = wl_tdm_create_voutput((struct wl_tdm *)wrapper, private_voutput->base.name);
+ private_voutput->wl_voutput = wl_tdm_create_voutput((struct wl_tdm *)wrapper, name);
wl_proxy_wrapper_destroy(wrapper);
if (!private_voutput->wl_voutput) {
/* LCOV_EXCL_START */
return NULL;
}
+ LIST_ADDTAIL(&private_voutput->link, &private_client->voutput_list);
+
pthread_mutex_unlock(&private_client->lock);
return (tdm_client_voutput *)private_voutput;
free(h);
}
+ if (private_voutput->get_output)
+ _tdm_client_output_destroy(private_voutput->private_output);
+
wl_tdm_voutput_destroy(private_voutput->wl_voutput);
+ LIST_DEL(&private_voutput->link);
+
free(private_voutput);
}
private_voutput = (tdm_private_client_voutput *)voutput;
- if (private_voutput->base.connection == TDM_OUTPUT_CONN_STATUS_CONNECTED)
+ if (private_voutput->private_output->connection == TDM_OUTPUT_CONN_STATUS_CONNECTED)
return TDM_ERROR_BAD_REQUEST;
if (private_voutput->available_modes.modes)
private_voutput = (tdm_private_client_voutput *)voutput;
- if (private_voutput->base.connection == TDM_OUTPUT_CONN_STATUS_CONNECTED)
+ if (private_voutput->private_output->connection == TDM_OUTPUT_CONN_STATUS_CONNECTED)
return TDM_ERROR_BAD_REQUEST;
private_voutput->mmwidth = mmWidth;
TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER);
private_voutput = (tdm_private_client_voutput *)voutput;
- private_client = private_voutput->base.private_client;
+ private_client = private_voutput->private_client;
LIST_FOR_EACH_ENTRY(h, &private_voutput->commit_handler_list, link) {
if (h->func == func && h->user_data == user_data) {
TDM_RETURN_IF_FAIL(func != NULL);
private_voutput = (tdm_private_client_voutput *)voutput;
- private_client = private_voutput->base.private_client;
+ private_client = private_voutput->private_client;
pthread_mutex_lock(&private_client->lock);
tdm_client_voutput_commit_done(tdm_client_voutput *voutput)
{
tdm_private_client_voutput *private_voutput;
+ tbm_surface_h buffer = NULL;
TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
private_voutput = (tdm_private_client_voutput *)voutput;
+ buffer = (tbm_surface_h)wl_buffer_get_user_data(private_voutput->attach_buffer->wl_buffer);
+ tbm_surface_internal_unref(buffer);
private_voutput->attach_buffer = NULL;
wl_tdm_voutput_commit_done(private_voutput->wl_voutput);
tdm_client_voutput_get_client_output(tdm_client_voutput *voutput, tdm_error *error)
{
tdm_private_client_voutput *private_voutput;
+ tdm_private_client_output *private_output = NULL;
+ tdm_error ret = TDM_ERROR_NONE;
if (error)
*error = TDM_ERROR_NONE;
- if (!voutput)
- {
+ if (!voutput) {
TDM_ERR("'!voutput' failed");
if (error)
*error = TDM_ERROR_INVALID_PARAMETER;
private_voutput = (tdm_private_client_voutput *)voutput;
- return &private_voutput->base;
+ if (private_voutput->get_output)
+ return private_voutput->private_output;
+
+ private_output = (tdm_private_client_output *)tdm_client_get_output(private_voutput->private_client, private_voutput->name, &ret);
+ if (!private_output) {
+ TDM_ERR("tdm_client_voutput_get_client_output get private_output fail");
+ if (error)
+ *error = ret;
+ return NULL;
+ }
+ private_output->voutput = private_voutput;
+ private_voutput->private_output = private_output;
+ private_voutput->get_output = 1;
+
+ return private_output;
}
tdm_error
tdm_client_output_connect(tdm_client_output *output)
{
tdm_private_client_output *private_output;
- tdm_private_client_voutput *private_voutput;
+ tdm_private_client_voutput *private_voutput = NULL;
TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
private_output = (tdm_private_client_output *)output;
- private_voutput = (tdm_private_client_voutput *)output;
+ if (!private_output->voutput) return TDM_ERROR_INVALID_PARAMETER;
+ private_voutput = private_output->voutput;
TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_CONNECTED,
TDM_ERROR_BAD_REQUEST);
wl_tdm_voutput_set_physical_size(private_voutput->wl_voutput, private_voutput->mmwidth, private_voutput->mmheight);
+ /* To Do : change voutput to output */
wl_tdm_voutput_connect(private_voutput->wl_voutput);
return TDM_ERROR_NONE;
tdm_error
tdm_client_output_disconnect(tdm_client_output *output)
{
- tdm_private_client_voutput *private_voutput;
tdm_private_client_output *private_output;
+ tdm_private_client_voutput *private_voutput = NULL;
TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
private_output = (tdm_private_client_output *)output;
- private_voutput = (tdm_private_client_voutput *)output;
+ if (!private_output->voutput) return TDM_ERROR_INVALID_PARAMETER;
+ private_voutput = private_output->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;
+ /* To Do : change voutput to output */
wl_tdm_voutput_disconnect(private_voutput->wl_voutput);
return TDM_ERROR_NONE;