From: Junkyeong Kim Date: Thu, 16 Aug 2018 02:52:42 +0000 (+0900) Subject: virtual: client get voutput's output by tdm_client_get_output X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Flibtdm.git;a=commitdiff_plain;h=ca91f10db2ce407718e436839fdf9501197edd15 virtual: client get voutput's output by tdm_client_get_output voutput commit handler has tbm_surface. Change-Id: I4b2a5d8d0a313efd0a0f5050fa84e0413a95b3c3 Signed-off-by: Junkyeong Kim --- diff --git a/client/tdm_client.c b/client/tdm_client.c index 4e9edd4..d94925a 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -59,6 +59,7 @@ #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; @@ -68,6 +69,7 @@ typedef struct _tdm_private_client { 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; @@ -76,6 +78,8 @@ typedef struct _tdm_private_client { } tdm_private_client; typedef struct _tdm_private_client_output { + struct list_head link; + tdm_private_client *private_client; char name[TDM_NAME_LEN]; @@ -91,7 +95,7 @@ typedef struct _tdm_private_client_output { 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 { @@ -99,13 +103,12 @@ 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; @@ -118,7 +121,12 @@ typedef struct _tdm_private_client_voutput { 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; @@ -488,6 +496,7 @@ tdm_client_create(tdm_error *error) } 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); @@ -524,6 +533,7 @@ tdm_client_destroy(tdm_client *client) { 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; @@ -540,6 +550,10 @@ tdm_client_destroy(tdm_client *client) _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) @@ -814,11 +828,24 @@ tdm_client_get_output(tdm_client *client, char *name, tdm_error *error) 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) { @@ -1876,13 +1903,20 @@ tdm_client_voutput_cb_commit(void *data, struct wl_tdm_voutput *wl_voutput) { 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); @@ -1893,9 +1927,13 @@ tdm_client_voutput_cb_commit(void *data, struct wl_tdm_voutput *wl_voutput) 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 @@ -1998,9 +2036,10 @@ tdm_client_create_voutput(tdm_client *client, const char *name, tdm_error *error 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 */ @@ -2038,6 +2077,8 @@ tdm_client_create_voutput(tdm_client *client, const char *name, tdm_error *error return NULL; } + LIST_ADDTAIL(&private_voutput->link, &private_client->voutput_list); + pthread_mutex_unlock(&private_client->lock); return (tdm_client_voutput *)private_voutput; @@ -2084,8 +2125,13 @@ tdm_client_voutput_destroy(tdm_client_voutput *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); } @@ -2101,7 +2147,7 @@ tdm_client_voutput_set_available_modes(tdm_client_voutput *voutput, const tdm_cl 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) @@ -2129,7 +2175,7 @@ tdm_client_voutput_set_physical_size(tdm_client_voutput *voutput, unsigned int m 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; @@ -2151,7 +2197,7 @@ tdm_client_voutput_add_commit_handler(tdm_client_voutput *voutput, 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) { @@ -2195,7 +2241,7 @@ tdm_client_voutput_remove_commit_handler(tdm_client_voutput *voutput, 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); @@ -2216,10 +2262,13 @@ tdm_error 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); @@ -2230,12 +2279,13 @@ tdm_client_output * 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; @@ -2244,7 +2294,21 @@ tdm_client_voutput_get_client_output(tdm_client_voutput *voutput, tdm_error *err 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 @@ -2289,12 +2353,13 @@ 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); @@ -2305,6 +2370,7 @@ tdm_client_output_connect(tdm_client_output *output) 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; @@ -2313,19 +2379,21 @@ tdm_client_output_connect(tdm_client_output *output) 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; diff --git a/client/tdm_client.h b/client/tdm_client.h index f431f1c..8c10ebe 100644 --- a/client/tdm_client.h +++ b/client/tdm_client.h @@ -429,9 +429,8 @@ tdm_client_vblank_wait_seq(tdm_client_vblank *vblank, unsigned int sequence, tdm unsigned int tdm_client_vblank_is_waiting(tdm_client_vblank *vblank); -/* Virtual Output */ -#include +/* Virtual Output */ tdm_client_voutput * tdm_client_create_voutput(tdm_client *client, const char *name, tdm_error *error); diff --git a/client/tdm_client_types.h b/client/tdm_client_types.h index 096b44f..569cd1d 100644 --- a/client/tdm_client_types.h +++ b/client/tdm_client_types.h @@ -38,6 +38,8 @@ #include "tdm_common.h" +#include + #ifdef __cplusplus extern "C" { #endif @@ -124,6 +126,7 @@ typedef struct _tdm_client_output_mode { typedef void tdm_client_voutput; typedef void (*tdm_client_voutput_commit_handler)(tdm_client_voutput *voutput, + tbm_surface_h buffer, void *user_data); /* End of Virtual Output */ #ifdef __cplusplus diff --git a/haltests/src/tc_tdm_client.cpp b/haltests/src/tc_tdm_client.cpp index 3d4aa47..01668cb 100644 --- a/haltests/src/tc_tdm_client.cpp +++ b/haltests/src/tc_tdm_client.cpp @@ -1584,7 +1584,7 @@ TEST_F(TDMVirtualOutput, FailTestSetPhysicalSize) } static void -_tc_tdm_client_voutput_commit_handler(tdm_client_voutput *voutput, void *user_data) +_tc_tdm_client_voutput_commit_handler(tdm_client_voutput *voutput, tbm_surface_h buffer, void *user_data) { int *flag; flag = (int *)user_data;