add buffer_usable protocol 74/168974/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 29 Jan 2018 08:29:07 +0000 (17:29 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 29 Jan 2018 08:29:25 +0000 (17:29 +0900)
Change-Id: I2569bcc3decb815526fb6ae6a2dca87bb9175947

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

index 16f767f..123770b 100644 (file)
 
     <event name="flush"/>
 
+    <event name="buffer_usable">
+      <arg name="id" type="object" interface="wl_buffer"/>
+    </event>
+
     <request name="destroy" type="destructor">
     </request>
 
index ad8e586..504327f 100644 (file)
@@ -62,6 +62,7 @@ struct wayland_tbm_buffer {
        uint32_t flags;
        int allocated;
        int reuse;
+       int usable;
 
        struct wl_tbm_queue *wl_tbm_queue;
        struct wl_list link;
@@ -963,7 +964,7 @@ __wayland_tbm_client_surface_alloc_cb(tbm_surface_queue_h surface_queue, void *d
 
        if (queue_info->is_active && queue_info->active_flush) {
                wl_list_for_each_reverse(buffer, &queue_info->attach_bufs, link) {
-                       if (!buffer->allocated) {
+                       if (!buffer->allocated && buffer->usable) {
                                if (_wayland_tbm_client_is_valid_attach_bufs(queue_info, buffer)) {
                                        surface = buffer->tbm_surface;
                                        /* ref.. pair of __wayland_tbm_client_surface_free_cb */
@@ -1149,11 +1150,36 @@ handle_tbm_queue_flush(void *data,
        tbm_surface_queue_flush(queue_info->tbm_queue);
 }
 
+static void
+handle_tbm_queue_buffer_usable(void *data,
+                                       struct wl_tbm_queue *wl_tbm_queue,
+                                       struct wl_buffer *wl_buffer)
+{
+       struct wayland_tbm_surface_queue *queue_info =
+                               (struct wayland_tbm_surface_queue *)data;
+       struct wayland_tbm_buffer *buffer;
+
+       WL_TBM_RETURN_IF_FAIL(wl_buffer != NULL);
+
+       wl_list_for_each(buffer, &queue_info->attach_bufs, link) {
+               if (buffer->wl_buffer == wl_buffer)
+                       buffer->usable = 1;
+       }
+
+#ifdef DEBUG_TRACE
+       WL_TBM_TRACE("pid:%d wl_buffer:%p tbm_surface:%p",
+                       getpid(), buffer->wl_buffer, buffer->tbm_surface);
+#endif
+
+       return;
+}
+
 const struct wl_tbm_queue_listener wl_tbm_queue_listener = {
        handle_tbm_queue_buffer_attached,
        handle_tbm_queue_active,
        handle_tbm_queue_deactive,
-       handle_tbm_queue_flush
+       handle_tbm_queue_flush,
+       handle_tbm_queue_buffer_usable,
 };
 
 static struct wayland_tbm_surface_queue *
@@ -1405,4 +1431,3 @@ wayland_tbm_client_queue_check_activate(struct wayland_tbm_client *tbm_client, t
 
        return 0;
 }
-
index c6e9461..a338e1b 100644 (file)
@@ -1000,6 +1000,18 @@ wayland_tbm_server_client_queue_set_dequeue_cb(struct wayland_tbm_client_queue *
        return 1;
 }
 
+int
+wayland_tbm_server_client_queue_send_buffer_usable(struct wayland_tbm_client_queue *cqueue,
+                               struct wl_resource *wl_buffer)
+{
+       WL_TBM_RETURN_VAL_IF_FAIL(cqueue != NULL, 0);
+       WL_TBM_RETURN_VAL_IF_FAIL(wl_buffer != NULL, 0);
+
+       wl_tbm_queue_send_buffer_usable(cqueue->wl_tbm_queue, wl_buffer);
+
+       return 1;
+}
+
 struct wl_resource *
 wayland_tbm_server_client_queue_export_buffer2(
                                struct wayland_tbm_client_queue *cqueue,
index 09a1736..f89e232 100644 (file)
@@ -122,6 +122,10 @@ int
 wayland_tbm_server_send_destroy_buffer(struct wl_resource *wl_tbm,
                               struct wl_resource *wl_buffer);
 
+int
+wayland_tbm_server_client_queue_send_buffer_usable(struct wayland_tbm_client_queue *cqueue,
+                              struct wl_resource *wl_buffer);
+
 #ifdef  __cplusplus
 }
 #endif