added dequeue buffer protocol 55/117355/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Sun, 5 Mar 2017 11:12:08 +0000 (20:12 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Sun, 5 Mar 2017 11:12:08 +0000 (20:12 +0900)
- added function wayland_tbm_server_client_queue_set_dequeue_cb
- flush wl_client when send activate/deactivate event

Change-Id: I00ac82ece1402cbbeb2e060f0dc1581303f11ca8

protocol/wayland-tbm.xml
src/wayland-tbm-client.c
src/wayland-tbm-server.c
src/wayland-tbm-server.h

index 14c3c66..d572946 100644 (file)
     <request name="detach_buffer">
       <arg name="buffer" type="object" interface="wl_buffer"/>
     </request>
+
+    <request name="dequeue_buffer">
+      <arg name="buffer" type="object" interface="wl_buffer"/>
+    </request>
   </interface>
 
   <interface name="wl_tbm_monitor" version="1">
index 5d8ded8..3f36186 100644 (file)
@@ -1064,6 +1064,29 @@ _handle_tbm_surface_queue_can_dequeue_notify(tbm_surface_queue_h surface_queue,
        }
 }
 
+static void
+_handle_tbm_surface_queue_trace_notify(tbm_surface_queue_h surface_queue,
+               tbm_surface_h tbm_surface, tbm_surface_queue_trace trace, void *data)
+{
+       struct wayland_tbm_surface_queue *queue_info = data;
+       struct wl_buffer *wl_buffer = NULL;
+       struct wayland_tbm_buffer *buffer = NULL;
+
+       WL_TBM_RETURN_IF_FAIL(queue_info != NULL);
+
+       if (trace != TBM_SURFACE_QUEUE_TRACE_DEQUEUE) return;
+       if (!queue_info->is_active) return;
+
+       wl_list_for_each(buffer, &queue_info->attach_bufs, link) {
+               if (buffer->tbm_surface == tbm_surface)
+                       wl_buffer = buffer->wl_buffer;
+       }
+
+       if (!wl_buffer) return;
+
+       wl_tbm_queue_dequeue_buffer(queue_info->wl_tbm_queue, wl_buffer);
+}
+
 tbm_surface_queue_h
 wayland_tbm_client_create_surface_queue(struct wayland_tbm_client *tbm_client,
                                        struct wl_surface *surface,
@@ -1120,6 +1143,9 @@ wayland_tbm_client_create_surface_queue(struct wayland_tbm_client *tbm_client,
        tbm_surface_queue_add_can_dequeue_cb(queue_info->tbm_queue,
                                        _handle_tbm_surface_queue_can_dequeue_notify, queue_info);
 
+       tbm_surface_queue_add_trace_cb(queue_info->tbm_queue,
+                                       _handle_tbm_surface_queue_trace_notify, queue_info);
+
 #ifdef DEBUG_TRACE
        WL_TBM_C_LOG("INFO cur(%dx%d fmt:0x%x num:%d) new(%dx%d fmt:0x%x num:%d)\n",
                queue_info->width, queue_info->height,
index 97a3682..fa89f3f 100644 (file)
@@ -104,6 +104,9 @@ struct wayland_tbm_client_queue {
        struct wl_resource *wl_surface;
        pid_t pid;
 
+       wayland_tbm_server_client_queue_dequeue_cb dequeue_cb;
+       void *dequeue_cb_data;;
+
        struct wl_list link;
 };
 
@@ -470,9 +473,35 @@ _wayland_tbm_server_queue_impl_detach_buffer(struct wl_client *client,
 #endif
 }
 
+static void
+_wayland_tbm_server_queue_impl_dequeue_buffer(struct wl_client *client,
+                                     struct wl_resource *wl_tbm_queue,
+                                     struct wl_resource *wl_buffer)
+{
+       struct wayland_tbm_client_queue *cqueue = NULL;
+       struct wayland_tbm_buffer *tbm_buffer = NULL;
+
+#ifdef DEBUG_TRACE
+       pid_t pid;
+
+       wl_client_get_credentials(client, &pid, NULL, NULL);
+       WL_TBM_TRACE("dequeue buffer. pid:%d\n", pid);
+#endif
+
+       cqueue = wl_resource_get_user_data(wl_tbm_queue);
+       WL_TBM_RETURN_IF_FAIL(cqueue);
+
+       tbm_buffer = wl_resource_get_user_data(wl_buffer);
+       WL_TBM_RETURN_IF_FAIL(tbm_buffer);
+
+       if (cqueue->dequeue_cb)
+               cqueue->dequeue_cb(cqueue, tbm_buffer->surface, cqueue->dequeue_cb_data);
+}
+
 static const struct wl_tbm_queue_interface _wayland_tbm_queue_impementation = {
        _wayland_tbm_server_queue_impl_destroy,
        _wayland_tbm_server_queue_impl_detach_buffer,
+       _wayland_tbm_server_queue_impl_dequeue_buffer,
 };
 
 static void
@@ -1149,6 +1178,8 @@ void
 wayland_tbm_server_client_queue_activate(struct wayland_tbm_client_queue *cqueue,
                        uint32_t usage, uint32_t queue_size, uint32_t need_flush)
 {
+       struct wl_client *wl_client = NULL;
+
        WL_TBM_RETURN_IF_FAIL(cqueue != NULL);
        WL_TBM_RETURN_IF_FAIL(cqueue->wl_tbm_queue != NULL);
 
@@ -1158,11 +1189,17 @@ wayland_tbm_server_client_queue_activate(struct wayland_tbm_client_queue *cqueue
        WL_TBM_LOG("send active queue pid:%d\n", cqueue->pid);
 
        wl_tbm_queue_send_active(cqueue->wl_tbm_queue, usage, queue_size, 1);
+
+       wl_client = wl_resource_get_client(cqueue->wl_tbm_queue);
+       if (wl_client)
+               wl_client_flush(wl_client);
 }
 
 void
 wayland_tbm_server_client_queue_deactivate(struct wayland_tbm_client_queue *cqueue)
 {
+       struct wl_client *wl_client = NULL;
+
        WL_TBM_RETURN_IF_FAIL(cqueue != NULL);
        WL_TBM_RETURN_IF_FAIL(cqueue->wl_tbm_queue != NULL);
 
@@ -1172,6 +1209,26 @@ wayland_tbm_server_client_queue_deactivate(struct wayland_tbm_client_queue *cque
        WL_TBM_LOG("send deactive queue pid:%d", cqueue->pid);
 
        wl_tbm_queue_send_deactive(cqueue->wl_tbm_queue);
+
+       wl_client = wl_resource_get_client(cqueue->wl_tbm_queue);
+       if (wl_client)
+               wl_client_flush(wl_client);
+}
+
+int
+wayland_tbm_server_client_queue_set_dequeue_cb(struct wayland_tbm_client_queue *cqueue,
+                                       wayland_tbm_server_client_queue_dequeue_cb dequeue_cb, void *user_data)
+{
+       WL_TBM_RETURN_VAL_IF_FAIL(cqueue != NULL, 0);
+       WL_TBM_RETURN_VAL_IF_FAIL(cqueue->wl_tbm_queue != NULL, 0);
+
+#ifdef DEBUG_TRACE
+       WL_TBM_TRACE("    pid:%d\n", cqueue->pid);
+#endif
+       cqueue->dequeue_cb = dequeue_cb;
+       cqueue->dequeue_cb_data = user_data;
+
+       return 1;
 }
 
 struct wl_resource *
index d3a66d0..1938a5d 100644 (file)
@@ -43,6 +43,9 @@ struct wayland_tbm_client_queue;
 
 typedef void (*wayland_tbm_server_surface_destroy_cb) (tbm_surface_h surface, void *data);
 
+typedef void (*wayland_tbm_server_client_queue_dequeue_cb) (struct wayland_tbm_client_queue *cqueue,
+                                       tbm_surface_h surface, void *data);
+
 struct wayland_tbm_server *
 wayland_tbm_server_init(struct wl_display *display,
                        const char *device_name,
@@ -84,6 +87,10 @@ wayland_tbm_server_client_queue_activate(struct wayland_tbm_client_queue *client
 void
 wayland_tbm_server_client_queue_deactivate(struct wayland_tbm_client_queue *client_queue);
 
+int
+wayland_tbm_server_client_queue_set_dequeue_cb(struct wayland_tbm_client_queue *client_queue,
+                                       wayland_tbm_server_client_queue_dequeue_cb dequeue_cb, void *user_data);
+
 struct wl_resource *
 wayland_tbm_server_client_queue_export_buffer(struct wayland_tbm_client_queue *client_queue,
                        tbm_surface_h surface, uint32_t flags, wayland_tbm_server_surface_destroy_cb destroy_cb,