From: Junkyeong Kim Date: Fri, 11 Dec 2015 05:27:00 +0000 (+0900) Subject: use tdm_buffer instead of tbm_surface for backend X-Git-Tag: accepted/tizen/mobile/20151212.071108 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Ftags%2Faccepted%2Ftizen%2Fmobile%2F20151212.071108;p=platform%2Fcore%2Fuifw%2Flibtdm.git use tdm_buffer instead of tbm_surface for backend - add tdm buffer destroy handler Change-Id: I6edf927ded6c7e07cfcf396f279c5ab8fc49e4de Signed-off-by: Junkyeong Kim --- diff --git a/include/tdm_backend.h b/include/tdm_backend.h index bd4e9d7..81eb89c 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -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 diff --git a/src/tdm_buffer.c b/src/tdm_buffer.c index 31b0d88..508b9bd 100644 --- a/src/tdm_buffer.c +++ b/src/tdm_buffer.c @@ -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; + } +} diff --git a/src/tdm_capture.c b/src/tdm_capture.c index fa592ec..46927c2 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -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); diff --git a/src/tdm_display.c b/src/tdm_display.c index 082e6b5..0ae9bb5 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -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); diff --git a/src/tdm_private.h b/src/tdm_private.h index 635682f..657ef4b 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -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);