1 /**************************************************************************
5 Copyright 2012-2021 Samsung Electronics co., Ltd. All Rights Reserved.
7 Contact: SooChan Lim <sc1.lim@samsung.com>
8 Changyeon Lee <cyeon.lee@samsung.com>
10 Permission is hereby granted, free of charge, to any person obtaining a
11 copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sub license, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 **************************************************************************/
34 #include "tbm_bufmgr_int.h"
35 #include "tbm_bufmgr_backend.h"
36 #include "tbm_drm_helper.h"
38 #define PREFIX_LIB "libtbm_"
39 #define SUFFIX_LIB ".so"
40 #define DEFAULT_LIB PREFIX_LIB"default"SUFFIX_LIB
42 /* values to indicate unspecified fields in XF86ModReqInfo. */
43 #define MAJOR_UNSPEC 0xFF
44 #define MINOR_UNSPEC 0xFF
45 #define PATCH_UNSPEC 0xFFFF
46 #define ABI_VERS_UNSPEC 0xFFFFFFFF
48 #define MODULE_VERSION_NUMERIC(maj, min, patch) \
49 ((((maj) & 0xFF) << 24) | (((min) & 0xFF) << 16) | (patch & 0xFFFF))
50 #define GET_MODULE_MAJOR_VERSION(vers) (((vers) >> 24) & 0xFF)
51 #define GET_MODULE_MINOR_VERSION(vers) (((vers) >> 16) & 0xFF)
52 #define GET_MODULE_PATCHLEVEL(vers) ((vers) & 0xFFFF)
56 _tbm_backend_load_hal_tbm(tbm_module *module)
58 hal_tbm_backend *hal_backend = NULL;
59 hal_tbm_bufmgr *hal_bufmgr;
60 hal_tbm_error ret = HAL_TBM_ERROR_NONE;
61 hal_tbm_fd auth_drm_fd = -1;
63 hal_backend = hal_tbm_get_backend(&ret);
64 if (hal_backend == NULL || ret != HAL_TBM_ERROR_NONE) {
65 TBM_ERR("get backend fail");
69 hal_bufmgr = hal_tbm_backend_get_bufmgr(hal_backend, &ret);
70 if (hal_bufmgr == NULL || ret != HAL_TBM_ERROR_NONE) {
71 TBM_ERR("get hal_bufmgr fail");
72 goto get_backend_fail;
75 if (hal_tbm_backend_has_drm_device(hal_backend, &ret)) {
76 auth_drm_fd = hal_tbm_backend_get_master_drm_fd(hal_backend, &ret);
77 if (auth_drm_fd < 0) {
78 TBM_INFO("tbm_backend has no master drm_fd.");
80 auth_drm_fd = tbm_drm_helper_get_master_fd();
81 if (auth_drm_fd < 0) {
82 TBM_INFO("libtbm requests an authenticated drm_fd to a process(display server).");
83 if (!tbm_drm_helper_get_auth_info(&auth_drm_fd, NULL, NULL)) {
84 TBM_ERR("get auth drm_fd fail");
85 goto get_backend_fail;
88 TBM_INFO("libtbm gets a master drm_fd from libtdm via tbm_drm_helper.");
91 TBM_INFO("libtbm sends a master drm_fd as an authentiated drm_fd to tbm_backend.");
92 ret = hal_tbm_backend_set_authenticated_drm_fd(hal_backend, auth_drm_fd);
93 if (ret != HAL_TBM_ERROR_NONE) {
94 TBM_ERR("hal_tbm_backend_set_authenticated_drm_fd failed.");
95 goto get_backend_fail;
98 TBM_INFO("tbm_backend has a master drm_fd.");
100 tbm_drm_helper_set_tbm_master_fd(auth_drm_fd);
102 tbm_drm_helper_set_fd(auth_drm_fd);
105 module->hal_backend = hal_backend;
106 module->hal_bufmgr = hal_bufmgr;
108 module->use_hal_tbm = 1;
110 TBM_INFO("use HAL-TBM_API");
115 if (auth_drm_fd >= 0)
117 hal_tbm_put_backend(hal_backend);
122 _check_version(TBMModuleVersionInfo *data)
124 int backend_module_major, backend_module_minor;
125 int tbm_backend_major, tbm_backend_minor;
127 backend_module_major = GET_ABI_MAJOR(data->abiversion);
128 backend_module_minor = GET_ABI_MINOR(data->abiversion);
130 TBM_DBG("TBM module %s: vendor=\"%s\" ABI=%d,%d\n",
131 data->modname ? data->modname : "UNKNOWN!",
132 data->vendor ? data->vendor : "UNKNOWN!", backend_module_major, backend_module_minor);
134 tbm_backend_major = GET_ABI_MAJOR(TBM_ABI_VERSION);
135 tbm_backend_minor = GET_ABI_MINOR(TBM_ABI_VERSION);
137 TBM_DBG("TBM ABI version %d.%d\n",
138 tbm_backend_major, tbm_backend_minor);
140 if (backend_module_major != tbm_backend_major) {
141 TBM_ERR("TBM module ABI major ver(%d) doesn't match the TBM's ver(%d)\n",
142 backend_module_major, tbm_backend_major);
144 } else if (backend_module_minor > tbm_backend_minor) {
145 TBM_ERR("TBM module ABI minor ver(%d) is newer than the TBM's ver(%d)\n",
146 backend_module_minor, tbm_backend_minor);
154 _tbm_backend_check_bufmgr_func(tbm_backend_bufmgr_func *bufmgr_func)
156 TBM_RETURN_VAL_IF_FAIL(bufmgr_func, 0); /* mandatory symbol */
157 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_capabilities, 0); /* mandatory symbol */
158 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_bind_native_display, 0); /* mandatory symbol */
159 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_supported_formats, 0); /* mandatory symbol */
160 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_plane_data, 0); /* mandatory symbol */
161 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, 0); /* mandatory symbol */
162 if (!bufmgr_func->bufmgr_alloc_bo_with_format)
163 TBM_DBG("No bufmgr_func->bufmgr_alloc_bo_with_format.");
164 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_import_fd, 0); /* mandatory symbol */
165 if (!bufmgr_func->bufmgr_import_key)
166 TBM_DBG("No bufmgr_func->bo_export_key.");
172 _tbm_backend_check_bufmgr_bo(tbm_backend_bo_func *bo_func)
174 TBM_RETURN_VAL_IF_FAIL(bo_func, 0); /* mandatory symbol */
175 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_free, 0); /* mandatory symbol */
176 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_get_size, 0); /* mandatory symbol */
177 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_get_memory_types, 0); /* mandatory symbol */
178 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_get_handle, 0); /* mandatory symbol */
179 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_map, 0); /* mandatory symbol */
180 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_unmap, 0); /* mandatory symbol */
181 if (!bo_func->bo_lock)
182 TBM_DBG("No bo_func->bo_lock.");
183 if (!bo_func->bo_unlock)
184 TBM_DBG("No bo_func->bo_unlock.");
185 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_export_fd, 0); /* mandatory symbol */
186 if (!bo_func->bo_export_key)
187 TBM_INFO("No bo_func->bo_export_key.");
193 _tbm_backend_load_module(tbm_module *module, const char *file)
195 char path[PATH_MAX] = {0, };
196 void *module_data = NULL;
197 tbm_backend_module *backend_module_data = NULL;
198 tbm_backend_bufmgr_data *bufmgr_data = NULL;
199 int backend_module_major, backend_module_minor;
200 int tbm_backend_major, tbm_backend_minor;
203 snprintf(path, sizeof(path), BUFMGR_MODULE_DIR "/%s", file);
205 module_data = dlopen(path, RTLD_LAZY);
207 TBM_ERR("failed to load module: %s(%s)\n", dlerror(), file);
211 backend_module_data = dlsym(module_data, "tbm_backend_module_data");
212 if (!backend_module_data) {
213 TBM_ERR("Error: module does not have data object.\n");
217 tbm_backend_major = GET_ABI_MAJOR(TBM_BACKEND_ABI_LATEST_VERSION);
218 tbm_backend_minor = GET_ABI_MINOR(TBM_BACKEND_ABI_LATEST_VERSION);
219 TBM_INFO("TBM Backend ABI version %d.%d\n", tbm_backend_major, tbm_backend_minor);
221 backend_module_major = GET_ABI_MAJOR(backend_module_data->abi_version);
222 backend_module_minor = GET_ABI_MINOR(backend_module_data->abi_version);
224 TBM_INFO("TBM module %s: vendor=\"%s\" Backend ABI version=%d.%d\n",
225 backend_module_data->name ? backend_module_data->name : "UNKNOWN!",
226 backend_module_data->vendor ? backend_module_data->vendor : "UNKNOWN!",
227 backend_module_major, backend_module_minor);
229 if (backend_module_major > tbm_backend_major) {
230 TBM_ERR("TBM module ABI major ver(%d) is newer than the TBM's ver(%d)\n",
231 backend_module_major, tbm_backend_major);
233 } else if (backend_module_minor > tbm_backend_minor) {
234 TBM_ERR("TBM module ABI minor ver(%d) is newer than the TBM's ver(%d)\n",
235 backend_module_minor, tbm_backend_minor);
239 if (!backend_module_data->init) {
240 TBM_ERR("Error: module does not supply init symbol.\n");
244 if (!backend_module_data->deinit) {
245 TBM_ERR("Error: module does not supply deinit symbol.\n");
249 bufmgr_data = backend_module_data->init((tbm_bufmgr)module, &error);
251 TBM_ERR("Fail to init module(%s)\n", file);
255 /* check the mandatory symbols of the backend module */
256 if (!_tbm_backend_check_bufmgr_func(module->bufmgr_func)) {
257 TBM_ERR("Fail to check the bufmgr_func symboles.");
261 if (!_tbm_backend_check_bufmgr_bo(module->bo_func)) {
262 TBM_ERR("Fail to check the bufmgr_bo symboles.");
266 module->module_data = module_data;
267 module->backend_module_data = backend_module_data;
268 module->bufmgr_data = bufmgr_data;
270 TBM_INFO("Success to load module(%s)\n", file);
276 module->backend_module_data->deinit(bufmgr_data);
278 dlclose(module_data);
284 _tbm_backend_load_bufmgr_module(tbm_module *module, int fd, const char *file)
286 char path[PATH_MAX] = {0, };
287 TBMModuleVersionInfo *vers;
288 TBMModuleData *initdata;
292 snprintf(path, sizeof(path), BUFMGR_MODULE_DIR "/%s", file);
294 module_data = dlopen(path, RTLD_LAZY);
296 TBM_ERR("failed to load module: %s(%s)\n", dlerror(), file);
300 initdata = dlsym(module_data, "tbmModuleData");
302 TBM_ERR("Error: module does not have data object.\n");
306 vers = initdata->vers;
308 TBM_ERR("Error: module does not supply version information.\n");
312 init = initdata->init;
314 TBM_ERR("Error: module does not supply init symbol.\n");
318 if (!_check_version(vers)) {
319 TBM_ERR("Fail to check version.\n");
323 if (!init((tbm_bufmgr)module, fd)) {
324 TBM_ERR("Fail to init module(%s)\n", file);
328 if (!module->backend || !module->backend->priv) {
329 TBM_ERR("Error: module(%s) wrong operation. Check backend or backend's priv.\n", file);
333 module->module_data = module_data;
335 TBM_DBG("Success to load module(%s)\n", file);
340 dlclose(module_data);
346 tbm_module_load(int fd)
349 struct dirent **namelist;
352 module = calloc(1, sizeof(struct _tbm_module));
354 TBM_ERR("fail to allocate the memory");
358 /* try to load the hal-tbm backend module */
359 ret = _tbm_backend_load_hal_tbm(module);
361 module->type = TBM_MODULE_TYPE_HAL_TBM;
365 /* LCOV_EXCL_START */
366 /* try to load the new backend module */
367 ret = _tbm_backend_load_module(module, DEFAULT_LIB);
369 module->type = TBM_MODULE_TYPE_TBM_BACKEND;
373 /* try to load the old(deprecated) backend mdoule */
374 ret = _tbm_backend_load_bufmgr_module(module, fd, DEFAULT_LIB);
376 module->type = TBM_MODULE_TYPE_BUFMGR_BACKEND;
380 /* load backend_module from configured path */
381 n = scandir(BUFMGR_MODULE_DIR, &namelist, 0, alphasort);
383 TBM_ERR("no files : %s\n", BUFMGR_MODULE_DIR);
384 tbm_module_unload(module);
389 if (!ret && strstr(namelist[n]->d_name, PREFIX_LIB)) {
390 const char *p = strstr(namelist[n]->d_name, SUFFIX_LIB);
392 if (p && !strcmp(p, SUFFIX_LIB)) {
393 ret = _tbm_backend_load_module(module, namelist[n]->d_name);
395 module->type = TBM_MODULE_TYPE_TBM_BACKEND;
397 ret = _tbm_backend_load_bufmgr_module(module, fd, namelist[n]->d_name);
398 module->type = TBM_MODULE_TYPE_BUFMGR_BACKEND;
419 tbm_module_unload(tbm_module *module)
421 switch (module->type) {
422 case TBM_MODULE_TYPE_HAL_TBM:
423 if (module->auth_wl_socket_created) {
424 tbm_drm_helper_wl_auth_server_deinit();
425 close(module->auth_fd);
427 tbm_drm_helper_unset_tbm_master_fd();
428 tbm_drm_helper_unset_fd();
430 hal_tbm_put_backend(module->hal_backend);
431 module->hal_backend = NULL;
432 module->hal_bufmgr = NULL;
433 module->use_hal_tbm = 0;
435 /* LCOV_EXCL_START */
436 case TBM_MODULE_TYPE_TBM_BACKEND:
437 module->backend_module_data->deinit(module->bufmgr_data);
438 module->bo_func = NULL;
439 module->bufmgr_func = NULL;
440 module->bufmgr_data = NULL;
441 module->backend_module_data = NULL;
443 dlclose(module->module_data);
445 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
446 module->backend->bufmgr_deinit(module->backend->priv);
447 module->backend->priv = NULL;
448 tbm_backend_free(module->backend);
449 module->backend = NULL;
451 dlclose(module->module_data);
454 TBM_ERR("Wrong module type:%d", module->type);
463 tbm_module_get_capabilities(tbm_module *module, tbm_error_e *error)
465 int capabilities = 0;
466 tbm_backend_bufmgr_func *bufmgr_func = NULL;
468 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, TBM_BUFMGR_CAPABILITY_NONE, *error, TBM_ERROR_INVALID_PARAMETER);
470 switch (module->type) {
471 case TBM_MODULE_TYPE_HAL_TBM:
472 capabilities = hal_tbm_bufmgr_get_capabilities(module->hal_bufmgr, (hal_tbm_error *)error);
474 /* LCOV_EXCL_START */
475 case TBM_MODULE_TYPE_TBM_BACKEND:
476 bufmgr_func = module->bufmgr_func;
477 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
478 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_get_capabilities, 0, *error, TBM_ERROR_NOT_SUPPORTED);
480 capabilities = module->bufmgr_func->bufmgr_get_capabilities(module->bufmgr_data, error);
482 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
483 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
484 TBM_ERR("Do not support at tbm_bufmgr_backend.");
486 *error = TBM_ERROR_NOT_SUPPORTED;
489 TBM_ERR("Wrong module type:%d", module->type);
490 *error = TBM_ERROR_INVALID_OPERATION;
499 tbm_module_bind_native_display(tbm_module *module, void *native_display)
501 tbm_error_e error = TBM_ERROR_NONE;
502 tbm_backend_bufmgr_func *bufmgr_func = NULL;
503 tbm_bufmgr_backend backend = NULL;
506 TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
508 switch (module->type) {
509 case TBM_MODULE_TYPE_HAL_TBM:
510 if (hal_tbm_backend_has_drm_device(module->hal_backend, &ret)) {
511 int fd = tbm_drm_helper_get_fd(); // this must be the auth drm_fd.(master drm_fd);
513 TBM_ERR("error: module(%p) native_display(%p)\n", module, native_display);
514 return TBM_ERROR_INVALID_OPERATION;
517 // make the wayland server socket for sending the authenticated drm_fd to wayland clients.
518 if (!tbm_drm_helper_wl_auth_server_init(native_display, fd, NULL, 0)) {
519 TBM_ERR("error: tbm_drm_helper_wl_auth_server_init failed\n", module, native_display);
521 return TBM_ERROR_INVALID_OPERATION;
523 TBM_INFO("tbm creates a wayland socket for authentication of drm_fd.");
525 module->auth_wl_socket_created = 1;
526 module->auth_fd = fd;
528 TBM_INFO("tbm_module has no drm device.");
529 error = TBM_ERROR_NONE;
532 /* LCOV_EXCL_START */
533 case TBM_MODULE_TYPE_TBM_BACKEND:
534 bufmgr_func = module->bufmgr_func;
535 TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION);
536 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_bind_native_display, TBM_ERROR_NOT_SUPPORTED);
538 error = bufmgr_func->bufmgr_bind_native_display(module->bufmgr_data, (tbm_native_display *)native_display);
540 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
541 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
542 backend = module->backend;
543 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
544 TBM_RETURN_VAL_IF_FAIL(backend->bufmgr_bind_native_display, TBM_ERROR_NOT_SUPPORTED);
546 ret = backend->bufmgr_bind_native_display((tbm_bufmgr)module, native_display);
548 error = TBM_ERROR_INVALID_OPERATION;
552 TBM_ERR("Wrong module type:%d", module->type);
553 error = TBM_ERROR_INVALID_OPERATION;
562 tbm_module_get_supported_formats(tbm_module *module, uint32_t **formats, uint32_t *num)
564 tbm_error_e error = TBM_ERROR_NONE;
565 tbm_backend_bufmgr_func *bufmgr_func = NULL;
566 tbm_bufmgr_backend backend = NULL;
569 TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
571 switch (module->type) {
572 case TBM_MODULE_TYPE_HAL_TBM:
573 error = (tbm_error_e)hal_tbm_bufmgr_get_supported_formats(module->hal_bufmgr, formats, num);
575 /* LCOV_EXCL_START */
576 case TBM_MODULE_TYPE_TBM_BACKEND:
577 bufmgr_func = module->bufmgr_func;
578 TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION);
579 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_supported_formats, TBM_ERROR_NOT_SUPPORTED);
581 error = bufmgr_func->bufmgr_get_supported_formats(module->bufmgr_data, formats, num);
583 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
584 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
585 backend = module->backend;
586 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
587 TBM_RETURN_VAL_IF_FAIL(backend->surface_supported_format, TBM_ERROR_NOT_SUPPORTED);
589 ret = backend->surface_supported_format(formats, num);
591 error = TBM_ERROR_INVALID_OPERATION;
595 TBM_ERR("Wrong module type:%d", module->type);
596 error = TBM_ERROR_INVALID_OPERATION;
605 tbm_module_get_plane_data(tbm_module *module, int format, int plane_idx, uint32_t w, uint32_t h,
606 uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
608 tbm_error_e error = TBM_ERROR_NONE;
609 tbm_backend_bufmgr_func *bufmgr_func = NULL;
610 tbm_bufmgr_backend backend = NULL;
613 TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
615 switch (module->type) {
616 case TBM_MODULE_TYPE_HAL_TBM:
617 error = (tbm_error_e)hal_tbm_bufmgr_get_plane_data(module->hal_bufmgr, format, plane_idx, w, h, size, offset, pitch, bo_idx);
619 /* LCOV_EXCL_START */
620 case TBM_MODULE_TYPE_TBM_BACKEND:
621 bufmgr_func = module->bufmgr_func;
622 TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION);
623 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_plane_data, TBM_ERROR_NOT_SUPPORTED);
625 error = bufmgr_func->bufmgr_get_plane_data(module->bufmgr_data, format, plane_idx, w, h, size, offset, pitch, bo_idx);
627 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
628 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
629 backend = module->backend;
630 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
631 TBM_RETURN_VAL_IF_FAIL(backend->surface_get_plane_data, TBM_ERROR_NOT_SUPPORTED);
633 ret = backend->surface_get_plane_data(w, h, format, plane_idx, size, offset, pitch, bo_idx);
635 error = TBM_ERROR_INVALID_OPERATION;
638 TBM_ERR("Wrong module type:%d", module->type);
639 error = TBM_ERROR_INVALID_OPERATION;
647 tbm_backend_surface_data *
648 tbm_module_alloc_surface_data(tbm_module *module, int width, int height, int format, int flags, tbm_error_e *error)
650 tbm_backend_surface_data *surface_data = NULL;
652 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
653 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module->type == TBM_MODULE_TYPE_HAL_TBM, NULL, *error, TBM_ERROR_INVALID_OPERATION);
655 surface_data = calloc(1, sizeof(struct _tbm_backend_surface_data));
657 TBM_ERR("memory allocation failed.");
658 *error = TBM_ERROR_OUT_OF_MEMORY;
662 surface_data->hal_surface = hal_tbm_bufmgr_alloc_surface(module->hal_bufmgr,
665 (hal_tbm_format)format,
666 (hal_tbm_bo_memory_type)flags,
669 (hal_tbm_error *)error);
670 if (!surface_data->hal_surface) {
671 TBM_ERR("hal_tbm_bufmgr_alloc_surface failed.");
672 *error = TBM_ERROR_INVALID_OPERATION;
677 surface_data->module = module;
682 tbm_backend_surface_data *
683 tbm_module_import_surface_data(tbm_module *module, int width, int height, int format, tbm_surface_buffer_data *buffer_data, tbm_error_e *error)
685 tbm_backend_surface_data *surface_data = NULL;
687 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
688 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module->type == TBM_MODULE_TYPE_HAL_TBM, NULL, *error, TBM_ERROR_INVALID_OPERATION);
690 surface_data = calloc(1, sizeof(struct _tbm_backend_surface_data));
692 TBM_ERR("memory allocation failed.");
693 *error = TBM_ERROR_OUT_OF_MEMORY;
697 surface_data->hal_surface = hal_tbm_bufmgr_import_surface(module->hal_bufmgr,
700 (hal_tbm_format)format,
701 (hal_tbm_surface_buffer_data *)buffer_data,
702 (hal_tbm_error *)error);
703 if (!surface_data->hal_surface) {
704 TBM_ERR("hal_tbm_bufmgr_import_surface failed. width:%d height:%d format:%d error:%s",
705 width, height, format, tbm_error_str(*error));
710 surface_data->module = module;
715 tbm_backend_bo_data *
716 tbm_module_alloc_bo_data(tbm_module *module, tbm_bo bo, int size, int flags, tbm_error_e *error)
718 tbm_backend_bo_data *bo_data = NULL;
719 tbm_backend_bufmgr_func *bufmgr_func = NULL;
720 tbm_bufmgr_backend backend = NULL;
722 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
724 switch (module->type) {
725 case TBM_MODULE_TYPE_HAL_TBM:
726 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo(module->hal_bufmgr, size, flags, (hal_tbm_error *)error);
728 /* LCOV_EXCL_START */
729 case TBM_MODULE_TYPE_TBM_BACKEND:
730 bufmgr_func = module->bufmgr_func;
731 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
732 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
734 bo_data = module->bufmgr_func->bufmgr_alloc_bo(module->bufmgr_data, (unsigned int)size, flags, error);
736 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
737 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
738 backend = module->backend;
739 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION);
740 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_alloc, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
742 bo_data = (void *)module->backend->bo_alloc(bo, size, flags);
743 *error = TBM_ERROR_NONE;
746 TBM_ERR("Wrong module type:%d", module->type);
747 *error = TBM_ERROR_INVALID_OPERATION;
755 tbm_backend_bo_data *
756 tbm_module_alloc_bo_data_with_format(tbm_module *module, int format, int bo_idx, int width,
757 int height, int bpp, tbm_bo_memory_type flags, tbm_error_e *error)
759 tbm_backend_bo_data *bo_data = NULL;
760 tbm_backend_bufmgr_func *bufmgr_func = NULL;
762 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
764 switch (module->type) {
765 case TBM_MODULE_TYPE_HAL_TBM:
766 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo_with_format(module->hal_bufmgr,
767 format, bo_idx, width, height, bpp,
768 (hal_tbm_bo_memory_type)flags, (hal_tbm_error *)error);
770 /* LCOV_EXCL_START */
771 case TBM_MODULE_TYPE_TBM_BACKEND:
772 bufmgr_func = module->bufmgr_func;
773 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
774 if (!bufmgr_func->bufmgr_alloc_bo_with_format) {
775 *error = TBM_ERROR_NOT_SUPPORTED;
779 bo_data = bufmgr_func->bufmgr_alloc_bo_with_format(module->bufmgr_data, format, bo_idx, width, height, flags, error);
781 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
782 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
783 TBM_ERR("error: not supported tbm_bufmgr_internal_alloc_bo_with_format.");
785 *error = TBM_ERROR_NOT_SUPPORTED;
788 TBM_ERR("Wrong module type:%d", module->type);
789 *error = TBM_ERROR_INVALID_OPERATION;
798 tbm_backend_bo_data *
799 tbm_module_import_bo_data_with_fd(tbm_module *module, tbm_bo bo, tbm_fd fd, tbm_error_e *error)
801 tbm_backend_bo_data *bo_data = NULL;
802 tbm_backend_bufmgr_func *bufmgr_func = NULL;
803 tbm_bufmgr_backend backend = NULL;
805 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
807 switch (module->type) {
808 case TBM_MODULE_TYPE_HAL_TBM:
809 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_fd(module->hal_bufmgr, (hal_tbm_fd)fd, (hal_tbm_error *)error);
811 /* LCOV_EXCL_START */
812 case TBM_MODULE_TYPE_TBM_BACKEND:
813 bufmgr_func = module->bufmgr_func;
814 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
815 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
817 bo_data = bufmgr_func->bufmgr_import_fd(module->bufmgr_data, fd, error);
819 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
820 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
821 backend = module->backend;
822 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION);
823 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
825 bo_data = (void *)backend->bo_import_fd(bo, fd);
827 *error = TBM_ERROR_INVALID_OPERATION;
829 *error = TBM_ERROR_NONE;
832 TBM_ERR("Wrong module type:%d", module->type);
833 *error = TBM_ERROR_INVALID_OPERATION;
841 tbm_backend_bo_data *
842 tbm_module_import_bo_data_with_key(tbm_module *module, tbm_bo bo, tbm_key key, tbm_error_e *error)
844 tbm_backend_bo_data *bo_data = NULL;
845 tbm_backend_bufmgr_func *bufmgr_func = NULL;
846 tbm_bufmgr_backend backend = NULL;
848 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
850 switch (module->type) {
851 case TBM_MODULE_TYPE_HAL_TBM:
852 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_key(module->hal_bufmgr, key, (hal_tbm_error *)error);
854 /* LCOV_EXCL_START */
855 case TBM_MODULE_TYPE_TBM_BACKEND:
856 bufmgr_func = module->bufmgr_func;
857 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
858 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_key, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
860 bo_data = bufmgr_func->bufmgr_import_key(module->bufmgr_data, key, error);
862 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
863 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
864 backend = module->backend;
865 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION);
866 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
868 bo_data = (void *)backend->bo_import(bo, key);
870 *error = TBM_ERROR_INVALID_OPERATION;
872 *error = TBM_ERROR_NONE;
875 TBM_ERR("Wrong module type:%d", module->type);
876 *error = TBM_ERROR_INVALID_OPERATION;
885 tbm_surface_data_free(tbm_backend_surface_data *surface_data)
887 TBM_RETURN_IF_FAIL(surface_data);
888 TBM_RETURN_IF_FAIL(surface_data->module);
889 TBM_RETURN_IF_FAIL(surface_data->module->type == TBM_MODULE_TYPE_HAL_TBM);
891 surface_data->module = NULL;
893 hal_tbm_surface_free(surface_data->hal_surface);
894 surface_data->hal_surface = NULL;
900 tbm_surface_data_get_plane_data(tbm_backend_surface_data *surface_data, int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
904 TBM_RETURN_VAL_IF_FAIL(surface_data, TBM_ERROR_INVALID_PARAMETER);
905 TBM_RETURN_VAL_IF_FAIL(surface_data->hal_surface, TBM_ERROR_NOT_SUPPORTED);
907 error = (tbm_error_e)hal_tbm_surface_get_plane_data(surface_data->hal_surface, plane_idx, size, offset, pitch, bo_idx);
908 TBM_RETURN_VAL_IF_FAIL(error == TBM_ERROR_NONE, error);
910 return TBM_ERROR_NONE;
913 tbm_backend_bo_data **
914 tbm_surface_data_get_bo_data_array(tbm_backend_surface_data *surface_data, int *num_bos, tbm_error_e *error)
916 hal_tbm_bo **hal_bos = NULL;
918 TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
919 TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data->hal_surface, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
921 hal_bos = hal_tbm_surface_get_bos(surface_data->hal_surface, num_bos, (hal_tbm_error *)error);
922 TBM_RETURN_VAL_IF_FAIL(hal_bos, NULL);
924 return (tbm_backend_bo_data **)hal_bos;
927 tbm_surface_buffer_data *
928 tbm_surface_data_export(tbm_backend_surface_data *surface_data, tbm_error_e *error)
930 tbm_surface_buffer_data *buffer_data;
932 TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
933 TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data->hal_surface, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
935 buffer_data = (tbm_surface_buffer_data *)hal_tbm_surface_export((hal_tbm_surface *)surface_data->hal_surface,
936 (hal_tbm_error *)error);
937 TBM_RETURN_VAL_IF_FAIL(buffer_data, NULL);
943 tbm_module_bo_free(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int get_from_hal_surface)
945 tbm_backend_bo_func *bo_func = NULL;
946 tbm_bufmgr_backend backend = NULL;
948 TBM_RETURN_IF_FAIL(module);
949 TBM_RETURN_IF_FAIL(bo);
950 TBM_RETURN_IF_FAIL(bo_data);
952 switch (module->type) {
953 case TBM_MODULE_TYPE_HAL_TBM:
954 // call hal_tbm_bo_free when bo is created by tbm_bo_alloc api.
955 if (!get_from_hal_surface)
956 hal_tbm_bo_free(bo_data);
958 /* LCOV_EXCL_START */
959 case TBM_MODULE_TYPE_TBM_BACKEND:
960 bo_func = module->bo_func;
961 TBM_RETURN_IF_FAIL(bo_func);
962 TBM_RETURN_IF_FAIL(bo_func->bo_free);
964 bo_func->bo_free(bo_data);
966 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
967 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
968 backend = module->backend;
969 TBM_RETURN_IF_FAIL(backend);
970 TBM_RETURN_IF_FAIL(backend->bo_free);
972 backend->bo_free(bo);
975 TBM_ERR("Wrong module type:%d", module->type);
982 tbm_module_bo_get_size(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
984 tbm_backend_bo_func *bo_func = NULL;
985 tbm_bufmgr_backend backend = NULL;
988 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
990 switch (module->type) {
991 case TBM_MODULE_TYPE_HAL_TBM:
992 size = hal_tbm_bo_get_size((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
994 /* LCOV_EXCL_START */
995 case TBM_MODULE_TYPE_TBM_BACKEND:
996 bo_func = module->bo_func;
997 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
998 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_size, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1000 size = bo_func->bo_get_size(bo_data, error);
1002 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1003 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1004 backend = module->backend;
1005 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
1006 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_size, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1008 size = backend->bo_size(bo);
1010 *error = TBM_ERROR_INVALID_OPERATION;
1012 *error = TBM_ERROR_NONE;
1015 TBM_ERR("Wrong module type:%d", module->type);
1016 *error = TBM_ERROR_INVALID_OPERATION;
1018 /* LCOV_EXCL_STOP */
1025 tbm_module_bo_get_memory_types(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
1027 tbm_backend_bo_func *bo_func = NULL;
1028 tbm_bufmgr_backend backend = NULL;
1029 int memory_types = TBM_BO_DEFAULT;
1031 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1033 switch (module->type) {
1034 case TBM_MODULE_TYPE_HAL_TBM:
1035 memory_types = (tbm_bo_memory_type)hal_tbm_bo_get_memory_types((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
1037 /* LCOV_EXCL_START */
1038 case TBM_MODULE_TYPE_TBM_BACKEND:
1039 bo_func = module->bo_func;
1040 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
1041 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_memory_types, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1043 memory_types = bo_func->bo_get_memory_types(bo_data, error);
1045 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1046 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1047 backend = module->backend;
1048 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
1049 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_get_flags, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1051 memory_types = backend->bo_get_flags(bo);
1052 *error = TBM_ERROR_NONE;
1055 TBM_ERR("Wrong module type:%d", module->type);
1056 *error = TBM_ERROR_INVALID_OPERATION;
1058 /* LCOV_EXCL_STOP */
1061 return memory_types;
1065 tbm_module_bo_get_handle(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int device, tbm_error_e *error)
1067 tbm_backend_bo_func *bo_func = NULL;
1068 tbm_bufmgr_backend backend = NULL;
1069 tbm_bo_handle bo_handle = (tbm_bo_handle)NULL;
1070 hal_tbm_bo_handle hbo_handle;
1072 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1074 switch (module->type) {
1075 case TBM_MODULE_TYPE_HAL_TBM:
1076 hbo_handle = hal_tbm_bo_get_handle((hal_tbm_bo *)bo_data, device, (hal_tbm_error *)error);
1077 if (hbo_handle.ptr != NULL)
1078 memcpy(&bo_handle.ptr, &hbo_handle.ptr, sizeof(tbm_bo_handle));
1080 /* LCOV_EXCL_START */
1081 case TBM_MODULE_TYPE_TBM_BACKEND:
1082 bo_func = module->bo_func;
1083 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1084 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_handle, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1086 bo_handle = bo_func->bo_get_handle(bo_data, device, error);
1088 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1089 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1090 backend = module->backend;
1091 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1092 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_get_handle, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1094 bo_handle = backend->bo_get_handle(bo, device);
1096 *error = TBM_ERROR_INVALID_OPERATION;
1098 *error = TBM_ERROR_NONE;
1101 TBM_ERR("Wrong module type:%d", module->type);
1102 bo_handle.ptr = NULL;
1103 *error = TBM_ERROR_INVALID_OPERATION;
1105 /* LCOV_EXCL_STOP */
1112 tbm_module_bo_map(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int device, int opt, tbm_error_e *error)
1114 tbm_backend_bo_func *bo_func = NULL;
1115 tbm_bufmgr_backend backend = NULL;
1116 tbm_bo_handle bo_handle = (tbm_bo_handle)NULL;
1117 hal_tbm_bo_handle hbo_handle;
1119 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1121 switch (module->type) {
1122 case TBM_MODULE_TYPE_HAL_TBM:
1123 hbo_handle = hal_tbm_bo_map((hal_tbm_bo *)bo_data, device, opt, (hal_tbm_error *)error);
1124 if (hbo_handle.ptr != NULL)
1125 memcpy(&bo_handle.ptr, &hbo_handle.ptr, sizeof(tbm_bo_handle));
1127 /* LCOV_EXCL_START */
1128 case TBM_MODULE_TYPE_TBM_BACKEND:
1129 bo_func = module->bo_func;
1130 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1131 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_map, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1133 bo_handle = bo_func->bo_map(bo_data, device, opt, error);
1135 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1136 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1137 backend = module->backend;
1138 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1139 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_map, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1141 bo_handle = backend->bo_map(bo, device, opt);
1143 *error = TBM_ERROR_INVALID_OPERATION;
1145 *error = TBM_ERROR_NONE;
1148 TBM_ERR("Wrong module type:%d", module->type);
1149 bo_handle.ptr = NULL;
1150 *error = TBM_ERROR_INVALID_OPERATION;
1152 /* LCOV_EXCL_STOP */
1159 tbm_module_bo_unmap(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data)
1161 tbm_backend_bo_func *bo_func = NULL;
1162 tbm_bufmgr_backend backend = NULL;
1166 TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
1168 switch (module->type) {
1169 case TBM_MODULE_TYPE_HAL_TBM:
1170 error = (hal_tbm_error)hal_tbm_bo_unmap((hal_tbm_bo *)bo_data);
1172 /* LCOV_EXCL_START */
1173 case TBM_MODULE_TYPE_TBM_BACKEND:
1174 bo_func = module->bo_func;
1175 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1176 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_unmap, TBM_ERROR_NOT_SUPPORTED);
1178 error = bo_func->bo_unmap(bo->bo_data);
1180 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1181 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1182 backend = module->backend;
1183 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1184 TBM_RETURN_VAL_IF_FAIL(backend->bo_unmap, TBM_ERROR_NOT_SUPPORTED);
1186 ret = bo->bufmgr->backend->bo_unmap(bo);
1188 error = TBM_ERROR_INVALID_OPERATION;
1190 error = TBM_ERROR_NONE;
1193 TBM_ERR("Wrong module type:%d", module->type);
1194 error = TBM_ERROR_INVALID_OPERATION;
1196 /* LCOV_EXCL_STOP */
1203 tbm_module_bo_lock(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int device, int opt)
1205 tbm_backend_bo_func *bo_func = NULL;
1206 tbm_bufmgr_backend backend = NULL;
1210 TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
1212 switch (module->type) {
1213 case TBM_MODULE_TYPE_HAL_TBM:
1214 error = (tbm_error_e)hal_tbm_bo_lock((hal_tbm_bo *)bo_data, device, opt);
1216 /* LCOV_EXCL_START */
1217 case TBM_MODULE_TYPE_TBM_BACKEND:
1218 bo_func = module->bo_func;
1219 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1220 if (!bo_func->bo_lock)
1221 return TBM_ERROR_NOT_SUPPORTED;
1223 error = bo_func->bo_lock(bo_data, device, opt);
1225 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1226 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1227 backend = module->backend;
1228 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1229 if (!backend->bo_unmap)
1230 return TBM_ERROR_NOT_SUPPORTED;
1232 ret = backend->bo_lock(bo, device, opt);
1234 error = TBM_ERROR_INVALID_OPERATION;
1236 error = TBM_ERROR_NONE;
1239 TBM_ERR("Wrong module type:%d", module->type);
1240 error = TBM_ERROR_INVALID_OPERATION;
1242 /* LCOV_EXCL_STOP */
1249 tbm_module_bo_unlock(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data)
1251 tbm_backend_bo_func *bo_func = NULL;
1252 tbm_bufmgr_backend backend = NULL;
1255 TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
1257 switch (module->type) {
1258 case TBM_MODULE_TYPE_HAL_TBM:
1259 error = (tbm_error_e)hal_tbm_bo_unlock((hal_tbm_bo *)bo_data);
1261 /* LCOV_EXCL_START */
1262 case TBM_MODULE_TYPE_TBM_BACKEND:
1263 bo_func = module->bo_func;
1264 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1265 if (!bo_func->bo_unlock)
1266 return TBM_ERROR_NOT_SUPPORTED;
1268 error = bo_func->bo_unlock(bo->bo_data);
1270 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1271 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1272 backend = module->backend;
1273 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1274 if (!backend->bo_unlock)
1275 return TBM_ERROR_NOT_SUPPORTED;
1277 backend->bo_unlock(bo);
1278 error = TBM_ERROR_NONE;
1281 TBM_ERR("Wrong module type:%d", module->type);
1282 error = TBM_ERROR_INVALID_OPERATION;
1284 /* LCOV_EXCL_STOP */
1291 tbm_module_bo_export_fd(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
1293 tbm_backend_bo_func *bo_func = NULL;
1294 tbm_bufmgr_backend backend = NULL;
1297 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, -1, *error, TBM_ERROR_INVALID_PARAMETER);
1299 switch (module->type) {
1300 case TBM_MODULE_TYPE_HAL_TBM:
1301 fd = (hal_tbm_fd)hal_tbm_bo_export_fd((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
1303 /* LCOV_EXCL_START */
1304 case TBM_MODULE_TYPE_TBM_BACKEND:
1305 bo_func = module->bo_func;
1306 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, -1, *error, TBM_ERROR_INVALID_OPERATION);
1307 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_export_fd, -1, *error, TBM_ERROR_NOT_SUPPORTED);
1309 fd = bo_func->bo_export_fd(bo_data, error);
1311 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1312 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1313 backend = module->backend;
1314 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, -1, *error, TBM_ERROR_INVALID_OPERATION);
1315 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_export_fd, -1, *error, TBM_ERROR_NOT_SUPPORTED);
1317 fd = backend->bo_export_fd(bo);
1319 *error = TBM_ERROR_INVALID_OPERATION;
1321 *error = TBM_ERROR_NONE;
1324 TBM_ERR("Wrong module type:%d", module->type);
1326 *error = TBM_ERROR_INVALID_OPERATION;
1328 /* LCOV_EXCL_STOP */
1335 tbm_module_bo_export_key(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
1337 tbm_backend_bo_func *bo_func = NULL;
1338 tbm_bufmgr_backend backend = NULL;
1341 TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1343 switch (module->type) {
1344 case TBM_MODULE_TYPE_HAL_TBM:
1345 ret = (hal_tbm_fd)hal_tbm_bo_export_key((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
1347 /* LCOV_EXCL_START */
1348 case TBM_MODULE_TYPE_TBM_BACKEND:
1349 bo_func = module->bo_func;
1350 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
1351 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_export_key, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1353 ret = bo_func->bo_export_key(bo_data, error);
1355 case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1356 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1357 backend = module->backend;
1358 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
1359 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_export, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1361 ret = backend->bo_export(bo);
1363 *error = TBM_ERROR_INVALID_OPERATION;
1365 *error = TBM_ERROR_NONE;
1368 TBM_ERR("Wrong module type:%d", module->type);
1370 *error = TBM_ERROR_INVALID_OPERATION;
1372 /* LCOV_EXCL_STOP */