use tdm_buffer instead of tbm_surface for backend 63/54063/1 accepted/tizen/mobile/20151212.071108 accepted/tizen/tv/20151212.072607 accepted/tizen/wearable/20151212.073206 submit/tizen/20151211.073807
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 11 Dec 2015 05:27:00 +0000 (14:27 +0900)
committerBoram Park <boram1288.park@samsung.com>
Fri, 11 Dec 2015 06:48:46 +0000 (15:48 +0900)
  - add tdm buffer destroy handler

Change-Id: I6edf927ded6c7e07cfcf396f279c5ab8fc49e4de
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
include/tdm_backend.h
src/tdm_buffer.c
src/tdm_capture.c
src/tdm_display.c
src/tdm_private.h

index bd4e9d7..81eb89c 100644 (file)
@@ -147,7 +147,7 @@ typedef struct _tdm_func_display
     tdm_error    (*layer_get_property)(tdm_layer *layer, unsigned int id, tdm_value *value);
     tdm_error    (*layer_set_info)(tdm_layer *layer, tdm_info_layer *info);
     tdm_error    (*layer_get_info)(tdm_layer *layer, tdm_info_layer *info);
-    tdm_error    (*layer_set_buffer)(tdm_layer *layer, tbm_surface_h buffer);
+    tdm_error    (*layer_set_buffer)(tdm_layer *layer, tdm_buffer *buffer);
     tdm_error    (*layer_unset_buffer)(tdm_layer *layer);
     tdm_capture *(*layer_create_capture)(tdm_layer *layer, tdm_error *error);
 } tdm_func_display;
@@ -163,13 +163,13 @@ typedef struct _tdm_func_pp
     tdm_error    (*pp_set_done_handler)(tdm_pp *pp, tdm_pp_done_handler func, void *user_data);
 } tdm_func_pp;
 
-typedef void (*tdm_capture_done_handler)(tdm_capture *capture, tbm_surface_h buffer, void *user_data);
+typedef void (*tdm_capture_done_handler)(tdm_capture *capture, tdm_buffer *buffer, void *user_data);
 
 typedef struct _tdm_func_capture
 {
     void         (*capture_destroy)(tdm_capture *capture); /* init */
     tdm_error    (*capture_set_info)(tdm_capture *capture, tdm_info_capture *info);
-    tdm_error    (*capture_attach)(tdm_capture *capture, tbm_surface_h buffer);
+    tdm_error    (*capture_attach)(tdm_capture *capture, tdm_buffer *buffer);
     tdm_error    (*capture_commit)(tdm_capture *capture); /* init */
     tdm_error    (*capture_set_done_handler)(tdm_capture *capture, tdm_capture_done_handler func, void *user_data);
 } tdm_func_capture;
@@ -198,6 +198,16 @@ tdm_error tdm_backend_register_func_display(tdm_display *dpy, tdm_func_display *
 tdm_error tdm_backend_register_func_pp(tdm_display *dpy, tdm_func_pp *func_pp);
 tdm_error tdm_backend_register_func_capture(tdm_display *dpy, tdm_func_capture *func_capture);
 
+typedef void (*tdm_buffer_destroy_handler)(tdm_buffer *buffer, void *user_data);
+
+tdm_buffer*   tdm_buffer_ref_backend(tdm_buffer *buffer);
+void          tdm_buffer_unref_backend(tdm_buffer *buffer);
+tbm_surface_h tdm_buffer_get_surface(tdm_buffer *buffer);
+tdm_buffer*   tdm_buffer_get(tbm_surface_h buffer);
+tdm_error     tdm_buffer_add_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data);
+void          tdm_buffer_remove_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data);
+
+
 #ifdef __cplusplus
 }
 #endif
index 31b0d88..508b9bd 100644 (file)
@@ -43,7 +43,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 typedef struct _tdm_buffer_func_info
 {
-    tdm_buffer_release_handler func;
+    tdm_buffer_release_handler release_func;
+    tdm_buffer_destroy_handler destroy_func;
     void *user_data;
 
     struct list_head link;
@@ -60,6 +61,7 @@ typedef struct _tdm_buffer_info
     int backend_ref_count;
 
     struct list_head release_funcs;
+    struct list_head destroy_funcs;
     struct list_head link;
 } tdm_buffer_info;
 
@@ -80,6 +82,15 @@ _tdm_buffer_destroy(tdm_buffer_info *buf_info)
         free(func_info);
     }
 
+    LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->destroy_funcs, link)
+        func_info->destroy_func(buf_info, func_info->user_data);
+
+    LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->destroy_funcs, link)
+    {
+        LIST_DEL(&func_info->link);
+        free(func_info);
+    }
+
     LIST_DEL(&buf_info->link);
 
     tbm_surface_internal_unref(buf_info->buffer);
@@ -124,6 +135,7 @@ tdm_buffer_create(tbm_surface_h buffer, tdm_error *error)
     buf_info->buffer = buffer;
 
     LIST_INITHEAD(&buf_info->release_funcs);
+    LIST_INITHEAD(&buf_info->destroy_funcs);
     LIST_ADDTAIL(&buf_info->link, &buffer_list);
 
     if (error)
@@ -189,7 +201,7 @@ tdm_buffer_add_release_handler(tdm_buffer *buffer,
     func_info = calloc(1, sizeof(tdm_buffer_func_info));
     TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY);
 
-    func_info->func = func;
+    func_info->release_func = func;
     func_info->user_data = user_data;
 
     buf_info = buffer;
