virtual: add attach_buffer protocol 21/186321/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 9 Aug 2018 02:22:07 +0000 (11:22 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 9 Aug 2018 02:22:07 +0000 (11:22 +0900)
Change-Id: I2af7410283e8f9d9e102294f368ed4d04a9cd0e4

client/tdm_client.c
protocol/tdm.xml
src/tdm_server.c

index 32bdb52..4e9edd4 100644 (file)
@@ -117,7 +117,7 @@ typedef struct _tdm_private_client_voutput {
 
        struct list_head buffer_list;
        tbm_bufmgr bufmgr;
-       tdm_private_client_buffer *commit_buffer;
+       tdm_private_client_buffer *attach_buffer;
 } tdm_private_client_voutput;
 
 struct _tdm_private_client_vblank {
@@ -1852,6 +1852,26 @@ tdm_client_voutput_cb_buffer_destroy(void *data,
 }
 
 void
+tdm_client_voutput_cb_attach_buffer(void *data,
+               struct wl_tdm_voutput *wl_voutput,
+               struct wl_buffer *wl_buffer)
+{
+       tdm_private_client_voutput *private_voutput = (tdm_private_client_voutput *)data;
+       tdm_private_client_buffer *cb = NULL, *cbb = NULL;
+
+       TDM_RETURN_IF_FAIL(private_voutput != NULL);
+
+       LIST_FOR_EACH_ENTRY_SAFE(cb, cbb, &private_voutput->buffer_list, link) {
+               if (wl_buffer == cb->wl_buffer) {
+                       private_voutput->attach_buffer = cb;
+                       break;
+               }
+       }
+
+       return;
+}
+
+void
 tdm_client_voutput_cb_commit(void *data, struct wl_tdm_voutput *wl_voutput)
 {
        tdm_private_client_voutput *private_voutput;
@@ -1890,6 +1910,7 @@ static const struct wl_tdm_voutput_listener tdm_client_voutput_lisntener = {
        tdm_client_voutput_cb_buffer_import_with_id,
        tdm_client_voutput_cb_buffer_import_with_fd,
        tdm_client_voutput_cb_buffer_destroy,
+       tdm_client_voutput_cb_attach_buffer,
        tdm_client_voutput_cb_commit,
        tdm_client_voutput_cb_ack_message
 };
@@ -2199,6 +2220,7 @@ tdm_client_voutput_commit_done(tdm_client_voutput *voutput)
        TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
 
        private_voutput = (tdm_private_client_voutput *)voutput;
+       private_voutput->attach_buffer = NULL;
        wl_tdm_voutput_commit_done(private_voutput->wl_voutput);
 
        return TDM_ERROR_NONE;
index 20ba4cd..a152c95 100644 (file)
             <arg name="buffer" type="object" interface="wl_buffer"/>
         </event>
 
+        <event name="attach_buffer">
+            <arg name="buffer" type="object" interface="wl_buffer"/>
+        </event>
+
         <event name="commit"/>
         <event name="ack_message">
             <arg name="msg" type="uint" enum="message" summary=""/>
index e301ab3..aa546e6 100644 (file)
@@ -71,7 +71,7 @@ typedef struct _tdm_server_output_info {
 typedef struct _tdm_server_voutput_buffer {
        struct list_head link;
        struct wl_resource *wl_buffer;
-       tbm_surface_h surface;
+       tbm_surface_h buffer;
 } tdm_server_voutput_buffer;
 
 typedef struct _tdm_server_voutput_info {
@@ -93,6 +93,7 @@ typedef struct _tdm_server_voutput_info {
 
        struct list_head buffer_list;
        tdm_server_voutput_buffer *attach_buffer;
+       int committing;
 } tdm_server_voutput_info;
 
 typedef struct _tdm_server_vblank_info {
@@ -813,6 +814,9 @@ _tdm_voutput_cb_commit_done(struct wl_client *client, struct wl_resource *resour
                // handle error
                return;
        }
+//     tdm_output_commit_done(voutput_info->output, voutput_info->attach_buffer->buffer);
+       voutput_info->committing = 0;
+       voutput_info->attach_buffer = NULL;
 }
 
 static const struct wl_tdm_voutput_interface tdm_voutput_implementation = {
@@ -845,7 +849,7 @@ _tdm_voutput_buffer_destory(struct wl_resource *wl_buffer)
 
        LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) {
                if (vb->wl_buffer == wl_buffer) {
-                       tbm_surface_internal_unref(vb->surface);
+                       tbm_surface_internal_unref(vb->buffer);
                        wl_resource_set_user_data(wl_buffer, NULL);
                        free(vb);
                }
@@ -873,7 +877,7 @@ _tdm_voutput_create_wl_buffer(tdm_server_voutput_info *voutput_info)
 
 struct wl_resource *
 _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info,
-                                                  tbm_surface_h surface)
+                                                  tbm_surface_h buffer)
 {
        int bufs[TBM_SURF_PLANE_MAX] = { -1, -1, -1, -1};
        struct wl_resource *wl_buffer = NULL;
@@ -884,9 +888,9 @@ _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info,
        int *p;
 
        TDM_RETURN_VAL_IF_FAIL(voutput_info != NULL, NULL);
-       TDM_RETURN_VAL_IF_FAIL(surface != NULL, NULL);
+       TDM_RETURN_VAL_IF_FAIL(buffer != NULL, NULL);
 
-       if (tbm_surface_get_info(surface, &info) != TBM_SURFACE_ERROR_NONE) {
+       if (tbm_surface_get_info(buffer, &info) != TBM_SURFACE_ERROR_NONE) {
                TDM_ERR("Failed to create buffer from surface");
                return NULL;
        }
@@ -896,14 +900,14 @@ _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info,
                return NULL;
        }
 
-       num_buf = tbm_surface_internal_get_num_bos(surface);
+       num_buf = tbm_surface_internal_get_num_bos(buffer);
        if (num_buf == 0) {
                TDM_ERR("surface doesn't have any bo.");
                return NULL;
        }
 
        for (i = 0; i < num_buf; i++) {
-               tbm_bo bo = tbm_surface_internal_get_bo(surface, i);
+               tbm_bo bo = tbm_surface_internal_get_bo(buffer, i);
                if (bo == NULL) {
                        TDM_ERR("Failed to get bo from surface");
                        goto err;
@@ -944,7 +948,7 @@ _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info,
 
        for (i = 0; i < 3; i++) {
                p = wl_array_add(&plane_buf_idx, sizeof(int));
-               *p = tbm_surface_internal_get_plane_bo_idx(surface, i);
+               *p = tbm_surface_internal_get_plane_bo_idx(buffer, i);
                p = wl_array_add(&plane_offset, sizeof(int));
                *p = info.planes[i].offset;
                p = wl_array_add(&plane_stride, sizeof(int));
@@ -991,47 +995,47 @@ err:
 }
 
 tdm_server_voutput_buffer *
-_tdm_output_get_voutput_buffer(tdm_server_voutput_info *voutput_info, tbm_surface_h surface)
+_tdm_output_get_voutput_buffer(tdm_server_voutput_info *voutput_info, tbm_surface_h buffer)
 {
        tdm_server_voutput_buffer *voutput_buffer = NULL, *vb = NULL;
 
        LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) {
-               if (vb && vb->surface == surface)
+               if (vb && vb->buffer == buffer)
                        return vb;
        }
 
-       tbm_surface_internal_ref(surface);
+       tbm_surface_internal_ref(buffer);
        voutput_buffer = calloc(1, sizeof *voutput_buffer);
        if (!voutput_buffer) {
                /* LCOV_EXCL_START */
 
                TDM_ERR("fail calloc");
-               tbm_surface_internal_unref(surface);
+               tbm_surface_internal_unref(buffer);
                return NULL;
 
                /* LCOV_EXCL_STOP */
        }
 
-       voutput_buffer->wl_buffer = _tdm_voutput_export_buffer(voutput_info, surface);
+       voutput_buffer->wl_buffer = _tdm_voutput_export_buffer(voutput_info, buffer);
        if (!voutput_buffer->wl_buffer) {
                /* LCOV_EXCL_START */
 
                TDM_ERR("fail export buffer");
                free(voutput_buffer);
-               tbm_surface_internal_unref(surface);
+               tbm_surface_internal_unref(buffer);
                return NULL;
 
                /* LCOV_EXCL_STOP */
        }
 
-       voutput_buffer->surface = surface;
+       voutput_buffer->buffer = buffer;
        LIST_ADDTAIL(&voutput_info->link, &voutput_info->buffer_list);
 
        return voutput_buffer;
 }
 
 INTERN tdm_error
-tdm_output_send_buffer(tdm_output *output, tbm_surface_h surface)
+tdm_output_send_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;
@@ -1046,16 +1050,19 @@ tdm_output_send_buffer(tdm_output *output, tbm_surface_h surface)
                }
        }
        TDM_RETURN_VAL_IF_FAIL(voutput_info != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(voutput_info->attach_buffer == NULL, TDM_ERROR_OPERATION_FAILED);
 
-       voutput_buffer = _tdm_output_get_voutput_buffer(voutput_info, surface);
+       voutput_buffer = _tdm_output_get_voutput_buffer(voutput_info, buffer);
        TDM_RETURN_VAL_IF_FAIL(voutput_buffer != NULL, TDM_ERROR_OUT_OF_MEMORY);
 
        voutput_info->attach_buffer = voutput_buffer;
 
+       wl_tdm_voutput_send_attach_buffer(voutput_info->resource, voutput_buffer->wl_buffer);
+
        return TDM_ERROR_NONE;
 }
 
-tdm_error
+INTERN tdm_error
 tdm_output_commit_buffer(tdm_output *output)
 {
        tdm_private_server *private_server = keep_private_server;
@@ -1070,7 +1077,10 @@ tdm_output_commit_buffer(tdm_output *output)
                }
        }
        TDM_RETURN_VAL_IF_FAIL(voutput_info != NULL, TDM_ERROR_INVALID_PARAMETER);
-       TDM_RETURN_VAL_IF_FAIL(voutput_info->attach_buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
+       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);
+
+       voutput_info->committing = 1;
 
        wl_tdm_voutput_send_commit(voutput_info->resource);