X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftbm_module.c;h=140392adc7194c64120e6dd8fda600b59a0effe6;hb=e63541a42a8470996ae0dc2209b2febaaa71c390;hp=2644f820840627c40489606bb0fd4e266edcd904;hpb=de7f92cb137b03be9fbeea213f7943a641ff4f7e;p=platform%2Fcore%2Fuifw%2Flibtbm.git diff --git a/src/tbm_module.c b/src/tbm_module.c index 2644f82..140392a 100644 --- a/src/tbm_module.c +++ b/src/tbm_module.c @@ -52,7 +52,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define GET_MODULE_PATCHLEVEL(vers) ((vers) & 0xFFFF) /* LCOV_EXCL_START */ - static int _tbm_backend_load_hal_tbm(tbm_module *module) { @@ -341,11 +340,10 @@ err: dlclose(module_data); return 0; } - /* LCOV_EXCL_STOP */ tbm_module * -tbm_module_load(tbm_bufmgr bufmgr, int fd) +tbm_module_load(int fd) { tbm_module *module; struct dirent **namelist; @@ -356,7 +354,6 @@ tbm_module_load(tbm_bufmgr bufmgr, int fd) TBM_ERR("fail to allocate the memory"); return NULL; } - module->bufmgr = bufmgr; /* try to load the hal-tbm backend module */ ret = _tbm_backend_load_hal_tbm(module); @@ -365,6 +362,7 @@ tbm_module_load(tbm_bufmgr bufmgr, int fd) goto done; } +/* LCOV_EXCL_START */ /* try to load the new backend module */ ret = _tbm_backend_load_module(module, DEFAULT_LIB); if (ret) { @@ -379,7 +377,7 @@ tbm_module_load(tbm_bufmgr bufmgr, int fd) return module; } - /* load bufmgr priv from configured path */ + /* load backend_module from configured path */ n = scandir(BUFMGR_MODULE_DIR, &namelist, 0, alphasort); if (n < 0) { TBM_ERR("no files : %s\n", BUFMGR_MODULE_DIR); @@ -411,6 +409,7 @@ tbm_module_load(tbm_bufmgr bufmgr, int fd) free(module); module = NULL; } +/* LCOV_EXCL_STOP */ done: return module; @@ -433,6 +432,7 @@ tbm_module_unload(tbm_module *module) module->hal_bufmgr = NULL; module->use_hal_tbm = 0; break; +/* LCOV_EXCL_START */ case TBM_MODULE_TYPE_TBM_BACKEND: module->backend_module_data->deinit(module->bufmgr_data); module->bo_func = NULL; @@ -453,38 +453,359 @@ tbm_module_unload(tbm_module *module) default: TBM_ERR("Wrong module type:%d", module->type); break; +/* LCOV_EXCL_STOP */ } - module->bufmgr = NULL; - free(module); } int -tbm_module_bufmgr_get_capabilities(tbm_module *module) +tbm_module_bufmgr_get_capabilities(tbm_module *module, tbm_error_e *error) { - tbm_error_e error = TBM_ERROR_NOT_SUPPORTED; int capabilities = 0; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + + TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, TBM_BUFMGR_CAPABILITY_NONE, *error, TBM_ERROR_INVALID_PARAMETER); switch (module->type) { case TBM_MODULE_TYPE_HAL_TBM: - capabilities = hal_tbm_bufmgr_get_capabilities(module->hal_bufmgr, (hal_tbm_error *)&error); + capabilities = hal_tbm_bufmgr_get_capabilities(module->hal_bufmgr, (hal_tbm_error *)error); break; +/* LCOV_EXCL_START */ case TBM_MODULE_TYPE_TBM_BACKEND: - capabilities = module->bufmgr_func->bufmgr_get_capabilities(module->bufmgr_data, &error); + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, 0, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_get_capabilities, 0, *error, TBM_ERROR_NOT_SUPPORTED); + + capabilities = module->bufmgr_func->bufmgr_get_capabilities(module->bufmgr_data, error); break; case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); TBM_ERR("Do not support at tbm_bufmgr_backend."); + + *error = TBM_ERROR_NOT_SUPPORTED; break; default: TBM_ERR("Wrong module type:%d", module->type); + *error = TBM_ERROR_INVALID_OPERATION; break; +/* LCOV_EXCL_STOP */ } - if (error != TBM_ERROR_NONE) { - TBM_ERR("fail to get capabilities of bufmgr"); - return 0; + return capabilities; +} + +tbm_error_e +tbm_module_bufmgr_bind_native_display(tbm_module *module, void *native_display) +{ + tbm_error_e error = TBM_ERROR_NONE; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + tbm_bufmgr_backend backend = NULL; + int ret = 0; + + TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER); + + switch (module->type) { + case TBM_MODULE_TYPE_HAL_TBM: + if (hal_tbm_backend_has_drm_device(module->hal_backend, &ret)) { + int fd = tbm_drm_helper_get_fd(); // this must be the auth drm_fd.(master drm_fd); + if (fd < -1) { + TBM_ERR("error: module(%p) native_display(%p)\n", module, native_display); + return TBM_ERROR_INVALID_OPERATION; + } + + // make the wayland server socket for sending the authenticated drm_fd to wayland clients. + if (!tbm_drm_helper_wl_auth_server_init(native_display, fd, NULL, 0)) { + TBM_ERR("error: tbm_drm_helper_wl_auth_server_init failed\n", module, native_display); + close(fd); + return TBM_ERROR_INVALID_OPERATION; + } + TBM_INFO("tbm creates a wayland socket for authentication of drm_fd."); + + module->auth_wl_socket_created = 1; + module->auth_fd = fd; + } else { + TBM_INFO("tbm_module has no drm device."); + error = TBM_ERROR_NONE; + } + break; +/* LCOV_EXCL_START */ + case TBM_MODULE_TYPE_TBM_BACKEND: + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_bind_native_display, TBM_ERROR_NOT_SUPPORTED); + + error = bufmgr_func->bufmgr_bind_native_display(module->bufmgr_data, (tbm_native_display *)native_display); + break; + case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + backend = module->backend; + TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_IF_FAIL(backend->bufmgr_bind_native_display, TBM_ERROR_NOT_SUPPORTED); + + ret = backend->bufmgr_bind_native_display((tbm_bufmgr)module, native_display); + if (!ret) + error = TBM_ERROR_INVALID_OPERATION; + + break; + default: + TBM_ERR("Wrong module type:%d", module->type); + error = TBM_ERROR_INVALID_OPERATION; + break; +/* LCOV_EXCL_STOP */ } - return capabilities; + return error; +} + +tbm_error_e +tbm_module_bufmgr_get_supported_formats(tbm_module *module, uint32_t **formats, uint32_t *num) +{ + tbm_error_e error = TBM_ERROR_NONE; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + tbm_bufmgr_backend backend = NULL; + int ret = 0; + + TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER); + + switch (module->type) { + case TBM_MODULE_TYPE_HAL_TBM: + error = (tbm_error_e)hal_tbm_bufmgr_get_supported_formats(module->hal_bufmgr, formats, num); + break; +/* LCOV_EXCL_START */ + case TBM_MODULE_TYPE_TBM_BACKEND: + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_supported_formats, TBM_ERROR_NOT_SUPPORTED); + + error = bufmgr_func->bufmgr_get_supported_formats(module->bufmgr_data, formats, num); + break; + case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + backend = module->backend; + TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_IF_FAIL(backend->surface_supported_format, TBM_ERROR_NOT_SUPPORTED); + + ret = backend->surface_supported_format(formats, num); + if (!ret) + error = TBM_ERROR_INVALID_OPERATION; + + break; + default: + TBM_ERR("Wrong module type:%d", module->type); + error = TBM_ERROR_INVALID_OPERATION; + break; +/* LCOV_EXCL_STOP */ + } + + return error; +} + +tbm_error_e +tbm_module_bufmgr_get_plane_data(tbm_module *module, int format, int plane_idx, uint32_t w, uint32_t h, + uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx) +{ + tbm_error_e error = TBM_ERROR_NONE; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + tbm_bufmgr_backend backend = NULL; + int ret = 0; + + TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER); + + switch (module->type) { + case TBM_MODULE_TYPE_HAL_TBM: + error = (tbm_error_e)hal_tbm_bufmgr_get_plane_data(module->hal_bufmgr, format, plane_idx, w, h, size, offset, pitch, bo_idx); + break; +/* LCOV_EXCL_START */ + case TBM_MODULE_TYPE_TBM_BACKEND: + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_plane_data, TBM_ERROR_NOT_SUPPORTED); + + error = bufmgr_func->bufmgr_get_plane_data(module->bufmgr_data, format, plane_idx, w, h, size, offset, pitch, bo_idx); + break; + case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + backend = module->backend; + TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_IF_FAIL(backend->surface_get_plane_data, TBM_ERROR_NOT_SUPPORTED); + + ret = backend->surface_get_plane_data(w, h, format, plane_idx, size, offset, pitch, bo_idx); + if (!ret) + error = TBM_ERROR_INVALID_OPERATION; + break; + default: + TBM_ERR("Wrong module type:%d", module->type); + error = TBM_ERROR_INVALID_OPERATION; + break; +/* LCOV_EXCL_STOP */ + } + + return error; +} + +tbm_backend_bo_data * +tbm_module_bufmgr_bo_alloc(tbm_module *module, tbm_bo bo, int size, int flags, tbm_error_e *error) +{ + tbm_backend_bo_data *bo_data = NULL; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + tbm_bufmgr_backend backend = NULL; + + TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); + + switch (module->type) { + case TBM_MODULE_TYPE_HAL_TBM: + bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo(module->hal_bufmgr, size, flags, (hal_tbm_error *)error); + break; +/* LCOV_EXCL_START */ + case TBM_MODULE_TYPE_TBM_BACKEND: + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + + bo_data = module->bufmgr_func->bufmgr_alloc_bo(module->bufmgr_data, (unsigned int)size, flags, error); + break; + case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + backend = module->backend; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_alloc, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + + bo_data = (void *)module->backend->bo_alloc(bo, size, flags); + *error = TBM_ERROR_NONE; + break; + default: + TBM_ERR("Wrong module type:%d", module->type); + *error = TBM_ERROR_INVALID_OPERATION; + break; +/* LCOV_EXCL_STOP */ + } + + return bo_data; +} + +tbm_backend_bo_data * +tbm_module_bufmgr_bo_alloc_with_format(tbm_module *module, int format, int bo_idx, int width, + int height, int bpp, tbm_bo_memory_type flags, tbm_error_e *error) +{ + tbm_backend_bo_data *bo_data = NULL; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + + TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); + + switch (module->type) { + case TBM_MODULE_TYPE_HAL_TBM: + bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo_with_format(module->hal_bufmgr, + format, bo_idx, width, height, bpp, + (hal_tbm_bo_memory_type)flags, (hal_tbm_error *)error); + break; +/* LCOV_EXCL_START */ + case TBM_MODULE_TYPE_TBM_BACKEND: + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo_with_format, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + + bo_data = bufmgr_func->bufmgr_alloc_bo_with_format(module->bufmgr_data, format, bo_idx, width, height, flags, error); + break; + case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + TBM_ERR("error: not supported tbm_bufmgr_internal_alloc_bo_with_format."); + + *error = TBM_ERROR_NOT_SUPPORTED; + break; + default: + TBM_ERR("Wrong module type:%d", module->type); + *error = TBM_ERROR_INVALID_OPERATION; + break; +/* LCOV_EXCL_STOP */ + } + + return bo_data; +} + + +tbm_backend_bo_data * +tbm_module_bufmgr_bo_import_fd(tbm_module *module, tbm_bo bo, tbm_fd fd, tbm_error_e *error) +{ + tbm_backend_bo_data *bo_data = NULL; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + tbm_bufmgr_backend backend = NULL; + + TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); + + switch (module->type) { + case TBM_MODULE_TYPE_HAL_TBM: + bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_fd(module->hal_bufmgr, (hal_tbm_fd)fd, (hal_tbm_error *)error); + break; +/* LCOV_EXCL_START */ + case TBM_MODULE_TYPE_TBM_BACKEND: + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + + bo_data = bufmgr_func->bufmgr_import_fd(module->bufmgr_data, fd, error); + break; + case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + backend = module->backend; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + + bo_data = (void *)backend->bo_import_fd(bo, fd); + if (!bo_data) + *error = TBM_ERROR_INVALID_OPERATION; + else + *error = TBM_ERROR_NONE; + break; + default: + TBM_ERR("Wrong module type:%d", module->type); + *error = TBM_ERROR_INVALID_OPERATION; + break; +/* LCOV_EXCL_STOP */ + } + + return bo_data; +} + +tbm_backend_bo_data * +tbm_module_bufmgr_bo_import_key(tbm_module *module, tbm_bo bo, tbm_key key, tbm_error_e *error) +{ + tbm_backend_bo_data *bo_data = NULL; + tbm_backend_bufmgr_func *bufmgr_func = NULL; + tbm_bufmgr_backend backend = NULL; + + TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); + + switch (module->type) { + case TBM_MODULE_TYPE_HAL_TBM: + bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_key(module->hal_bufmgr, key, (hal_tbm_error *)error); + break; +/* LCOV_EXCL_START */ + case TBM_MODULE_TYPE_TBM_BACKEND: + bufmgr_func = module->bufmgr_func; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_key, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + + bo_data = bufmgr_func->bufmgr_import_key(module->bufmgr_data, key, error); + break; + case TBM_MODULE_TYPE_BUFMGR_BACKEND: + TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + backend = module->backend; + TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + + bo_data = (void *)backend->bo_import(bo, key); + if (!bo_data) + *error = TBM_ERROR_INVALID_OPERATION; + else + *error = TBM_ERROR_NONE; + break; + default: + TBM_ERR("Wrong module type:%d", module->type); + *error = TBM_ERROR_INVALID_OPERATION; + break; +/* LCOV_EXCL_STOP */ + } + + return bo_data; }