X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftbm_bo.c;h=88728489a43ef7d567057cacd829806ab29a8fc1;hb=e63541a42a8470996ae0dc2209b2febaaa71c390;hp=0d31ea53d4791c0237b34370ae4f673bee7220be;hpb=08e8584d49e308eb667d79119fde948721449d57;p=platform%2Fcore%2Fuifw%2Flibtbm.git diff --git a/src/tbm_bo.c b/src/tbm_bo.c index 0d31ea5..8872848 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)) {\ @@ -354,7 +352,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; @@ -375,34 +372,16 @@ tbm_bo_alloc(tbm_bufmgr bufmgr, int size, int flags) _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); + bo_data = tbm_module_bufmgr_bo_alloc(bufmgr->module, bo, size, flags, &error); + if (!bo_data || error != TBM_ERROR_NONE) { /* LCOV_EXCL_START */ - if (!bo_data) { - _tbm_set_last_result(error); - goto alloc_fail; - } + TBM_ERR("tbm_module_bufmgr_bo_alloc failed. error:%d", error); + _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; } + bo->bo_data = bo_data; + bo->priv = (void *)bo_data; // TODO: this will be DEPRECATED. _tbm_bo_init(bufmgr, bo, flags); @@ -422,202 +401,9 @@ alloc_fail: /* 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; - } - bo->bo_data = bo_data; - } 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; - } - bo->bo_data = bo_data; - } 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, bo2; + tbm_bo bo, bo2 = NULL; _tbm_bufmgr_mutex_lock(); _tbm_set_last_result(TBM_ERROR_NONE); @@ -1005,11 +791,8 @@ done: tbm_bo tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key) { - tbm_bo bo; - tbm_bo bo2 = NULL; - void *bo_priv; + tbm_bo bo, bo2 = NULL; tbm_error_e error; - tbm_backend_bo_data *bo_data; int flags; _tbm_bufmgr_mutex_lock(); @@ -1017,26 +800,6 @@ tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key) 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)); @@ -1049,77 +812,25 @@ tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key) /* 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); + bo->bo_data = tbm_module_bufmgr_bo_import_key(bufmgr->module, bo, key, &error); + if (!bo->bo_data) { /* 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; - } + TBM_ERR("tbm_module_bufmgr_bo_import_key failed. tbm_key:%d", key); + _tbm_set_last_result(error); + _tbm_bufmgr_mutex_unlock(); + return NULL; /* 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; + // return the existed bo2 if bo->bo_data and bo2->bo_data is the same + bo2 = tbm_bufmgr_internal_find_bo(bufmgr, bo); + if (bo2) { + TBM_TRACE_BO("find bo(%p) ref(%d) key(%d) flag(%s) in list", + bo2, bo2->ref_cnt, key, _tbm_flag_to_str(bo2->flags)); + bo2->ref_cnt++; + free(bo); + _tbm_bufmgr_mutex_unlock(); + return bo2; } if (bufmgr->use_hal_tbm) { @@ -1151,20 +862,12 @@ tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key) _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_bo bo, bo2 = NULL; tbm_error_e error; int flags; @@ -1173,26 +876,6 @@ tbm_bo_import_fd(tbm_bufmgr bufmgr, tbm_fd fd) 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)); @@ -1205,75 +888,25 @@ tbm_bo_import_fd(tbm_bufmgr bufmgr, tbm_fd fd) /* 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); + bo->bo_data = tbm_module_bufmgr_bo_import_fd(bufmgr->module, bo, fd, &error); + if (!bo->bo_data) { /* 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; - } + TBM_ERR("tbm_module_bufmgr_bo_import_fd failed. tbm_fd:%d", fd); + _tbm_set_last_result(error); + _tbm_bufmgr_mutex_unlock(); + return NULL; /* 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; + // return the existed bo2 if bo->bo_data and bo2->bo_data is the same + bo2 = tbm_bufmgr_internal_find_bo(bufmgr, bo); + if (bo2) { + TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list", + bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags)); + bo2->ref_cnt++; + free(bo); + _tbm_bufmgr_mutex_unlock(); + return bo2; } if (bufmgr->use_hal_tbm) { @@ -1305,11 +938,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