From 9ecf7537fbce6fd02f682d4b4b5bb34430545726 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Wed, 16 Jun 2021 16:55:13 +0900 Subject: [PATCH] tbm_bufmgr: add tbm_bufmgr_internal_import_bo_with_key and use it The tbm_bufmgr generates tbm_bo and manages them Change-Id: Iac149b45c70a38eefc887a11770dde0d61faeeb7 --- src/tbm_bo.c | 53 +++------------------------------------------ src/tbm_bufmgr.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/tbm_bufmgr_int.h | 1 + 3 files changed, 65 insertions(+), 50 deletions(-) diff --git a/src/tbm_bo.c b/src/tbm_bo.c index dd75031..bb2193e 100644 --- a/src/tbm_bo.c +++ b/src/tbm_bo.c @@ -720,71 +720,24 @@ done: tbm_bo tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key) { - tbm_bo bo, bo2 = NULL; + tbm_bo bo; 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); - _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_bufmgr_mutex_unlock(); - return NULL; - /* LCOV_EXCL_STOP */ - } - - bo->bo_data = tbm_module_bufmgr_bo_import_key(bufmgr->module, bo, key, &error); - if (!bo->bo_data) { - /* LCOV_EXCL_START */ - TBM_ERR("tbm_module_bufmgr_bo_import_key failed. tbm_key:%d", key); + 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 */ } - // 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) { - 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)); diff --git a/src/tbm_bufmgr.c b/src/tbm_bufmgr.c index 48dca8e..d4a15bb 100644 --- a/src/tbm_bufmgr.c +++ b/src/tbm_bufmgr.c @@ -1035,4 +1035,65 @@ tbm_bufmgr_internal_alloc_bo_with_bo_data(tbm_bufmgr bufmgr, tbm_backend_bo_data return bo; } +tbm_bo +tbm_bufmgr_internal_import_bo_with_key(tbm_bufmgr bufmgr, unsigned int key, tbm_error_e *error) +{ + tbm_bo bo, bo2; + int flags; + + _tbm_bufmgr_check_bo_cnt(bufmgr); + + bo = calloc(1, sizeof(struct _tbm_bo)); + if (!bo) { + /* LCOV_EXCL_START */ + TBM_ERR("memory allocationc failed."); + *error = TBM_ERROR_OUT_OF_MEMORY; + return NULL; + /* LCOV_EXCL_STOP */ + } + + bo->bo_data = tbm_module_bufmgr_bo_import_key(bufmgr->module, bo, key, error); + if (!bo->bo_data) { + /* LCOV_EXCL_START */ + TBM_ERR("tbm_module_bufmgr_bo_import_key failed. tbm_key:%d", key); + free(bo); + return NULL; + /* LCOV_EXCL_STOP */ + } + + // 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); + return bo2; + } + + // TODO: refactoring tbm_module_bo + 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)"); + 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)"); + flags = TBM_BO_DEFAULT; + } + } else { + if (bufmgr->backend->bo_get_flags) + flags = bufmgr->backend->bo_get_flags(bo); + else + flags = TBM_BO_DEFAULT; + } + + _tbm_bufmgr_initialize_bo(bufmgr, bo, flags); + + return bo; +} + /* LCOV_EXCL_STOP */ diff --git a/src/tbm_bufmgr_int.h b/src/tbm_bufmgr_int.h index 8365cfa..efdf68c 100644 --- a/src/tbm_bufmgr_int.h +++ b/src/tbm_bufmgr_int.h @@ -354,6 +354,7 @@ tbm_bo tbm_bufmgr_internal_find_bo(tbm_bufmgr bufmgr, tbm_bo bo); tbm_bo tbm_bufmgr_internal_alloc_bo(tbm_bufmgr bufmgr, int size, int flags, tbm_error_e *error); tbm_bo tbm_bufmgr_internal_alloc_bo_with_format(tbm_bufmgr bufmgr, int format, int bo_idx, int width, int bpp, int height, tbm_bo_memory_type flags, tbm_error_e *error); tbm_bo tbm_bufmgr_internal_alloc_bo_with_bo_data(tbm_bufmgr bufmgr, tbm_backend_bo_data *bo_data, int flags); +tbm_bo tbm_bufmgr_internal_import_bo_with_key(tbm_bufmgr bufmgr, tbm_key key, tbm_error_e *error); /* tbm_module functions */ tbm_module *tbm_module_load(int fd); -- 2.7.4