X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftbm_bo.c;h=39aac766ce8a337a473a4ceb8caa0441829189a7;hb=e565c41f907df4ed8a2b85d304bf11cc3ba0724d;hp=044b5ec9876b327c3117ddbde68683fcedd1a30b;hpb=731fc27849f8b30b4e340d72b16f9844b91b79f3;p=platform%2Fcore%2Fuifw%2Flibtbm.git diff --git a/src/tbm_bo.c b/src/tbm_bo.c index 044b5ec..39aac76 100644 --- a/src/tbm_bo.c +++ b/src/tbm_bo.c @@ -34,8 +34,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "tbm_bufmgr_int.h" #include "list.h" -#define TBM_BO_MAGIC 0xBF011234 - /* check condition */ #define TBM_BO_RETURN_IF_FAIL(cond) {\ if (!(cond)) {\ @@ -55,7 +53,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. } \ } -static char * +char * _tbm_flag_to_str(int f) { static char str[255]; @@ -88,18 +86,6 @@ _tbm_flag_to_str(int f) return str; } -static void -_tbm_util_check_bo_cnt(tbm_bufmgr bufmgr) -{ - static int last_chk_bo_cnt = 0; - - if ((bufmgr->bo_cnt >= 500) && ((bufmgr->bo_cnt % 20) == 0) && - (bufmgr->bo_cnt > last_chk_bo_cnt)) { - TBM_DBG("============TBM BO CNT DEBUG: bo_cnt=%d\n", bufmgr->bo_cnt); - tbm_bufmgr_debug_show(bufmgr); - last_chk_bo_cnt = bufmgr->bo_cnt; - } -} /* LCOV_EXCL_STOP */ tbm_user_data * @@ -328,20 +314,6 @@ _tbm_bo_is_valid(tbm_bo bo) } static void -_tbm_bo_init(tbm_bufmgr bufmgr, tbm_bo bo, int flags) -{ - bo->bufmgr = bufmgr; - bo->flags = flags; - bo->magic = TBM_BO_MAGIC; - bo->ref_cnt = 1; - - LIST_INITHEAD(&bo->user_data_list); - - bufmgr->bo_cnt++; - LIST_ADD(&bo->item_link, &bufmgr->bo_list); -} - -static void _tbm_bo_deinit(tbm_bo bo) { bo->magic = 0; @@ -354,8 +326,6 @@ tbm_bo tbm_bo_alloc(tbm_bufmgr bufmgr, int size, int flags) { tbm_bo bo; - void *bo_priv; - tbm_backend_bo_data *bo_data; tbm_error_e error; _tbm_bufmgr_mutex_lock(); @@ -364,292 +334,25 @@ tbm_bo_alloc(tbm_bufmgr bufmgr, int size, int flags) TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL); TBM_BO_RETURN_VAL_IF_FAIL(size > 0, NULL); - bo = calloc(1, sizeof(struct _tbm_bo)); + bo = tbm_bufmgr_internal_alloc_bo(bufmgr, size, flags, &error); if (!bo) { /* LCOV_EXCL_START */ - _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY); + TBM_ERR("tbm_bufmgr_internal_alloc_bo failed. error:%d", error); + _tbm_set_last_result(error); _tbm_bufmgr_mutex_unlock(); return NULL; /* LCOV_EXCL_STOP */ } - _tbm_util_check_bo_cnt(bufmgr); - - if (bufmgr->use_hal_tbm) { - bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo(bufmgr->hal_bufmgr, size, flags, (hal_tbm_error *)&error); - /* LCOV_EXCL_START */ - if (!bo_data) { - _tbm_set_last_result(error); - goto alloc_fail; - } - /* LCOV_EXCL_STOP */ - bo->bo_data = bo_data; - } else if (bufmgr->backend_module_data) { - bo_data = bufmgr->bufmgr_func->bufmgr_alloc_bo(bufmgr->bufmgr_data, (unsigned int)size, flags, &error); - if (!bo_data) { - /* LCOV_EXCL_START */ - _tbm_set_last_result(error); - goto alloc_fail; - /* LCOV_EXCL_STOP */ - } - bo->bo_data = bo_data; - } else { - bo_priv = bufmgr->backend->bo_alloc(bo, size, flags); - if (!bo_priv) { - /* LCOV_EXCL_START */ - - _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION); - goto alloc_fail; - /* LCOV_EXCL_STOP */ - } - bo->priv = bo_priv; - } - - _tbm_bo_init(bufmgr, bo, flags); - TBM_TRACE_BO("bo(%p) size(%d) refcnt(%d), flag(%s)\n", bo, size, bo->ref_cnt, _tbm_flag_to_str(bo->flags)); _tbm_bufmgr_mutex_unlock(); return bo; - -alloc_fail: - TBM_ERR("error: fail to create of tbm_bo size(%d) flag(%s)\n", size, _tbm_flag_to_str(flags)); - free(bo); - _tbm_bufmgr_mutex_unlock(); - return NULL; -} - -/* LCOV_EXCL_START */ -tbm_bo -tbm_bo_alloc_with_format(tbm_bufmgr bufmgr, int format, int bo_idx, int width, - int height, int bpp, tbm_bo_memory_type flags, tbm_error_e *error) -{ - tbm_bo bo; - tbm_backend_bo_data *bo_data; - - _tbm_bufmgr_mutex_lock(); - _tbm_set_last_result(TBM_ERROR_NONE); - - TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL); - - bo = calloc(1, sizeof(struct _tbm_bo)); - if (!bo) { - TBM_ERR("error: fail to tbm_bo_alloc_with_format fmt(%s) idx(%d) w(%d) h(%d) mem_types(%s)\n", - FOURCC_STR(format), bo_idx, width, height, _tbm_flag_to_str(flags)); - _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY); - goto calloc_fail; - } - - _tbm_util_check_bo_cnt(bufmgr); - - /* LCOV_EXCL_START */ - if (!bufmgr->use_hal_tbm) { - if (!bufmgr->backend_module_data || !bufmgr->bufmgr_func->bufmgr_alloc_bo_with_format) { - - TBM_ERR("error: not supported tbm_bo_alloc_with_format\n"); - _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED); - goto bo_alloc_fail; - } - } - /* LCOV_EXCL_STOP */ - - if (bufmgr->use_hal_tbm) { - hal_tbm_error ret; - bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo_with_format(bufmgr->hal_bufmgr, - format, bo_idx, width, height, bpp, (hal_tbm_bo_memory_type)flags, &ret); - if (error) - *error = (tbm_error_e)ret; - if (ret != HAL_TBM_ERROR_NONE) { - if (ret != HAL_TBM_ERROR_NOT_SUPPORTED) { - TBM_ERR("error: fail to tbm_bo_alloc_with_format\n"); - if (error) - _tbm_set_last_result(*error); - } - goto bo_alloc_fail; - } - } else { - bo_data = bufmgr->bufmgr_func->bufmgr_alloc_bo_with_format(bufmgr->bufmgr_data, format, bo_idx, - width, height, flags, error); - if (!bo_data) { - TBM_ERR("error: fail to tbm_bo_alloc_with_format fmt(%s) idx(%d) w(%d) h(%d) mem_types(%s)\n", - FOURCC_STR(format), bo_idx, width, height, _tbm_flag_to_str(flags)); - if (error) - _tbm_set_last_result(*error); - goto bo_alloc_fail; - } - } - - bo->bo_data = bo_data; - _tbm_bo_init(bufmgr, bo, flags); - - _tbm_bufmgr_mutex_unlock(); - - return bo; - -bo_alloc_fail: - free(bo); -calloc_fail: - _tbm_bufmgr_mutex_unlock(); - return NULL; -} - -tbm_bo -tbm_bo_alloc_with_tiled_format(tbm_bufmgr bufmgr, int width, int height, int bpp, int format, - tbm_bo_memory_type flags, int bo_idx, tbm_error_e *error) -{ - tbm_bo bo; - tbm_backend_bo_data *bo_data; - - _tbm_bufmgr_mutex_lock(); - _tbm_set_last_result(TBM_ERROR_NONE); - - TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL); - - bo = calloc(1, sizeof(struct _tbm_bo)); - if (!bo) { - TBM_ERR("error: fail to tbm_bo_alloc_with_tiled_format fmt(%s) idx(%d) w(%d) h(%d) flags(%s)\n", - FOURCC_STR(format), bo_idx, width, height, _tbm_flag_to_str(flags)); - _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY); - _tbm_bufmgr_mutex_unlock(); - return NULL; - } - - _tbm_util_check_bo_cnt(bufmgr); - - if (!bufmgr->use_hal_tbm) { - if (!bufmgr->backend_module_data || !bufmgr->bufmgr_func->bufmgr_alloc_bo_with_tiled_format) { - TBM_ERR("error: not supported tbm_bo_alloc_with_tiled_format\n"); - _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED); - goto bo_alloc_fail; - } - } - - if (bufmgr->use_hal_tbm) { - hal_tbm_error ret; - bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo_with_format(bufmgr->hal_bufmgr, - width, height, bpp, format, (hal_tbm_bo_memory_type)flags, bo_idx, &ret); - if (error) - *error = (tbm_error_e)ret; - if (ret != HAL_TBM_ERROR_NONE) { - if (ret != HAL_TBM_ERROR_NOT_SUPPORTED) { - TBM_ERR("error: fail to tbm_bo_alloc_with_tiled_format fmt(%s) idx(%d) w(%d) h(%d) flags(%s)\n", - FOURCC_STR(format), bo_idx, width, height, _tbm_flag_to_str(flags)); - if (error) - _tbm_set_last_result(*error); - } - goto bo_alloc_fail; - } - } else { - bo_data = bufmgr->bufmgr_func->bufmgr_alloc_bo_with_tiled_format(bufmgr->bufmgr_data, width, height, - bpp, format, flags, bo_idx, error); - if (!bo_data) { - TBM_ERR("error: fail to tbm_bo_alloc_with_tiled_format fmt(%s) idx(%d) w(%d) h(%d) flags(%s)\n", - FOURCC_STR(format), bo_idx, width, height, _tbm_flag_to_str(flags)); - if (error) - _tbm_set_last_result(*error); - goto bo_alloc_fail; - } - } - - bo->bo_data = bo_data; - _tbm_bo_init(bufmgr, bo, flags); - - _tbm_bufmgr_mutex_unlock(); - - return bo; - -bo_alloc_fail: - free(bo); - _tbm_bufmgr_mutex_unlock(); - return NULL; -} - -tbm_bo -tbm_bo_alloc_with_surface(tbm_bufmgr bufmgr, int width, int height, int format, int flags, int bo_idx) -{ - tbm_bo bo; - void *bo_priv; - - _tbm_bufmgr_mutex_lock(); - _tbm_set_last_result(TBM_ERROR_NONE); - - TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL); - - bo = calloc(1, sizeof(struct _tbm_bo)); - if (!bo) { - TBM_ERR("error: fail to tbm_bo_alloc_with_surface fmt(%s) idx(%d) w(%d) h(%d) flags(%s)\n", - FOURCC_STR(format), bo_idx, width, height, _tbm_flag_to_str(flags)); - _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY); - _tbm_bufmgr_mutex_unlock(); - return NULL; - } - - _tbm_util_check_bo_cnt(bufmgr); - - if (!bufmgr->backend->surface_bo_alloc) { - TBM_ERR("error: not supported tbm_bo_alloc_with_surface\n"); - _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED); - free(bo); - _tbm_bufmgr_mutex_unlock(); - return NULL; - } - - bo_priv = bufmgr->backend->surface_bo_alloc(bo, width, height, format, flags, bo_idx); - if (!bo_priv) { - TBM_ERR("error: fail to tbm_bo_alloc_with_surface fmt(%s) idx(%d) w(%d) h(%d) flags(%s)\n", - FOURCC_STR(format), bo_idx, width, height, _tbm_flag_to_str(flags)); - _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION); - free(bo); - _tbm_bufmgr_mutex_unlock(); - return NULL; - } - - bo->priv = bo_priv; - _tbm_bo_init(bufmgr, bo, flags); - - _tbm_bufmgr_mutex_unlock(); - - return bo; } tbm_bo -tbm_bo_alloc_with_bo_data(tbm_bufmgr bufmgr, tbm_backend_bo_data *bo_data, int flags) -{ - tbm_bo bo; - - _tbm_bufmgr_mutex_lock(); - _tbm_set_last_result(TBM_ERROR_NONE); - - TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL); - TBM_BO_RETURN_VAL_IF_FAIL(bo_data, NULL); - - bo = calloc(1, sizeof(struct _tbm_bo)); - if (!bo) { - /* LCOV_EXCL_START */ - _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY); - _tbm_bufmgr_mutex_unlock(); - return NULL; - /* LCOV_EXCL_STOP */ - } - - _tbm_util_check_bo_cnt(bufmgr); - - bo->bo_data = bo_data; - - _tbm_bo_init(bufmgr, bo, flags); - - TBM_TRACE_BO("bo(%p) refcnt(%d), flag(%s)\n", bo, bo->ref_cnt, _tbm_flag_to_str(bo->flags)); - - _tbm_bufmgr_mutex_unlock(); - - return bo; -} - -/* LCOV_EXCL_STOP */ - -tbm_bo tbm_bo_ref(tbm_bo bo) { _tbm_bufmgr_mutex_lock(); @@ -992,298 +695,53 @@ tbm_bo tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key) { tbm_bo bo; - tbm_bo bo2 = NULL; - void *bo_priv; tbm_error_e error; - tbm_backend_bo_data *bo_data; - int flags; _tbm_bufmgr_mutex_lock(); _tbm_set_last_result(TBM_ERROR_NONE); TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL); - if (!bufmgr->use_hal_tbm) { - if (bufmgr->backend_module_data) { - if (!bufmgr->bufmgr_func->bufmgr_import_key) { - /* LCOV_EXCL_START */ - _tbm_bufmgr_mutex_unlock(); - _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED); - return NULL; - /* LCOV_EXCL_STOP */ - } - } else { - if (!bufmgr->backend->bo_import) { - /* LCOV_EXCL_START */ - _tbm_bufmgr_mutex_unlock(); - _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED); - return NULL; - /* LCOV_EXCL_STOP */ - } - } - } - - _tbm_util_check_bo_cnt(bufmgr); - - bo = calloc(1, sizeof(struct _tbm_bo)); + bo = tbm_bufmgr_internal_import_bo_with_key(bufmgr, key, &error); if (!bo) { /* LCOV_EXCL_START */ - TBM_ERR("error: fail to import of tbm_bo by key(%d)\n", key); - _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY); + TBM_ERR("tbm_bufmgr_internal_import_key failed. error:%d", error); + _tbm_set_last_result(error); _tbm_bufmgr_mutex_unlock(); return NULL; /* LCOV_EXCL_STOP */ } - if (bufmgr->use_hal_tbm) { - bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_key(bufmgr->hal_bufmgr, key, (hal_tbm_error *)&error); - /* LCOV_EXCL_START */ - if (!bo_data) { - TBM_ERR("error: fail to import of tbm_bo by key(%d). error(%d)\n", key, error); - _tbm_set_last_result(error); - goto import_fail; - } - /* LCOV_EXCL_STOP */ - if (!LIST_IS_EMPTY(&bufmgr->bo_list)) { - LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) { - if (bo2->bo_data == bo_data) { - TBM_TRACE_BO("find bo(%p) ref(%d) key(%d) flag(%s) in list\n", - bo2, bo2->ref_cnt, key, - _tbm_flag_to_str(bo2->flags)); - bo2->ref_cnt++; - free(bo); - _tbm_bufmgr_mutex_unlock(); - return bo2; - } - } - } - bo->bo_data = bo_data; - } else if (bufmgr->backend_module_data) { - bo_data = bufmgr->bufmgr_func->bufmgr_import_key(bufmgr->bufmgr_data, key, &error); - if (!bo_data) { - /* LCOV_EXCL_START */ - TBM_ERR("error: fail to import of tbm_bo by key(%d). error(%d)\n", key, error); - _tbm_set_last_result(error); - goto import_fail; - /* LCOV_EXCL_STOP */ - } - - if (!LIST_IS_EMPTY(&bufmgr->bo_list)) { - LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) { - if (bo2->bo_data == bo_data) { - TBM_TRACE_BO("find bo(%p) ref(%d) key(%d) flag(%s) in list\n", - bo2, bo2->ref_cnt, key, - _tbm_flag_to_str(bo2->flags)); - bo2->ref_cnt++; - free(bo); - _tbm_bufmgr_mutex_unlock(); - return bo2; - } - } - } - bo->bo_data = bo_data; - } else { - bo_priv = bufmgr->backend->bo_import(bo, key); - if (!bo_priv) { - /* LCOV_EXCL_START */ - TBM_ERR("error: fail to import of tbm_bo by key(%d)\n", key); - _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION); - goto import_fail; - /* LCOV_EXCL_STOP */ - } - - if (!LIST_IS_EMPTY(&bufmgr->bo_list)) { - LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) { - if (bo2->priv == bo_priv) { - TBM_TRACE_BO("find bo(%p) ref(%d) key(%d) flag(%s) in list\n", - bo2, bo2->ref_cnt, key, - _tbm_flag_to_str(bo2->flags)); - bo2->ref_cnt++; - free(bo); - _tbm_bufmgr_mutex_unlock(); - return bo2; - } - } - } - bo->priv = bo_priv; - } - - if (bufmgr->use_hal_tbm) { - flags = (tbm_bo_memory_type)hal_tbm_bo_get_memory_types((hal_tbm_bo *)bo->bo_data, (hal_tbm_error *)&error); - if (error != TBM_ERROR_NONE) { - TBM_ERR("fail to get the bo flags(memory_types)"); - _tbm_set_last_result(error); - flags = TBM_BO_DEFAULT; - } - } else if (bufmgr->backend_module_data) { - flags = bufmgr->bo_func->bo_get_memory_types(bo->bo_data, &error); - if (error != TBM_ERROR_NONE) { - TBM_ERR("fail to get the bo flags(memory_types)"); - _tbm_set_last_result(error); - flags = TBM_BO_DEFAULT; - } - } else { - if (bufmgr->backend->bo_get_flags) - flags = bufmgr->backend->bo_get_flags(bo); - else - flags = TBM_BO_DEFAULT; - } - - _tbm_bo_init(bufmgr, bo, flags); - TBM_TRACE_BO("import new bo(%p) ref(%d) key(%d) flag(%s) in list\n", bo, bo->ref_cnt, key, _tbm_flag_to_str(bo->flags)); _tbm_bufmgr_mutex_unlock(); return bo; - -import_fail: - free(bo); - _tbm_bufmgr_mutex_unlock(); - return NULL; } tbm_bo tbm_bo_import_fd(tbm_bufmgr bufmgr, tbm_fd fd) { tbm_bo bo; - tbm_bo bo2 = NULL; - void *bo_priv; - tbm_backend_bo_data *bo_data; tbm_error_e error; - int flags; _tbm_bufmgr_mutex_lock(); _tbm_set_last_result(TBM_ERROR_NONE); TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL); - if (!bufmgr->use_hal_tbm) { - if (bufmgr->backend_module_data) { - if (!bufmgr->bufmgr_func->bufmgr_import_fd) { - /* LCOV_EXCL_START */ - _tbm_bufmgr_mutex_unlock(); - _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED); - return NULL; - /* LCOV_EXCL_STOP */ - } - } else { - if (!bufmgr->backend->bo_import_fd) { - /* LCOV_EXCL_START */ - _tbm_bufmgr_mutex_unlock(); - _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED); - return NULL; - /* LCOV_EXCL_STOP */ - } - } - } - - _tbm_util_check_bo_cnt(bufmgr); - - bo = calloc(1, sizeof(struct _tbm_bo)); + bo = tbm_bufmgr_internal_import_bo_with_fd(bufmgr, fd, &error); if (!bo) { /* LCOV_EXCL_START */ - TBM_ERR("error: fail to import tbm_bo by tbm_fd(%d)\n", fd); - _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY); + TBM_ERR("tbm_bufmgr_internal_import_fd failed. error:%d", error); + _tbm_set_last_result(error); _tbm_bufmgr_mutex_unlock(); return NULL; /* LCOV_EXCL_STOP */ } - if (bufmgr->use_hal_tbm) { - bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_fd(bufmgr->hal_bufmgr, (hal_tbm_fd)fd, (hal_tbm_error *)&error); - /* LCOV_EXCL_START */ - if (!bo_data) { - TBM_ERR("error: fail to import tbm_bo by tbm_fd(%d). error(%d)\n", fd, error); - _tbm_set_last_result(error); - goto import_fail; - } - /* LCOV_EXCL_STOP */ - - if (!LIST_IS_EMPTY(&bufmgr->bo_list)) { - LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) { - if (bo2->bo_data == bo_data) { - TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list\n", - bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags)); - bo2->ref_cnt++; - free(bo); - _tbm_bufmgr_mutex_unlock(); - return bo2; - } - } - } - bo->bo_data = bo_data; - } else if (bufmgr->backend_module_data) { - bo_data = bufmgr->bufmgr_func->bufmgr_import_fd(bufmgr->bufmgr_data, fd, &error); - if (!bo_data) { - /* LCOV_EXCL_START */ - TBM_ERR("error: fail to import tbm_bo by tbm_fd(%d). error(%d)\n", fd, error); - _tbm_set_last_result(error); - goto import_fail; - /* LCOV_EXCL_STOP */ - } - - if (!LIST_IS_EMPTY(&bufmgr->bo_list)) { - LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) { - if (bo2->bo_data == bo_data) { - TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list\n", - bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags)); - bo2->ref_cnt++; - free(bo); - _tbm_bufmgr_mutex_unlock(); - return bo2; - } - } - } - bo->bo_data = bo_data; - } else { - bo_priv = bufmgr->backend->bo_import_fd(bo, fd); - if (!bo_priv) { - /* LCOV_EXCL_START */ - TBM_ERR("error: fail to import tbm_bo by tbm_fd(%d)\n", fd); - _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION); - goto import_fail; - /* LCOV_EXCL_STOP */ - } - - if (!LIST_IS_EMPTY(&bufmgr->bo_list)) { - LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) { - if (bo2->priv == bo_priv) { - TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list\n", - bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags)); - bo2->ref_cnt++; - free(bo); - _tbm_bufmgr_mutex_unlock(); - return bo2; - } - } - } - bo->priv = bo_priv; - } - - if (bufmgr->use_hal_tbm) { - flags = (tbm_bo_memory_type)hal_tbm_bo_get_memory_types((hal_tbm_bo *)bo->bo_data, (hal_tbm_error *)&error); - if (error != TBM_ERROR_NONE) { - TBM_ERR("fail to get the bo flags(memory_types)"); - _tbm_set_last_result(error); - flags = TBM_BO_DEFAULT; - } - } else if (bufmgr->backend_module_data) { - flags = bufmgr->bo_func->bo_get_memory_types(bo->bo_data, &error); - if (error != TBM_ERROR_NONE) { - TBM_ERR("fail to get the bo flags(memory_types)"); - _tbm_set_last_result(error); - flags = TBM_BO_DEFAULT; - } - } else { - if (bufmgr->backend->bo_get_flags) - flags = bufmgr->backend->bo_get_flags(bo); - else - flags = TBM_BO_DEFAULT; - } - - _tbm_bo_init(bufmgr, bo, flags); + LIST_INITHEAD(&bo->user_data_list); // TODO: remove this. build-break when it is removed. TBM_TRACE_BO("import bo(%p) ref(%d) fd(%d) flag(%s)\n", bo, bo->ref_cnt, fd, _tbm_flag_to_str(bo->flags)); @@ -1291,11 +749,6 @@ tbm_bo_import_fd(tbm_bufmgr bufmgr, tbm_fd fd) _tbm_bufmgr_mutex_unlock(); return bo; - -import_fail: - free(bo); - _tbm_bufmgr_mutex_unlock(); - return NULL; } int @@ -1625,8 +1078,13 @@ _tbm_bo_free(tbm_bo bo) /* call the bo_free */ if (bo->bufmgr->use_hal_tbm) { - hal_tbm_bo_free(bo->bo_data); - bo->bo_data = NULL; + // call hal_tbm_bo_free when bo is created by tbm_bo_alloc api. + if (!bo->get_from_hal_surface) { + bo->get_from_hal_surface = 0; + + hal_tbm_bo_free(bo->bo_data); + bo->bo_data = NULL; + } } else if (bo->bufmgr->backend_module_data) { bo->bufmgr->bo_func->bo_free(bo->bo_data); bo->bo_data = NULL;