tbm_module: fix MEAMORY_LEAK.EX
[platform/core/uifw/libtbm.git] / src / tbm_module.c
1 /**************************************************************************
2
3 libtbm
4
5 Copyright 2012-2021 Samsung Electronics co., Ltd. All Rights Reserved.
6
7 Contact: SooChan Lim <sc1.lim@samsung.com>
8          Changyeon Lee <cyeon.lee@samsung.com>
9
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:
17
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
20 of the Software.
21
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.
29
30 **************************************************************************/
31
32 #include "config.h"
33
34 #include "tbm_bufmgr_int.h"
35 #include "tbm_bufmgr_backend.h"
36 #include "tbm_drm_helper.h"
37
38 #define PREFIX_LIB    "libtbm_"
39 #define SUFFIX_LIB    ".so"
40 #define DEFAULT_LIB   PREFIX_LIB"default"SUFFIX_LIB
41
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
47
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)
53
54 /* LCOV_EXCL_START */
55 static int
56 _tbm_backend_load_hal_tbm(tbm_module *module)
57 {
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;
62
63         hal_backend = hal_tbm_get_backend(&ret);
64         if (hal_backend == NULL || ret != HAL_TBM_ERROR_NONE) {
65                 TBM_ERR("get backend fail");
66                 return 0;
67         }
68
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;
73         }
74
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.");
79
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;
86                                 }
87                         } else {
88                                 TBM_INFO("libtbm gets a master drm_fd from libtdm via tbm_drm_helper.");
89                         }
90
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;
96                         }
97                 } else {
98                         TBM_INFO("tbm_backend has a master drm_fd.");
99
100                         tbm_drm_helper_set_tbm_master_fd(auth_drm_fd);
101                 }
102                 tbm_drm_helper_set_fd(auth_drm_fd);
103         }
104
105         module->hal_backend = hal_backend;
106         module->hal_bufmgr = hal_bufmgr;
107
108         module->use_hal_tbm = 1;
109
110         TBM_INFO("use HAL-TBM_API");
111
112         return 1;
113
114 get_backend_fail:
115         if (auth_drm_fd >= 0)
116                 close(auth_drm_fd);
117         hal_tbm_put_backend(hal_backend);
118         return 0;
119 }
120
121 static int
122 _check_version(TBMModuleVersionInfo *data)
123 {
124         int backend_module_major, backend_module_minor;
125         int tbm_backend_major, tbm_backend_minor;
126
127         backend_module_major = GET_ABI_MAJOR(data->abiversion);
128         backend_module_minor = GET_ABI_MINOR(data->abiversion);
129
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);
133
134         tbm_backend_major = GET_ABI_MAJOR(TBM_ABI_VERSION);
135         tbm_backend_minor = GET_ABI_MINOR(TBM_ABI_VERSION);
136
137         TBM_DBG("TBM ABI version %d.%d\n",
138             tbm_backend_major, tbm_backend_minor);
139
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);
143                 return 0;
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);
147                 return 0;
148         }
149
150         return 1;
151 }
152
153 static int
154 _tbm_backend_check_bufmgr_func(tbm_backend_bufmgr_func *bufmgr_func)
155 {
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.");
167
168         return 1;
169 }
170
171 static int
172 _tbm_backend_check_bufmgr_bo(tbm_backend_bo_func *bo_func)
173 {
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.");
188
189         return 1;
190 }
191
192 static int
193 _tbm_backend_load_module(tbm_module *module, const char *file)
194 {
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;
201         tbm_error_e error;
202
203         snprintf(path, sizeof(path), BUFMGR_MODULE_DIR "/%s", file);
204
205         module_data = dlopen(path, RTLD_LAZY);
206         if (!module_data) {
207                 TBM_ERR("failed to load module: %s(%s)\n", dlerror(), file);
208                 return 0;
209         }
210
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");
214                 goto err;
215         }
216
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);
220
221         backend_module_major = GET_ABI_MAJOR(backend_module_data->abi_version);
222         backend_module_minor = GET_ABI_MINOR(backend_module_data->abi_version);
223
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);
228
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);
232                 goto err;
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);
236                 goto err;
237         }
238
239         if (!backend_module_data->init) {
240                 TBM_ERR("Error: module does not supply init symbol.\n");
241                 goto err;
242         }
243
244         if (!backend_module_data->deinit)       {
245                 TBM_ERR("Error: module does not supply deinit symbol.\n");
246                 goto err;
247         }
248
249         bufmgr_data = backend_module_data->init((tbm_bufmgr)module, &error);
250         if (!bufmgr_data) {
251                 TBM_ERR("Fail to init module(%s)\n", file);
252                 goto err;
253         }
254
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.");
258                 goto err;
259         }
260
261         if (!_tbm_backend_check_bufmgr_bo(module->bo_func)) {
262                 TBM_ERR("Fail to check the bufmgr_bo symboles.");
263                 goto err;
264         }
265
266         module->module_data = module_data;
267         module->backend_module_data = backend_module_data;
268         module->bufmgr_data = bufmgr_data;
269
270         TBM_INFO("Success to load module(%s)\n", file);
271
272         return 1;
273
274 err:
275         if (bufmgr_data)
276                 module->backend_module_data->deinit(bufmgr_data);
277         if (module_data)
278                 dlclose(module_data);
279
280         return 0;
281 }
282
283 static int
284 _tbm_backend_load_bufmgr_module(tbm_module *module, int fd, const char *file)
285 {
286         char path[PATH_MAX] = {0, };
287         TBMModuleVersionInfo *vers;
288         TBMModuleData *initdata;
289         ModuleInitProc init;
290         void *module_data;
291
292         snprintf(path, sizeof(path), BUFMGR_MODULE_DIR "/%s", file);
293
294         module_data = dlopen(path, RTLD_LAZY);
295         if (!module_data) {
296                 TBM_ERR("failed to load module: %s(%s)\n", dlerror(), file);
297                 return 0;
298         }
299
300         initdata = dlsym(module_data, "tbmModuleData");
301         if (!initdata) {
302                 TBM_ERR("Error: module does not have data object.\n");
303                 goto err;
304         }
305
306         vers = initdata->vers;
307         if (!vers) {
308                 TBM_ERR("Error: module does not supply version information.\n");
309                 goto err;
310         }
311
312         init = initdata->init;
313         if (!init) {
314                 TBM_ERR("Error: module does not supply init symbol.\n");
315                 goto err;
316         }
317
318         if (!_check_version(vers)) {
319                 TBM_ERR("Fail to check version.\n");
320                 goto err;
321         }
322
323         if (!init((tbm_bufmgr)module, fd)) {
324                 TBM_ERR("Fail to init module(%s)\n", file);
325                 goto err;
326         }
327
328         if (!module->backend || !module->backend->priv) {
329                 TBM_ERR("Error: module(%s) wrong operation. Check backend or backend's priv.\n", file);
330                 goto err;
331         }
332
333         module->module_data = module_data;
334
335         TBM_DBG("Success to load module(%s)\n", file);
336
337         return 1;
338
339 err:
340         dlclose(module_data);
341         return 0;
342 }
343 /* LCOV_EXCL_STOP */
344
345 tbm_module *
346 tbm_module_load(int fd)
347 {
348         tbm_module *module;
349         struct dirent **namelist;
350         int ret = 0, n;
351
352         module = calloc(1, sizeof(struct _tbm_module));
353         if (!module) {
354                 TBM_ERR("fail to allocate the memory");
355                 return NULL;
356         }
357
358         /* try to load the hal-tbm backend module */
359         ret = _tbm_backend_load_hal_tbm(module);
360         if (ret) {
361                 module->type = TBM_MODULE_TYPE_HAL_TBM;
362                 goto done;
363         }
364
365 /* LCOV_EXCL_START */
366         /* try to load the new backend module */
367         ret = _tbm_backend_load_module(module, DEFAULT_LIB);
368         if (ret) {
369                 module->type = TBM_MODULE_TYPE_TBM_BACKEND;
370                 goto done;
371         }
372
373         /* try to load the old(deprecated) backend mdoule */
374         ret = _tbm_backend_load_bufmgr_module(module, fd, DEFAULT_LIB);
375         if (ret) {
376                 module->type = TBM_MODULE_TYPE_BUFMGR_BACKEND;
377                 return module;
378         }
379
380         /* load backend_module from configured path */
381         n = scandir(BUFMGR_MODULE_DIR, &namelist, 0, alphasort);
382         if (n < 0) {
383                 TBM_ERR("no files : %s\n", BUFMGR_MODULE_DIR);
384                 tbm_module_unload(module);
385                 return NULL;
386         }
387
388         while (n--) {
389                 if (!ret && strstr(namelist[n]->d_name, PREFIX_LIB)) {
390                         const char *p = strstr(namelist[n]->d_name, SUFFIX_LIB);
391
392                         if (p && !strcmp(p, SUFFIX_LIB)) {
393                                 ret = _tbm_backend_load_module(module, namelist[n]->d_name);
394                                 if (ret)
395                                         module->type = TBM_MODULE_TYPE_TBM_BACKEND;
396                                 else {
397                                         ret = _tbm_backend_load_bufmgr_module(module, fd, namelist[n]->d_name);
398                                         module->type = TBM_MODULE_TYPE_BUFMGR_BACKEND;
399                                 }
400                         }
401                 }
402
403                 free(namelist[n]);
404         }
405
406         free(namelist);
407
408         if (!ret) {
409                 free(module);
410                 module = NULL;
411         }
412 /* LCOV_EXCL_STOP */
413
414 done:
415         return module;
416 }
417
418 void
419 tbm_module_unload(tbm_module *module)
420 {
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);
426                 }
427                 tbm_drm_helper_unset_tbm_master_fd();
428                 tbm_drm_helper_unset_fd();
429
430                 hal_tbm_put_backend(module->hal_backend);
431                 module->hal_backend = NULL;
432                 module->hal_bufmgr = NULL;
433                 module->use_hal_tbm = 0;
434                 break;
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;
442
443                 dlclose(module->module_data);
444                 break;
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;
450
451                 dlclose(module->module_data);
452                 break;
453         default:
454                 TBM_ERR("Wrong module type:%d", module->type);
455                 break;
456 /* LCOV_EXCL_STOP */
457         }
458
459         free(module);
460 }
461
462 int
463 tbm_module_get_capabilities(tbm_module *module, tbm_error_e *error)
464 {
465         int capabilities = 0;
466         tbm_backend_bufmgr_func *bufmgr_func = NULL;
467
468         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, TBM_BUFMGR_CAPABILITY_NONE, *error, TBM_ERROR_INVALID_PARAMETER);
469
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);
473                 break;
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);
479
480                 capabilities = module->bufmgr_func->bufmgr_get_capabilities(module->bufmgr_data, error);
481                 break;
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.");
485
486                 *error = TBM_ERROR_NOT_SUPPORTED;
487                 break;
488         default:
489                 TBM_ERR("Wrong module type:%d", module->type);
490                 *error = TBM_ERROR_INVALID_OPERATION;
491                 break;
492 /* LCOV_EXCL_STOP */
493         }
494
495         return capabilities;
496 }
497
498 tbm_error_e
499 tbm_module_bind_native_display(tbm_module *module, void *native_display)
500 {
501         tbm_error_e error = TBM_ERROR_NONE;
502         tbm_backend_bufmgr_func *bufmgr_func = NULL;
503         tbm_bufmgr_backend backend = NULL;
504         int ret = 0;
505
506         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
507
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);
512                         if (fd < 0) {
513                                 TBM_ERR("error: module(%p) native_display(%p)\n", module, native_display);
514                                 return TBM_ERROR_INVALID_OPERATION;
515                         }
516
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);
520                                 close(fd);
521                                 return TBM_ERROR_INVALID_OPERATION;
522                         }
523                         TBM_INFO("tbm creates a wayland socket for authentication of drm_fd.");
524
525                         module->auth_wl_socket_created = 1;
526                         module->auth_fd = fd;
527                 } else {
528                         TBM_INFO("tbm_module has no drm device.");
529                         error = TBM_ERROR_NONE;
530                 }
531                 break;
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);
537
538                 error = bufmgr_func->bufmgr_bind_native_display(module->bufmgr_data, (tbm_native_display *)native_display);
539                 break;
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);
545
546                 ret = backend->bufmgr_bind_native_display((tbm_bufmgr)module, native_display);
547                 if (!ret)
548                         error = TBM_ERROR_INVALID_OPERATION;
549
550                 break;
551         default:
552                 TBM_ERR("Wrong module type:%d", module->type);
553                 error = TBM_ERROR_INVALID_OPERATION;
554                 break;
555 /* LCOV_EXCL_STOP */
556         }
557
558         return error;
559 }
560
561 tbm_error_e
562 tbm_module_get_supported_formats(tbm_module *module, uint32_t **formats, uint32_t *num)
563 {
564         tbm_error_e error = TBM_ERROR_NONE;
565         tbm_backend_bufmgr_func *bufmgr_func = NULL;
566         tbm_bufmgr_backend backend = NULL;
567         int ret = 0;
568
569         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
570
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);
574                 break;
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);
580
581                 error = bufmgr_func->bufmgr_get_supported_formats(module->bufmgr_data, formats, num);
582                 break;
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);
588
589                 ret = backend->surface_supported_format(formats, num);
590                 if (!ret)
591                         error = TBM_ERROR_INVALID_OPERATION;
592
593                 break;
594         default:
595                 TBM_ERR("Wrong module type:%d", module->type);
596                 error = TBM_ERROR_INVALID_OPERATION;
597                 break;
598 /* LCOV_EXCL_STOP */
599         }
600
601         return error;
602 }
603
604 tbm_error_e
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)
607 {
608         tbm_error_e error = TBM_ERROR_NONE;
609         tbm_backend_bufmgr_func *bufmgr_func = NULL;
610         tbm_bufmgr_backend backend = NULL;
611         int ret = 0;
612
613         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
614
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);
618                 break;
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);
624
625                 error = bufmgr_func->bufmgr_get_plane_data(module->bufmgr_data, format, plane_idx, w, h, size, offset, pitch, bo_idx);
626                 break;
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);
632
633                 ret = backend->surface_get_plane_data(w, h, format, plane_idx, size, offset, pitch, bo_idx);
634                 if (!ret)
635                         error = TBM_ERROR_INVALID_OPERATION;
636                 break;
637         default:
638                 TBM_ERR("Wrong module type:%d", module->type);
639                 error = TBM_ERROR_INVALID_OPERATION;
640                 break;
641 /* LCOV_EXCL_STOP */
642         }
643
644         return error;
645 }
646
647 int
648 tbm_module_support_surface_data(tbm_module *module)
649 {
650         tbm_error_e error = TBM_ERROR_NONE;
651         tbm_surface_data *surface_data = NULL;
652
653         static int tbm_module_check_support_surface_data = 0;
654
655         TBM_RETURN_VAL_IF_FAIL(module, 0);
656
657         // check once support_surface_data or not.
658         if (tbm_module_check_support_surface_data) {
659                 // return the value which already set.
660                 return module->support_surface_data;
661         }
662
663         // check this only once
664         tbm_module_check_support_surface_data = 1;
665
666         if (module->type != TBM_MODULE_TYPE_HAL_TBM)
667                 goto done;
668
669         // Assume that the hal-tbm supports the hal surface apis if tbm_module_alloc_surface_data succeed.
670         surface_data = tbm_module_alloc_surface_data(module, 10, 10, TBM_FORMAT_ARGB8888, TBM_BO_DEFAULT, &error);
671         if (!surface_data)
672                 goto done;
673         free(surface_data);
674
675         module->support_surface_data = 1;
676
677 done:
678         return module->support_surface_data;
679 }
680
681
682 tbm_surface_data *
683 tbm_module_alloc_surface_data(tbm_module *module, int width, int height, int format, int flags, tbm_error_e *error)
684 {
685         tbm_surface_data *surface_data = NULL;
686
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);
689
690         surface_data = calloc(1, sizeof(struct _tbm_surface_data));
691         if (!surface_data) {
692                 TBM_ERR("memory allocation failed.");
693                 *error = TBM_ERROR_OUT_OF_MEMORY;
694                 return NULL;
695         }
696
697         surface_data->hal_surface = hal_tbm_bufmgr_alloc_surface(module->hal_bufmgr,
698                                                                                            (uint32_t)width,
699                                                                                            (uint32_t)height,
700                                                                                            (hal_tbm_format)format,
701                                                                                            (hal_tbm_bo_memory_type)flags,
702                                                                                            NULL,
703                                                                                            0,
704                                                                                            (hal_tbm_error *)error);
705         if (!surface_data->hal_surface) {
706                 TBM_ERR("hal_tbm_bufmgr_alloc_surface failed.");
707                 *error = TBM_ERROR_INVALID_OPERATION;
708                 free(surface_data);
709                 return NULL;
710         }
711
712         surface_data->module = module;
713
714         return surface_data;
715 }
716
717 tbm_surface_data *
718 tbm_module_import_surface_data(tbm_module *module, int width, int height, int format, tbm_surface_buffer_data *buffer_data, tbm_error_e *error)
719 {
720         tbm_surface_data *surface_data = NULL;
721
722         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
723         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module->type == TBM_MODULE_TYPE_HAL_TBM, NULL, *error, TBM_ERROR_INVALID_OPERATION);
724
725         surface_data = calloc(1, sizeof(struct _tbm_surface_data));
726         if (!surface_data) {
727                 TBM_ERR("memory allocation failed.");
728                 *error = TBM_ERROR_OUT_OF_MEMORY;
729                 return NULL;
730         }
731
732         surface_data->hal_surface = hal_tbm_bufmgr_import_surface(module->hal_bufmgr,
733                                                                                         (uint32_t)width,
734                                                                                         (uint32_t)height,
735                                                                                         (hal_tbm_format)format,
736                                                                                         (hal_tbm_surface_buffer_data *)buffer_data,
737                                                                                         (hal_tbm_error *)error);
738         if (!surface_data->hal_surface) {
739                 TBM_ERR("hal_tbm_bufmgr_import_surface failed. width:%d height:%d format:%d error:%s",
740                                 width, height, format, tbm_error_str(*error));
741                 free(surface_data);
742                 return NULL;
743         }
744
745         surface_data->module = module;
746
747         return surface_data;
748 }
749
750 tbm_bo_data *
751 tbm_module_alloc_bo_data(tbm_module *module, tbm_bo bo, int size, int flags, tbm_error_e *error)
752 {
753         tbm_bo_data *bo_data = NULL;
754         tbm_backend_bufmgr_func *bufmgr_func = NULL;
755         tbm_bufmgr_backend backend = NULL;
756
757         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
758
759         bo_data = calloc(1, sizeof(struct _tbm_bo_data));
760         TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY);
761
762         switch (module->type) {
763         case TBM_MODULE_TYPE_HAL_TBM:
764                 bo_data->hal_bo = hal_tbm_bufmgr_alloc_bo(module->hal_bufmgr, size, flags, (hal_tbm_error *)error);
765                 TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed);
766                 break;
767 /* LCOV_EXCL_START */
768         case TBM_MODULE_TYPE_TBM_BACKEND:
769                 bufmgr_func = module->bufmgr_func;
770                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION);
771                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, failed, *error, TBM_ERROR_NOT_SUPPORTED);
772
773                 bo_data->backend_bo_data = bufmgr_func->bufmgr_alloc_bo(module->bufmgr_data, (unsigned int)size, flags, error);
774                 TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed);
775                 break;
776         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
777                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
778
779                 backend = module->backend;
780                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend, failed, *error, TBM_ERROR_INVALID_OPERATION);
781                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend->bo_alloc, failed, *error, TBM_ERROR_NOT_SUPPORTED);
782
783                 bo_data->priv = (void *)backend->bo_alloc(bo, size, flags);
784                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data->priv, failed, *error, TBM_ERROR_INVALID_OPERATION);
785
786                 *error = TBM_ERROR_NONE;
787                 break;
788         default:
789                 TBM_ERR("Wrong module type:%d", module->type);
790                 *error = TBM_ERROR_INVALID_OPERATION;
791                 goto failed;
792                 break;
793 /* LCOV_EXCL_STOP */
794         }
795
796         bo_data->module = module;
797
798         return bo_data;
799
800 /* LCOV_EXCL_START */
801 failed:
802         if (bo_data)
803                 free(bo_data);
804
805         return NULL;
806 /* LCOV_EXCL_STOP */
807 }
808
809 tbm_bo_data *
810 tbm_module_alloc_bo_data_with_format(tbm_module *module, int format, int bo_idx, int width,
811                                                 int height, int bpp, tbm_bo_memory_type flags, tbm_error_e *error)
812 {
813         tbm_bo_data *bo_data = NULL;
814         tbm_backend_bufmgr_func *bufmgr_func = NULL;
815
816         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
817
818         bo_data = calloc(1, sizeof(struct _tbm_bo_data));
819         TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY);
820
821         switch (module->type) {
822         case TBM_MODULE_TYPE_HAL_TBM:
823                 bo_data->hal_bo = hal_tbm_bufmgr_alloc_bo_with_format(module->hal_bufmgr,
824                                                                                         format, bo_idx, width, height, bpp,
825                                                                                         (hal_tbm_bo_memory_type)flags, (hal_tbm_error *)error);
826                 TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed);
827                 break;
828 /* LCOV_EXCL_START */
829         case TBM_MODULE_TYPE_TBM_BACKEND:
830                 bufmgr_func = module->bufmgr_func;
831                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION);
832                 if (!bufmgr_func->bufmgr_alloc_bo_with_format) {
833                         *error = TBM_ERROR_NOT_SUPPORTED;
834                         goto failed;
835                 }
836
837                 bo_data->backend_bo_data = bufmgr_func->bufmgr_alloc_bo_with_format(module->bufmgr_data, format, bo_idx, width, height, flags, error);
838                 TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed);
839                 break;
840         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
841                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
842                 TBM_ERR("error: not supported tbm_bufmgr_internal_alloc_bo_with_format.");
843
844                 *error = TBM_ERROR_NOT_SUPPORTED;
845                 goto failed;
846                 break;
847         default:
848                 TBM_ERR("Wrong module type:%d", module->type);
849                 *error = TBM_ERROR_INVALID_OPERATION;
850                 goto failed;
851                 break;
852 /* LCOV_EXCL_STOP */
853         }
854
855         bo_data->module = module;
856
857         return bo_data;
858
859 /* LCOV_EXCL_START */
860 failed:
861         if (bo_data)
862                 free(bo_data);
863
864         return NULL;
865 /* LCOV_EXCL_STOP */
866 }
867
868 tbm_bo_data *
869 tbm_module_import_bo_data_with_fd(tbm_module *module, tbm_bo bo, tbm_fd fd, tbm_error_e *error)
870 {
871         tbm_bo_data *bo_data = NULL;
872         tbm_backend_bufmgr_func *bufmgr_func = NULL;
873         tbm_bufmgr_backend backend = NULL;
874
875         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
876
877         bo_data = calloc(1, sizeof(struct _tbm_bo_data));
878         TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY);
879
880         switch (module->type) {
881         case TBM_MODULE_TYPE_HAL_TBM:
882                 bo_data->hal_bo = hal_tbm_bufmgr_import_fd(module->hal_bufmgr, (hal_tbm_fd)fd, (hal_tbm_error *)error);
883                 TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed);
884                 break;
885 /* LCOV_EXCL_START */
886         case TBM_MODULE_TYPE_TBM_BACKEND:
887                 bufmgr_func = module->bufmgr_func;
888                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION);
889                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_fd, failed, *error, TBM_ERROR_NOT_SUPPORTED);
890
891                 bo_data->backend_bo_data = bufmgr_func->bufmgr_import_fd(module->bufmgr_data, fd, error);
892                 TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed);
893                 break;
894         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
895                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
896                 backend = module->backend;
897                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend, failed, *error, TBM_ERROR_INVALID_OPERATION);
898                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend->bo_import_fd, failed, *error, TBM_ERROR_NOT_SUPPORTED);
899
900                 bo_data->priv = (void *)backend->bo_import_fd(bo, fd);
901                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data->priv, failed, *error, TBM_ERROR_INVALID_OPERATION);
902
903                 *error = TBM_ERROR_NONE;
904                 break;
905         default:
906                 TBM_ERR("Wrong module type:%d", module->type);
907                 *error = TBM_ERROR_INVALID_OPERATION;
908                 goto failed;
909                 break;
910 /* LCOV_EXCL_STOP */
911         }
912
913         bo_data->module = module;
914
915         return bo_data;
916
917 /* LCOV_EXCL_START */
918 failed:
919         if (bo_data)
920                 free(bo_data);
921
922         return NULL;
923 /* LCOV_EXCL_STOP */
924 }
925
926 tbm_bo_data *
927 tbm_module_import_bo_data_with_key(tbm_module *module, tbm_bo bo, tbm_key key, tbm_error_e *error)
928 {
929         tbm_bo_data *bo_data = NULL;
930         tbm_backend_bufmgr_func *bufmgr_func = NULL;
931         tbm_bufmgr_backend backend = NULL;
932
933         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
934
935         bo_data = calloc(1, sizeof(struct _tbm_bo_data));
936         TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY);
937
938         switch (module->type) {
939         case TBM_MODULE_TYPE_HAL_TBM:
940                 bo_data->hal_bo = hal_tbm_bufmgr_import_key(module->hal_bufmgr, key, (hal_tbm_error *)error);
941                 TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed);
942                 break;
943 /* LCOV_EXCL_START */
944         case TBM_MODULE_TYPE_TBM_BACKEND:
945                 bufmgr_func = module->bufmgr_func;
946                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION);
947                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_key, failed, *error, TBM_ERROR_NOT_SUPPORTED);
948
949                 bo_data->backend_bo_data = bufmgr_func->bufmgr_import_key(module->bufmgr_data, key, error);
950                 TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed);
951                 break;
952         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
953                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
954                 backend = module->backend;
955                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend, failed, *error, TBM_ERROR_INVALID_OPERATION);
956                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend->bo_import, failed, *error, TBM_ERROR_NOT_SUPPORTED);
957
958                 bo_data->priv = (void *)backend->bo_import(bo, key);
959                 TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data->priv, failed, *error, TBM_ERROR_INVALID_OPERATION);
960
961                 *error = TBM_ERROR_NONE;
962                 break;
963         default:
964                 TBM_ERR("Wrong module type:%d", module->type);
965                 *error = TBM_ERROR_INVALID_OPERATION;
966                 goto failed;
967                 break;
968 /* LCOV_EXCL_STOP */
969         }
970
971         bo_data->module = module;
972
973         return bo_data;
974
975 /* LCOV_EXCL_START */
976 failed:
977         if (bo_data)
978                 free(bo_data);
979
980         return NULL;
981 /* LCOV_EXCL_STOP */
982 }
983
984 int
985 tbm_module_compare_bo_data(tbm_module *module, tbm_bo_data *bo_data1, tbm_bo_data *bo_data2)
986 {
987         TBM_RETURN_VAL_IF_FAIL(module, 0);
988
989         switch (module->type) {
990         case TBM_MODULE_TYPE_HAL_TBM:
991                 return (bo_data1->hal_bo == bo_data2->hal_bo);
992                 break;
993 /* LCOV_EXCL_START */
994         case TBM_MODULE_TYPE_TBM_BACKEND:
995                 return (bo_data1->backend_bo_data == bo_data2->backend_bo_data);
996                 break;
997         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
998                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
999                 return (bo_data1->priv == bo_data2->priv);
1000                 break;
1001         default:
1002                 TBM_ERR("Wrong module type:%d", module->type);
1003                 break;
1004 /* LCOV_EXCL_STOP */
1005         }
1006
1007         return 0;
1008 }
1009
1010 void
1011 tbm_surface_data_free(tbm_surface_data *surface_data)
1012 {
1013         TBM_RETURN_IF_FAIL(surface_data);
1014         TBM_RETURN_IF_FAIL(surface_data->module);
1015         TBM_RETURN_IF_FAIL(surface_data->module->type == TBM_MODULE_TYPE_HAL_TBM);
1016
1017         surface_data->module = NULL;
1018
1019         hal_tbm_surface_free(surface_data->hal_surface);
1020         surface_data->hal_surface = NULL;
1021
1022         free(surface_data);
1023 }
1024
1025 tbm_error_e
1026 tbm_surface_data_get_plane_data(tbm_surface_data *surface_data, int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
1027 {
1028         tbm_error_e error;
1029
1030         TBM_RETURN_VAL_IF_FAIL(surface_data, TBM_ERROR_INVALID_PARAMETER);
1031         TBM_RETURN_VAL_IF_FAIL(surface_data->hal_surface, TBM_ERROR_NOT_SUPPORTED);
1032
1033         error = (tbm_error_e)hal_tbm_surface_get_plane_data(surface_data->hal_surface, plane_idx, size, offset, pitch, bo_idx);
1034         TBM_RETURN_VAL_IF_FAIL(error == TBM_ERROR_NONE, error);
1035
1036         return TBM_ERROR_NONE;
1037 }
1038
1039 tbm_bo_data **
1040 tbm_surface_data_get_bo_data_array(tbm_surface_data *surface_data, int *num_bos, tbm_error_e *error)
1041 {
1042         tbm_bo_data **bo_data_array = NULL;
1043         hal_tbm_bo **hal_bos = NULL;
1044         int i;
1045
1046         TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1047         TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data->hal_surface, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1048
1049         hal_bos = hal_tbm_surface_get_bos(surface_data->hal_surface, num_bos, (hal_tbm_error *)error);
1050         TBM_RETURN_VAL_IF_FAIL(hal_bos, NULL);
1051
1052         bo_data_array = calloc(*num_bos, sizeof(struct _tbm_bo_data));
1053         if (bo_data_array) {
1054                 TBM_ERR("memory allocation failed.");
1055                 *error = TBM_ERROR_OUT_OF_MEMORY;
1056                 return NULL;
1057         }
1058
1059         for (i = 0; i < *num_bos; i++) {
1060                 bo_data_array[i]->hal_bo = hal_bos[i];
1061                 bo_data_array[i]->module = surface_data->module;
1062         }
1063
1064         return bo_data_array;
1065 }
1066
1067 tbm_surface_buffer_data *
1068 tbm_surface_data_export(tbm_surface_data *surface_data, tbm_error_e *error)
1069 {
1070         tbm_surface_buffer_data *buffer_data;
1071
1072         TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1073         TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data->hal_surface, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1074
1075         buffer_data = (tbm_surface_buffer_data *)hal_tbm_surface_export((hal_tbm_surface *)surface_data->hal_surface,
1076                                                                                                                                         (hal_tbm_error *)error);
1077         TBM_RETURN_VAL_IF_FAIL(buffer_data, NULL);
1078
1079         return buffer_data;
1080 }
1081
1082 void
1083 tbm_bo_data_free(tbm_bo_data *bo_data, int get_from_surface_data)
1084 {
1085         tbm_module *module = NULL;
1086         tbm_backend_bo_func *bo_func = NULL;
1087         tbm_bufmgr_backend backend = NULL;
1088
1089         TBM_RETURN_IF_FAIL(bo_data);
1090         TBM_RETURN_IF_FAIL(bo_data->module);
1091
1092         module = bo_data->module;
1093
1094         switch (module->type) {
1095         case TBM_MODULE_TYPE_HAL_TBM:
1096                 // call hal_tbm_bo_free when bo is created by tbm_bo_alloc api.
1097                 if (!get_from_surface_data) {
1098                         hal_tbm_bo_free(bo_data->hal_bo);
1099                         bo_data->hal_bo = NULL;
1100                 }
1101                 break;
1102 /* LCOV_EXCL_START */
1103         case TBM_MODULE_TYPE_TBM_BACKEND:
1104                 bo_func = module->bo_func;
1105                 TBM_RETURN_IF_FAIL(bo_func);
1106                 TBM_RETURN_IF_FAIL(bo_func->bo_free);
1107
1108                 bo_func->bo_free(bo_data->backend_bo_data);
1109                 bo_data->backend_bo_data = NULL;
1110                 break;
1111         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1112                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1113                 backend = module->backend;
1114                 TBM_RETURN_IF_FAIL(backend);
1115                 TBM_RETURN_IF_FAIL(backend->bo_free);
1116
1117                 backend->bo_free(bo_data->priv);
1118                 bo_data->priv = NULL;
1119                 break;
1120         default:
1121                 TBM_ERR("Wrong module type:%d", module->type);
1122                 break;
1123 /* LCOV_EXCL_STOP */
1124         }
1125
1126         bo_data->module = NULL;
1127         free(bo_data);
1128 }
1129
1130 int
1131 tbm_bo_data_get_size(tbm_bo_data *bo_data, tbm_error_e *error)
1132 {
1133         tbm_module *module = NULL;
1134         tbm_backend_bo_func *bo_func = NULL;
1135         tbm_bufmgr_backend backend = NULL;
1136         int size = 0;
1137
1138         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1139         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data->module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1140
1141         module = bo_data->module;
1142
1143         switch (module->type) {
1144         case TBM_MODULE_TYPE_HAL_TBM:
1145                 size = hal_tbm_bo_get_size(bo_data->hal_bo, (hal_tbm_error *)error);
1146                 break;
1147 /* LCOV_EXCL_START */
1148         case TBM_MODULE_TYPE_TBM_BACKEND:
1149                 bo_func = module->bo_func;
1150                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
1151                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_size, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1152
1153                 size = bo_func->bo_get_size(bo_data->backend_bo_data, error);
1154                 break;
1155         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1156                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1157                 backend = module->backend;
1158                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
1159                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_size, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1160
1161                 size = backend->bo_size(bo_data->priv);
1162                 if (size == 0)
1163                         *error = TBM_ERROR_INVALID_OPERATION;
1164                 else
1165                         *error = TBM_ERROR_NONE;
1166                 break;
1167         default:
1168                 TBM_ERR("Wrong module type:%d", module->type);
1169                 *error = TBM_ERROR_INVALID_OPERATION;
1170                 break;
1171 /* LCOV_EXCL_STOP */
1172         }
1173
1174         return size;
1175 }
1176
1177 int
1178 tbm_bo_data_get_memory_types(tbm_bo_data *bo_data, tbm_error_e *error)
1179 {
1180         tbm_module *module = NULL;
1181         tbm_backend_bo_func *bo_func = NULL;
1182         tbm_bufmgr_backend backend = NULL;
1183         int memory_types = TBM_BO_DEFAULT;
1184
1185         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1186         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data->module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1187
1188         module = bo_data->module;
1189
1190         switch (module->type) {
1191         case TBM_MODULE_TYPE_HAL_TBM:
1192                 memory_types = (tbm_bo_memory_type)hal_tbm_bo_get_memory_types(bo_data->hal_bo, (hal_tbm_error *)error);
1193                 break;
1194 /* LCOV_EXCL_START */
1195         case TBM_MODULE_TYPE_TBM_BACKEND:
1196                 bo_func = module->bo_func;
1197                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
1198                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_memory_types, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1199
1200                 memory_types = bo_func->bo_get_memory_types(bo_data->backend_bo_data, error);
1201                 break;
1202         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1203                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1204                 backend = module->backend;
1205                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
1206                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_get_flags, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1207
1208                 memory_types = backend->bo_get_flags(bo_data->priv);
1209                 *error = TBM_ERROR_NONE;
1210                 break;
1211         default:
1212                 TBM_ERR("Wrong module type:%d", module->type);
1213                 *error = TBM_ERROR_INVALID_OPERATION;
1214                 break;
1215 /* LCOV_EXCL_STOP */
1216         }
1217
1218         return memory_types;
1219 }
1220
1221 tbm_bo_handle
1222 tbm_bo_data_get_handle(tbm_bo_data *bo_data, int device, tbm_error_e *error)
1223 {
1224         tbm_module *module = NULL;
1225         tbm_backend_bo_func *bo_func = NULL;
1226         tbm_bufmgr_backend backend = NULL;
1227         tbm_bo_handle bo_handle = (tbm_bo_handle)NULL;
1228         hal_tbm_bo_handle hbo_handle;
1229
1230         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1231         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data->module, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1232
1233         module = bo_data->module;
1234
1235         switch (module->type) {
1236         case TBM_MODULE_TYPE_HAL_TBM:
1237                 hbo_handle = hal_tbm_bo_get_handle(bo_data->hal_bo, device, (hal_tbm_error *)error);
1238                 if (hbo_handle.ptr != NULL)
1239                         memcpy(&bo_handle.ptr, &hbo_handle.ptr, sizeof(tbm_bo_handle));
1240                 break;
1241 /* LCOV_EXCL_START */
1242         case TBM_MODULE_TYPE_TBM_BACKEND:
1243                 bo_func = module->bo_func;
1244                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1245                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_handle, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1246
1247                 bo_handle = bo_func->bo_get_handle(bo_data->backend_bo_data, device, error);
1248                 break;
1249         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1250                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1251                 backend = module->backend;
1252                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1253                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_get_handle, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1254
1255                 bo_handle = backend->bo_get_handle(bo_data->priv, device);
1256                 if (!bo_handle.ptr)
1257                         *error = TBM_ERROR_INVALID_OPERATION;
1258                 else
1259                         *error = TBM_ERROR_NONE;
1260                 break;
1261         default:
1262                 TBM_ERR("Wrong module type:%d", module->type);
1263                 bo_handle.ptr = NULL;
1264                 *error = TBM_ERROR_INVALID_OPERATION;
1265                 break;
1266 /* LCOV_EXCL_STOP */
1267         }
1268
1269         return bo_handle;
1270 }
1271
1272 tbm_bo_handle
1273 tbm_bo_data_map(tbm_bo_data *bo_data, int device, int opt, tbm_error_e *error)
1274 {
1275         tbm_module *module = NULL;
1276         tbm_backend_bo_func *bo_func = NULL;
1277         tbm_bufmgr_backend backend = NULL;
1278         tbm_bo_handle bo_handle = (tbm_bo_handle)NULL;
1279         hal_tbm_bo_handle hbo_handle;
1280
1281         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1282         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data->module, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
1283
1284         module = bo_data->module;
1285
1286         switch (module->type) {
1287         case TBM_MODULE_TYPE_HAL_TBM:
1288                 hbo_handle = hal_tbm_bo_map(bo_data->hal_bo, device, opt, (hal_tbm_error *)error);
1289                 if (hbo_handle.ptr != NULL)
1290                         memcpy(&bo_handle.ptr, &hbo_handle.ptr, sizeof(tbm_bo_handle));
1291                 break;
1292 /* LCOV_EXCL_START */
1293         case TBM_MODULE_TYPE_TBM_BACKEND:
1294                 bo_func = module->bo_func;
1295                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1296                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_map, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1297
1298                 bo_handle = bo_func->bo_map(bo_data->backend_bo_data, device, opt, error);
1299                 break;
1300         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1301                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1302                 backend = module->backend;
1303                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1304                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_map, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1305
1306                 bo_handle = backend->bo_map(bo_data->priv, device, opt);
1307                 if (!bo_handle.ptr)
1308                         *error = TBM_ERROR_INVALID_OPERATION;
1309                 else
1310                         *error = TBM_ERROR_NONE;
1311                 break;
1312         default:
1313                 TBM_ERR("Wrong module type:%d", module->type);
1314                 bo_handle.ptr = NULL;
1315                 *error = TBM_ERROR_INVALID_OPERATION;
1316                 break;
1317 /* LCOV_EXCL_STOP */
1318         }
1319
1320         return bo_handle;
1321 }
1322
1323 tbm_error_e
1324 tbm_bo_data_unmap(tbm_bo_data *bo_data)
1325 {
1326         tbm_module *module = NULL;
1327         tbm_backend_bo_func *bo_func = NULL;
1328         tbm_bufmgr_backend backend = NULL;
1329         tbm_error_e error;
1330         int ret = 0;
1331
1332         TBM_RETURN_VAL_IF_FAIL(bo_data, TBM_ERROR_INVALID_PARAMETER);
1333         TBM_RETURN_VAL_IF_FAIL(bo_data->module, TBM_ERROR_INVALID_PARAMETER);
1334
1335         module = bo_data->module;
1336
1337         switch (module->type) {
1338         case TBM_MODULE_TYPE_HAL_TBM:
1339                 error = (hal_tbm_error)hal_tbm_bo_unmap(bo_data->hal_bo);
1340                 break;
1341 /* LCOV_EXCL_START */
1342         case TBM_MODULE_TYPE_TBM_BACKEND:
1343                 bo_func = module->bo_func;
1344                 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1345                 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_unmap, TBM_ERROR_NOT_SUPPORTED);
1346
1347                 error = bo_func->bo_unmap(bo_data->backend_bo_data);
1348                 break;
1349         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1350                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1351                 backend = module->backend;
1352                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1353                 TBM_RETURN_VAL_IF_FAIL(backend->bo_unmap, TBM_ERROR_NOT_SUPPORTED);
1354
1355                 ret = backend->bo_unmap(bo_data->priv);
1356                 if (!ret)
1357                         error = TBM_ERROR_INVALID_OPERATION;
1358                 else
1359                         error = TBM_ERROR_NONE;
1360                 break;
1361         default:
1362                 TBM_ERR("Wrong module type:%d", module->type);
1363                 error = TBM_ERROR_INVALID_OPERATION;
1364                 break;
1365 /* LCOV_EXCL_STOP */
1366         }
1367
1368         return error;
1369 }
1370
1371 tbm_error_e
1372 tbm_bo_data_lock(tbm_bo_data *bo_data, int device, int opt)
1373 {
1374         tbm_module *module = NULL;
1375         tbm_backend_bo_func *bo_func = NULL;
1376         tbm_bufmgr_backend backend = NULL;
1377         tbm_error_e error;
1378         int ret = 0;
1379
1380         TBM_RETURN_VAL_IF_FAIL(bo_data, TBM_ERROR_INVALID_PARAMETER);
1381         TBM_RETURN_VAL_IF_FAIL(bo_data->module, TBM_ERROR_INVALID_PARAMETER);
1382
1383         module = bo_data->module;
1384
1385         switch (module->type) {
1386         case TBM_MODULE_TYPE_HAL_TBM:
1387                 error = (tbm_error_e)hal_tbm_bo_lock(bo_data->hal_bo, device, opt);
1388                 break;
1389 /* LCOV_EXCL_START */
1390         case TBM_MODULE_TYPE_TBM_BACKEND:
1391                 bo_func = module->bo_func;
1392                 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1393                 if (!bo_func->bo_lock)
1394                         return TBM_ERROR_NOT_SUPPORTED;
1395
1396                 error = bo_func->bo_lock(bo_data->backend_bo_data, device, opt);
1397                 break;
1398         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1399                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1400                 backend = module->backend;
1401                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1402                 if (!backend->bo_unmap)
1403                         return TBM_ERROR_NOT_SUPPORTED;
1404
1405                 ret = backend->bo_lock(bo_data->priv, device, opt);
1406                 if (!ret)
1407                         error = TBM_ERROR_INVALID_OPERATION;
1408                 else
1409                         error = TBM_ERROR_NONE;
1410                 break;
1411         default:
1412                 TBM_ERR("Wrong module type:%d", module->type);
1413                 error = TBM_ERROR_INVALID_OPERATION;
1414                 break;
1415 /* LCOV_EXCL_STOP */
1416         }
1417
1418         return error;
1419 }
1420
1421 tbm_error_e
1422 tbm_bo_data_unlock(tbm_bo_data *bo_data)
1423 {
1424         tbm_module *module = NULL;
1425         tbm_backend_bo_func *bo_func = NULL;
1426         tbm_bufmgr_backend backend = NULL;
1427         tbm_error_e error;
1428
1429         TBM_RETURN_VAL_IF_FAIL(bo_data, TBM_ERROR_INVALID_PARAMETER);
1430         TBM_RETURN_VAL_IF_FAIL(bo_data->module, TBM_ERROR_INVALID_PARAMETER);
1431
1432         module = bo_data->module;
1433
1434         switch (module->type) {
1435         case TBM_MODULE_TYPE_HAL_TBM:
1436                 error = (tbm_error_e)hal_tbm_bo_unlock(bo_data->hal_bo);
1437                 break;
1438 /* LCOV_EXCL_START */
1439         case TBM_MODULE_TYPE_TBM_BACKEND:
1440                 bo_func = module->bo_func;
1441                 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1442                 if (!bo_func->bo_unlock)
1443                         return TBM_ERROR_NOT_SUPPORTED;
1444
1445                 error = bo_func->bo_unlock(bo_data->backend_bo_data);
1446                 break;
1447         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1448                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1449                 backend = module->backend;
1450                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1451                 if (!backend->bo_unlock)
1452                         return TBM_ERROR_NOT_SUPPORTED;
1453
1454                 backend->bo_unlock(bo_data->priv);
1455                 error = TBM_ERROR_NONE;
1456                 break;
1457         default:
1458                 TBM_ERR("Wrong module type:%d", module->type);
1459                 error = TBM_ERROR_INVALID_OPERATION;
1460                 break;
1461 /* LCOV_EXCL_STOP */
1462         }
1463
1464         return error;
1465 }
1466
1467 tbm_fd
1468 tbm_bo_data_export_fd(tbm_bo_data *bo_data, tbm_error_e *error)
1469 {
1470         tbm_module *module = NULL;
1471         tbm_backend_bo_func *bo_func = NULL;
1472         tbm_bufmgr_backend backend = NULL;
1473         tbm_fd fd;
1474
1475         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data, -1, *error, TBM_ERROR_INVALID_PARAMETER);
1476         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data->module, -1, *error, TBM_ERROR_INVALID_PARAMETER);
1477
1478         module = bo_data->module;
1479
1480         switch (module->type) {
1481         case TBM_MODULE_TYPE_HAL_TBM:
1482                 fd = (hal_tbm_fd)hal_tbm_bo_export_fd(bo_data->hal_bo, (hal_tbm_error *)error);
1483                 break;
1484 /* LCOV_EXCL_START */
1485         case TBM_MODULE_TYPE_TBM_BACKEND:
1486                 bo_func = module->bo_func;
1487                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, -1, *error, TBM_ERROR_INVALID_OPERATION);
1488                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_export_fd, -1, *error, TBM_ERROR_NOT_SUPPORTED);
1489
1490                 fd = bo_func->bo_export_fd(bo_data->backend_bo_data, error);
1491                 break;
1492         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1493                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1494                 backend = module->backend;
1495                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, -1, *error, TBM_ERROR_INVALID_OPERATION);
1496                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_export_fd, -1, *error, TBM_ERROR_NOT_SUPPORTED);
1497
1498                 fd = backend->bo_export_fd(bo_data->priv);
1499                 if (fd < 0)
1500                         *error = TBM_ERROR_INVALID_OPERATION;
1501                 else
1502                         *error = TBM_ERROR_NONE;
1503                 break;
1504         default:
1505                 TBM_ERR("Wrong module type:%d", module->type);
1506                 fd = -1;
1507                 *error = TBM_ERROR_INVALID_OPERATION;
1508                 break;
1509 /* LCOV_EXCL_STOP */
1510         }
1511
1512         return fd;
1513 }
1514
1515 tbm_key
1516 tbm_bo_data_export_key(tbm_bo_data *bo_data, tbm_error_e *error)
1517 {
1518         tbm_module *module = NULL;
1519         tbm_backend_bo_func *bo_func = NULL;
1520         tbm_bufmgr_backend backend = NULL;
1521         tbm_key ret;
1522
1523         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1524         TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_data->module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1525
1526         module = bo_data->module;
1527
1528         switch (module->type) {
1529         case TBM_MODULE_TYPE_HAL_TBM:
1530                 ret = (hal_tbm_fd)hal_tbm_bo_export_key(bo_data->hal_bo, (hal_tbm_error *)error);
1531                 break;
1532 /* LCOV_EXCL_START */
1533         case TBM_MODULE_TYPE_TBM_BACKEND:
1534                 bo_func = module->bo_func;
1535                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
1536                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_export_key, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1537
1538                 ret = bo_func->bo_export_key(bo_data->backend_bo_data, error);
1539                 break;
1540         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1541                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1542                 backend = module->backend;
1543                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
1544                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_export, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1545
1546                 ret = backend->bo_export(bo_data->priv);
1547                 if (!ret)
1548                         *error = TBM_ERROR_INVALID_OPERATION;
1549                 else
1550                         *error = TBM_ERROR_NONE;
1551                 break;
1552         default:
1553                 TBM_ERR("Wrong module type:%d", module->type);
1554                 ret = -1;
1555                 *error = TBM_ERROR_INVALID_OPERATION;
1556                 break;
1557 /* LCOV_EXCL_STOP */
1558         }
1559
1560         return ret;
1561 }