virtual: client get voutput's output by tdm_client_get_output 46/186846/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 16 Aug 2018 02:52:42 +0000 (11:52 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 16 Aug 2018 02:52:45 +0000 (11:52 +0900)
voutput commit handler has tbm_surface.

Change-Id: I4b2a5d8d0a313efd0a0f5050fa84e0413a95b3c3
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
client/tdm_client.c
client/tdm_client.h
client/tdm_client_types.h
haltests/src/tc_tdm_client.cpp

index 4e9edd4..d94925a 100644 (file)
@@ -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;
index f431f1c..8c10ebe 100644 (file)
@@ -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 <tbm_surface.h>
 
+/* Virtual Output */
 tdm_client_voutput *
 tdm_client_create_voutput(tdm_client *client, const char *name, tdm_error *error);
 
index 096b44f..569cd1d 100644 (file)
@@ -38,6 +38,8 @@
 
 #include "tdm_common.h"
 
+#include <tbm_surface.h>
+
 #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
index 3d4aa47..01668cb 100644 (file)
@@ -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;