added buffer_destroy event and api 56/154456/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 24 Aug 2017 05:04:44 +0000 (14:04 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 10 Oct 2017 11:06:51 +0000 (20:06 +0900)
Change-Id: Ia40e90e201ab157243d74a548efe883533fc33e0

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

index ab3fa3e..16f767f 100644 (file)
     <request name="destroy" type="destructor">
     </request>
 
+    <event name="destroy_buffer">
+      <arg name="buffer" type="object" interface="wl_buffer"/>
+    </event>
+
   </interface>
 
   <interface name="wl_tbm_queue" version="1">
index 5e6f49f..5f33885 100644 (file)
@@ -99,6 +99,10 @@ static struct wl_tbm_monitor *tbm_monitor;
 #define WL_TBM_TRACE(fmt, ...)
 #endif
 
+struct wayland_tbm_buffer *
+_wayland_tbm_client_find_tbm_buffer_wl_buffer(struct wayland_tbm_client *tbm_client,
+                               struct wl_buffer *wl_buffer);
+
 static tbm_surface_h
 _wayland_tbm_client_create_surface_from_param(tbm_bufmgr bufmgr,
                         int is_fd,
@@ -215,9 +219,37 @@ fail:
                wl_buffer_destroy(wl_buffer);
 }
 
+static void
+handle_buffer_destroy(void *data,
+               struct wl_tbm *wl_tbm,
+               struct wl_buffer *wl_buffer)
+{
+       struct wayland_tbm_client *tbm_client = (struct wayland_tbm_client *)data;
+       tbm_surface_h tbm_surface;
+       struct wayland_tbm_buffer *buffer = NULL;
+
+#ifdef DEBUG_TRACE
+       WL_TBM_TRACE("       pid:%d wl_buffer:%p", getpid(), wl_buffer);
+#endif
+
+       buffer = _wayland_tbm_client_find_tbm_buffer_wl_buffer(tbm_client, wl_buffer);
+       if (buffer)
+               buffer->wl_buffer = NULL;
+
+       tbm_surface = wl_buffer_get_user_data(wl_buffer);
+       if (tbm_surface)
+               tbm_surface_internal_unref(tbm_surface);
+
+       wl_buffer_set_user_data(wl_buffer, NULL);
+       wl_buffer_destroy(wl_buffer);
+
+       return;
+}
+
 static const struct wl_tbm_listener wl_tbm_client_listener = {
        handle_tbm_buffer_import_with_id,
-       handle_tbm_buffer_import_with_fd
+       handle_tbm_buffer_import_with_fd,
+       handle_buffer_destroy,
 };
 
 void _waylend_tbm_monitor_client_print_show_to_file(char* show_str)
@@ -530,7 +562,6 @@ wayland_tbm_client_deinit(struct wayland_tbm_client *tbm_client)
        free(tbm_client);
 }
 
-
 struct wayland_tbm_buffer *
 _wayland_tbm_client_find_tbm_buffer_wl_buffer(struct wayland_tbm_client *tbm_client,
                                struct wl_buffer *wl_buffer)
index 776feba..c6e9461 100644 (file)
@@ -1175,3 +1175,15 @@ wayland_tbm_server_buffer_get_buffer_transform(struct wayland_tbm_server *tbm_sr
 
        return 0;
 }
+
+int
+wayland_tbm_server_send_destroy_buffer(struct wl_resource *wl_tbm,
+                              struct wl_resource *wl_buffer)
+{
+       WL_TBM_RETURN_VAL_IF_FAIL(wl_buffer != NULL, 0);
+       WL_TBM_RETURN_VAL_IF_FAIL(wl_tbm != NULL, 0);
+
+       wl_tbm_send_destroy_buffer(wl_tbm, wl_buffer);
+
+       return 1;
+}
\ No newline at end of file
index 571a66a..09a1736 100644 (file)
@@ -118,6 +118,10 @@ int
 wayland_tbm_server_buffer_get_buffer_transform(struct wayland_tbm_server *tbm_srv,
                               struct wl_resource *wl_buffer);
 
+int
+wayland_tbm_server_send_destroy_buffer(struct wl_resource *wl_tbm,
+                              struct wl_resource *wl_buffer);
+
 #ifdef  __cplusplus
 }
 #endif