@@ -210,7 +222,7 @@ tdm_buffer_remove_release_handler(tdm_buffer *buffer, tdm_buffer_release_handler
     buf_info = buffer;
     LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->release_funcs, link)
     {
-        if (func_info->func != func || func_info->user_data != user_data)
+        if (func_info->release_func != func || func_info->user_data != user_data)
             continue;
 
         LIST_DEL(&func_info->link);
@@ -221,7 +233,7 @@ tdm_buffer_remove_release_handler(tdm_buffer *buffer, tdm_buffer_release_handler
 }
 
 
-INTERN tdm_buffer*
+EXTERN tdm_buffer*
 tdm_buffer_ref_backend(tdm_buffer *buffer)
 {
     tdm_buffer_info *buf_info;
@@ -234,7 +246,7 @@ tdm_buffer_ref_backend(tdm_buffer *buffer)
     return buffer;
 }
 
-INTERN void
+EXTERN void
 tdm_buffer_unref_backend(tdm_buffer *buffer)
 {
     tdm_buffer_info *buf_info;
@@ -256,14 +268,14 @@ tdm_buffer_unref_backend(tdm_buffer *buffer)
     old_ref_count = buf_info->ref_count;
 
     LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->release_funcs, link)
-        func_info->func(buffer, func_info->user_data);
+        func_info->release_func(buffer, func_info->user_data);
 
     /* finally, both ref_count and backend_ref_count are 0. destroy tdm_buffer */
     if (old_ref_count == 0 && buf_info->ref_count == 0)
         _tdm_buffer_destroy(buf_info);
 }
 
-INTERN tbm_surface_h
+EXTERN tbm_surface_h
 tdm_buffer_get_surface(tdm_buffer *buffer)
 {
     tdm_buffer_info *buf_info = buffer;
@@ -273,7 +285,7 @@ tdm_buffer_get_surface(tdm_buffer *buffer)
     return buf_info->buffer;
 }
 
-INTERN tdm_buffer*
+EXTERN tdm_buffer*
 tdm_buffer_get(tbm_surface_h buffer)
 {
     tdm_buffer_info *found;
@@ -294,3 +306,46 @@ tdm_buffer_get(tbm_surface_h buffer)
 
     return NULL;
 }
+
+EXTERN tdm_error
+tdm_buffer_add_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data)
+{
+    tdm_buffer_info *buf_info;
+    tdm_buffer_func_info *func_info;
+
+    TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
+    TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+    func_info = calloc(1, sizeof(tdm_buffer_func_info));
+    TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY);
+
+    func_info->destroy_func = func;
+    func_info->user_data = user_data;
+
+    buf_info = buffer;
+    LIST_ADD(&func_info->link, &buf_info->destroy_funcs);
+
+    return TDM_ERROR_NONE;
+}
+
+EXTERN void
+tdm_buffer_remove_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data)
+{
+    tdm_buffer_info *buf_info;
+    tdm_buffer_func_info *func_info = NULL, *next = NULL;
+
+    TDM_RETURN_IF_FAIL(buffer != NULL);
+    TDM_RETURN_IF_FAIL(func != NULL);
+
+    buf_info = buffer;
+    LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->destroy_funcs, link)
+    {
+        if (func_info->destroy_func != func || func_info->user_data != user_data)
+            continue;
+
+        LIST_DEL(&func_info->link);
+        free(func_info);
+
+        return;
+    }
+}
index fa592ec..46927c2 100644 (file)
@@ -52,7 +52,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     func_capture = private_capture->func_capture
 
 static void
-_tdm_caputre_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, void *user_data)
+_tdm_caputre_cb_done(tdm_capture *capture_backend, tdm_buffer *buffer, void *user_data)
 {
     tdm_private_capture *private_capture = user_data;
     tdm_private_display *private_display = private_capture->private_display;
@@ -64,7 +64,7 @@ _tdm_caputre_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, void *u
         lock_after_cb_done = 1;
     }
 
-    tdm_buffer_unref_backend(tdm_buffer_get(buffer));
+    tdm_buffer_unref_backend(buffer);
 
     if (lock_after_cb_done)
         pthread_mutex_lock(&private_display->lock);
index 082e6b5..0ae9bb5 100644 (file)
@@ -1040,8 +1040,7 @@ tdm_layer_set_buffer(tdm_layer *layer, tdm_buffer *buffer)
 
     private_layer->waiting_buffer = tdm_buffer_ref_backend(buffer);
 
-    ret = func_display->layer_set_buffer(private_layer->layer_backend,
-                                         tdm_buffer_get_surface(buffer));
+    ret = func_display->layer_set_buffer(private_layer->layer_backend, buffer);
 
     pthread_mutex_unlock(&private_display->lock);
 
index 635682f..657ef4b 100644 (file)
@@ -256,11 +256,6 @@ struct _tdm_private_commit_handler
     void *user_data;
 };
 
-tdm_buffer*   tdm_buffer_ref_backend(tdm_buffer *buffer);
-void          tdm_buffer_unref_backend(tdm_buffer *buffer);
-tbm_surface_h tdm_buffer_get_surface(tdm_buffer *buffer);
-tdm_buffer*   tdm_buffer_get(tbm_surface_h buffer);
-
 tdm_private_pp* tdm_pp_create_internal(tdm_private_display *private_display, tdm_error *error);
 void tdm_pp_destroy_internal(tdm_private_pp *private_pp);