1 /**************************************************************************
5 Copyright 2012 Samsung Electronics co., Ltd. All Rights Reserved.
7 Contact: SooChan Lim <sc1.lim@samsung.com>, Sangjin Lee <lsj119@samsung.com>
8 Boram Park <boram1288.park@samsung.com>, 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.h"
35 #include "tbm_bufmgr_int.h"
36 #include "tbm_bufmgr_backend.h"
39 #include <sys/resource.h>
56 static pthread_mutex_t gLock = PTHREAD_MUTEX_INITIALIZER;
57 static pthread_mutex_t tbm_bufmgr_lock = PTHREAD_MUTEX_INITIALIZER;
58 static __thread tbm_error_e tbm_last_error = TBM_ERROR_NONE;
59 static double scale_factor = 0;
60 static void _tbm_bufmgr_mutex_unlock(void);
62 //#define TBM_BUFMGR_INIT_TIME
64 #define PREFIX_LIB "libtbm_"
65 #define SUFFIX_LIB ".so"
66 #define DEFAULT_LIB PREFIX_LIB"default"SUFFIX_LIB
68 /* values to indicate unspecified fields in XF86ModReqInfo. */
69 #define MAJOR_UNSPEC 0xFF
70 #define MINOR_UNSPEC 0xFF
71 #define PATCH_UNSPEC 0xFFFF
72 #define ABI_VERS_UNSPEC 0xFFFFFFFF
74 #define MODULE_VERSION_NUMERIC(maj, min, patch) \
75 ((((maj) & 0xFF) << 24) | (((min) & 0xFF) << 16) | (patch & 0xFFFF))
76 #define GET_MODULE_MAJOR_VERSION(vers) (((vers) >> 24) & 0xFF)
77 #define GET_MODULE_MINOR_VERSION(vers) (((vers) >> 16) & 0xFF)
78 #define GET_MODULE_PATCHLEVEL(vers) ((vers) & 0xFFFF)
80 #define MAX_SIZE_N(dest) (sizeof(dest) - strlen(dest) - 1)
83 #define TBM_BUFMGR_RETURN_IF_FAIL(cond) {\
85 TBM_LOG_E("'%s' failed.\n", #cond);\
86 _tbm_bufmgr_mutex_unlock();\
91 #define TBM_BUFMGR_RETURN_VAL_IF_FAIL(cond, val) {\
93 TBM_LOG_E("'%s' failed.\n", #cond);\
94 _tbm_bufmgr_mutex_unlock();\
106 _tbm_set_last_result(tbm_error_e err)
108 tbm_last_error = err;
111 /* LCOV_EXCL_START */
113 _tbm_bufmgr_mutex_init(void)
115 static bool tbm_bufmgr_mutex_init = false;
117 if (tbm_bufmgr_mutex_init)
120 if (pthread_mutex_init(&tbm_bufmgr_lock, NULL)) {
121 TBM_LOG_E("fail: Cannot pthread_mutex_init for tbm_bufmgr_lock.\n");
125 tbm_bufmgr_mutex_init = true;
131 _tbm_bufmgr_mutex_lock(void)
133 if (!_tbm_bufmgr_mutex_init()) {
134 TBM_LOG_E("fail: _tbm_bufmgr_mutex_init()\n");
138 pthread_mutex_lock(&tbm_bufmgr_lock);
142 _tbm_bufmgr_mutex_unlock(void)
144 pthread_mutex_unlock(&tbm_bufmgr_lock);
148 _tbm_flag_to_str(int f)
150 static char str[255];
152 if (f == TBM_BO_DEFAULT)
153 snprintf(str, 255, "DEFAULT");
157 if (f & TBM_BO_SCANOUT)
158 c = snprintf(&str[c], 255, "SCANOUT");
160 if (f & TBM_BO_NONCACHABLE) {
162 c = snprintf(&str[c], 255, ", ");
163 c = snprintf(&str[c], 255, "NONCACHABLE,");
168 c = snprintf(&str[c], 255, ", ");
169 c = snprintf(&str[c], 255, "WC");
177 _tbm_util_check_bo_cnt(tbm_bufmgr bufmgr)
179 static int last_chk_bo_cnt = 0;
181 if ((bufmgr->bo_cnt >= 500) && ((bufmgr->bo_cnt % 20) == 0) &&
182 (bufmgr->bo_cnt > last_chk_bo_cnt)) {
183 TBM_DEBUG("============TBM BO CNT DEBUG: bo_cnt=%d\n",
186 tbm_bufmgr_debug_show(bufmgr);
188 last_chk_bo_cnt = bufmgr->bo_cnt;
193 _tbm_util_get_max_surface_size(int *w, int *h)
195 tbm_surface_info_s info;
196 tbm_surface_h surface = NULL;
202 if (gBufMgr == NULL || LIST_IS_EMPTY(&gBufMgr->surf_list))
205 LIST_FOR_EACH_ENTRY(surface, &gBufMgr->surf_list, item_link) {
206 if (tbm_surface_get_info(surface, &info) == TBM_SURFACE_ERROR_NONE) {
210 if (*h < info.height)
219 _tbm_util_get_appname_brief(char *brief)
223 char temp[255] = {0,};
224 char *saveptr = NULL;
226 token = strtok_r(brief, delim, &saveptr);
228 while (token != NULL) {
229 memset(temp, 0x00, 255 * sizeof(char));
230 strncpy(temp, token, 254 * sizeof(char));
231 token = strtok_r(NULL, delim, &saveptr);
234 snprintf(brief, sizeof(temp), "%s", temp);
238 _tbm_util_get_appname_from_pid(long pid, char *str)
240 char fn_cmdline[255] = {0, }, cmdline[255];
244 snprintf(fn_cmdline, sizeof(fn_cmdline), "/proc/%ld/cmdline", pid);
246 fp = fopen(fn_cmdline, "r");
248 TBM_LOG_E("cannot file open %s\n", fn_cmdline);
252 if (!fgets(cmdline, 255, fp)) {
253 TBM_LOG_E("fail to get appname for pid(%ld)\n", pid);
260 len = strlen(cmdline);
262 memset(cmdline, 0x00, 255);
266 snprintf(str, sizeof(cmdline), "%s", cmdline);
271 *user_data_lookup(struct list_head *user_data_list, unsigned long key)
273 tbm_user_data *old_data = NULL;
275 if (LIST_IS_EMPTY(user_data_list))
278 LIST_FOR_EACH_ENTRY(old_data, user_data_list, item_link) {
279 if (old_data->key == key)
287 *user_data_create(unsigned long key, tbm_data_free data_free_func)
289 tbm_user_data *user_data;
291 user_data = calloc(1, sizeof(tbm_user_data));
293 /* LCOV_EXCL_START */
294 TBM_LOG_E("fail to allocate an user_date\n");
299 user_data->key = key;
300 user_data->free_func = data_free_func;
306 user_data_delete(tbm_user_data *user_data)
308 if (user_data->data && user_data->free_func)
309 user_data->free_func(user_data->data);
311 LIST_DEL(&user_data->item_link);
317 _bo_lock(tbm_bo bo, int device, int opt)
319 tbm_bufmgr bufmgr = bo->bufmgr;
322 if (bufmgr->backend->bo_lock)
323 ret = bufmgr->backend->bo_lock(bo, device, opt);
329 _bo_unlock(tbm_bo bo)
331 tbm_bufmgr bufmgr = bo->bufmgr;
333 if (bufmgr->backend->bo_unlock)
334 bufmgr->backend->bo_unlock(bo);
338 _tbm_bo_lock(tbm_bo bo, int device, int opt)
348 /* do not try to lock the bo */
349 if (bufmgr->lock_type == LOCK_TRY_NEVER)
352 if (bo->lock_cnt < 0) {
353 TBM_LOG_E("error bo:%p LOCK_CNT=%d\n",
360 switch (bufmgr->lock_type) {
362 if (bo->lock_cnt == 0) {
363 _tbm_bufmgr_mutex_unlock();
364 ret = _bo_lock(bo, device, opt);
365 _tbm_bufmgr_mutex_lock();
371 case LOCK_TRY_ALWAYS:
372 _tbm_bufmgr_mutex_unlock();
373 ret = _bo_lock(bo, device, opt);
374 _tbm_bufmgr_mutex_lock();
379 TBM_LOG_E("error bo:%p lock_type[%d] is wrong.\n",
380 bo, bufmgr->lock_type);
385 TBM_DBG_LOCK(">> LOCK bo:%p(%d->%d)\n", bo, old, bo->lock_cnt);
391 _tbm_bo_unlock(tbm_bo bo)
401 /* do not try to unlock the bo */
402 if (bufmgr->lock_type == LOCK_TRY_NEVER)
407 switch (bufmgr->lock_type) {
409 if (bo->lock_cnt > 0) {
411 if (bo->lock_cnt == 0)
415 case LOCK_TRY_ALWAYS:
416 if (bo->lock_cnt > 0) {
422 TBM_LOG_E("error bo:%p lock_type[%d] is wrong.\n",
423 bo, bufmgr->lock_type);
427 if (bo->lock_cnt < 0)
430 TBM_DBG_LOCK(">> UNLOCK bo:%p(%d->%d)\n", bo, old, bo->lock_cnt);
434 _tbm_bo_is_valid(tbm_bo bo)
436 tbm_bo old_data = NULL;
438 if (bo == NULL || gBufMgr == NULL) {
439 TBM_LOG_E("error: bo is NULL or tbm_bufmgr was deinited\n");
443 if (LIST_IS_EMPTY(&gBufMgr->bo_list)) {
444 TBM_LOG_E("error: gBufMgr->bo_list is EMPTY.\n");
448 LIST_FOR_EACH_ENTRY(old_data, &gBufMgr->bo_list, item_link) {
453 TBM_LOG_E("error: No valid bo(%p).\n", bo);
459 _tbm_bo_free(tbm_bo bo)
461 tbm_bufmgr bufmgr = bo->bufmgr;
463 /* destory the user_data_list */
464 if (!LIST_IS_EMPTY(&bo->user_data_list)) {
465 tbm_user_data *old_data = NULL, *tmp;
467 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp,
468 &bo->user_data_list, item_link) {
469 TBM_DBG("free user_data\n");
470 user_data_delete(old_data);
474 while (bo->lock_cnt > 0) {
475 TBM_LOG_E("error lock_cnt:%d\n", bo->lock_cnt);
480 /* call the bo_free */
481 bufmgr->backend->bo_free(bo);
484 LIST_DEL(&bo->item_link);
490 /* LCOV_EXCL_START */
492 _check_version(TBMModuleVersionInfo *data)
497 abimaj = GET_ABI_MAJOR(data->abiversion);
498 abimin = GET_ABI_MINOR(data->abiversion);
500 TBM_DBG("TBM module %s: vendor=\"%s\" ABI=%d,%d\n",
501 data->modname ? data->modname : "UNKNOWN!",
502 data->vendor ? data->vendor : "UNKNOWN!", abimaj, abimin);
504 vermaj = GET_ABI_MAJOR(TBM_ABI_VERSION);
505 vermin = GET_ABI_MINOR(TBM_ABI_VERSION);
507 TBM_DBG("TBM ABI version %d.%d\n",
510 if (abimaj != vermaj) {
511 TBM_LOG_E("TBM module ABI major ver(%d) doesn't match the TBM's ver(%d)\n",
514 } else if (abimin > vermin) {
515 TBM_LOG_E("TBM module ABI minor ver(%d) is newer than the TBM's ver(%d)\n",
524 _tbm_bufmgr_load_module(tbm_bufmgr bufmgr, int fd, const char *file)
526 char path[PATH_MAX] = {0, };
527 TBMModuleVersionInfo *vers;
528 TBMModuleData *initdata;
532 snprintf(path, sizeof(path), BUFMGR_MODULE_DIR "/%s", file);
534 module_data = dlopen(path, RTLD_LAZY);
536 TBM_LOG_E("failed to load module: %s(%s)\n", dlerror(), file);
540 initdata = dlsym(module_data, "tbmModuleData");
542 TBM_LOG_E("Error: module does not have data object.\n");
546 vers = initdata->vers;
548 TBM_LOG_E("Error: module does not supply version information.\n");
552 init = initdata->init;
554 TBM_LOG_E("Error: module does not supply init symbol.\n");
558 if (!_check_version(vers)) {
559 TBM_LOG_E("Fail to check version.\n");
563 if (!init(bufmgr, fd)) {
564 TBM_LOG_E("Fail to init module(%s)\n", file);
568 if (!bufmgr->backend || !bufmgr->backend->priv) {
569 TBM_LOG_E("Error: module(%s) wrong operation. Check backend or backend's priv.\n", file);
573 bufmgr->module_data = module_data;
575 TBM_DBG("Success to load module(%s)\n", file);
580 dlclose(module_data);
585 _tbm_load_module(tbm_bufmgr bufmgr, int fd)
587 struct dirent **namelist;
590 /* load bufmgr priv from default lib */
591 if (_tbm_bufmgr_load_module(bufmgr, fd, DEFAULT_LIB))
594 /* load bufmgr priv from configured path */
595 n = scandir(BUFMGR_MODULE_DIR, &namelist, 0, alphasort);
597 TBM_LOG_E("no files : %s\n", BUFMGR_MODULE_DIR);
602 if (!ret && strstr(namelist[n]->d_name, PREFIX_LIB)) {
603 const char *p = strstr(namelist[n]->d_name, SUFFIX_LIB);
605 if (p && !strcmp(p, SUFFIX_LIB))
606 ret = _tbm_bufmgr_load_module(bufmgr, fd,
607 namelist[n]->d_name);
620 tbm_bufmgr_init(int fd)
622 #ifdef TBM_BUFMGR_INIT_TIME
623 struct timeval start_tv, end_tv;
627 #ifdef TBM_BUFMGR_INIT_TIME
628 /* get the start tv */
629 gettimeofday(&start_tv, NULL);
632 /* LCOV_EXCL_START */
634 env = getenv("TBM_DLOG");
637 TBM_LOG_D("TBM_DLOG=%s\n", env);
643 env = getenv("TBM_DEBUG");
646 TBM_LOG_D("TBM_DEBUG=%s\n", env);
652 env = getenv("TBM_TRACE");
655 TBM_LOG_D("TBM_TRACE=%s\n", env);
660 pthread_mutex_lock(&gLock);
663 TBM_LOG_W("!!!!!WARNING:: The tbm_bufmgr_init DOSE NOT use argument fd ANYMORE.\n");
664 TBM_LOG_W("!!!!!WARNING:: IT WILL BE CHANGED like tbm_bufmgr_init(int fd) --> tbm_bufmgr_init(void).\n");
668 /* initialize buffer manager */
670 gBufMgr->ref_count++;
671 TBM_TRACE("reuse tbm_bufmgr(%p) ref_count(%d) fd(%d)\n", gBufMgr, gBufMgr->ref_count, gBufMgr->fd);
672 pthread_mutex_unlock(&gLock);
676 TBM_DBG("bufmgr init\n");
678 /* allocate bufmgr */
679 gBufMgr = calloc(1, sizeof(struct _tbm_bufmgr));
681 _tbm_set_last_result(TBM_BO_ERROR_HEAP_ALLOC_FAILED);
682 TBM_TRACE("error: fail to alloc bufmgr fd(%d)\n", fd);
683 pthread_mutex_unlock(&gLock);
689 /* load bufmgr priv from env */
690 if (!_tbm_load_module(gBufMgr, gBufMgr->fd)) {
691 _tbm_set_last_result(TBM_BO_ERROR_LOAD_MODULE_FAILED);
692 TBM_LOG_E("error : Fail to load bufmgr backend\n");
695 pthread_mutex_unlock(&gLock);
701 /* log for tbm backend_flag */
702 TBM_DBG("backend flag:%x:", gBufMgr->backend->flags);
705 gBufMgr->ref_count = 1;
707 TBM_DBG("create tizen bufmgr:%p ref_count:%d\n",
708 gBufMgr, gBufMgr->ref_count);
710 /* setup the lock_type */
711 env = getenv("BUFMGR_LOCK_TYPE");
712 if (env && !strcmp(env, "always"))
713 gBufMgr->lock_type = LOCK_TRY_ALWAYS;
714 else if (env && !strcmp(env, "none"))
715 gBufMgr->lock_type = LOCK_TRY_NEVER;
716 else if (env && !strcmp(env, "once"))
717 gBufMgr->lock_type = LOCK_TRY_ONCE;
719 gBufMgr->lock_type = LOCK_TRY_ALWAYS;
721 TBM_DBG("BUFMGR_LOCK_TYPE=%s\n", env ? env : "default:once");
723 TBM_TRACE("create tbm_bufmgr(%p) ref_count(%d) fd(%d)\n", gBufMgr, gBufMgr->ref_count, fd);
725 /* intialize bo_list */
726 LIST_INITHEAD(&gBufMgr->bo_list);
728 /* intialize surf_list */
729 LIST_INITHEAD(&gBufMgr->surf_list);
731 /* intialize surf_queue_list */
732 LIST_INITHEAD(&gBufMgr->surf_queue_list);
734 /* intialize debug_key_list */
735 LIST_INITHEAD(&gBufMgr->debug_key_list);
737 #ifdef TBM_BUFMGR_INIT_TIME
739 gettimeofday(&end_tv, NULL);
740 TBM_LOG_I("tbm_bufmgr_init time: %ld ms", ((end_tv.tv_sec * 1000 + end_tv.tv_usec / 1000) - (start_tv.tv_sec * 1000 + start_tv.tv_usec / 1000)));
743 pthread_mutex_unlock(&gLock);
749 tbm_bufmgr_deinit(tbm_bufmgr bufmgr)
751 TBM_RETURN_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr));
753 _tbm_bufmgr_mutex_lock();
754 pthread_mutex_lock(&gLock);
757 TBM_LOG_E("gBufmgr already destroy: bufmgr:%p\n", bufmgr);
758 pthread_mutex_unlock(&gLock);
759 _tbm_bufmgr_mutex_unlock();
764 if (bufmgr->ref_count > 0) {
765 TBM_TRACE("reduce a ref_count(%d) of tbm_bufmgr(%p)\n", bufmgr->ref_count, bufmgr);
766 pthread_mutex_unlock(&gLock);
767 _tbm_bufmgr_mutex_unlock();
771 /* destroy bo_list */
772 if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
773 tbm_bo bo = NULL, tmp;
775 LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, &bufmgr->bo_list, item_link) {
776 TBM_LOG_E("Un-freed bo(%p, ref:%d)\n", bo, bo->ref_cnt);
779 LIST_DELINIT(&bufmgr->bo_list);
782 /* destroy surf_list */
783 if (!LIST_IS_EMPTY(&bufmgr->surf_list)) {
784 tbm_surface_h surf = NULL, tmp;
786 LIST_FOR_EACH_ENTRY_SAFE(surf, tmp, &bufmgr->surf_list, item_link) {
787 TBM_LOG_E("Un-freed surf(%p, ref:%d)\n", surf, surf->refcnt);
788 tbm_surface_destroy(surf);
790 LIST_DELINIT(&bufmgr->surf_list);
793 /* destroy bufmgr priv */
794 bufmgr->backend->bufmgr_deinit(bufmgr->backend->priv);
795 bufmgr->backend->priv = NULL;
796 tbm_backend_free(bufmgr->backend);
797 bufmgr->backend = NULL;
799 TBM_TRACE("destroy tbm_bufmgr(%p)\n", bufmgr);
801 dlclose(bufmgr->module_data);
809 pthread_mutex_unlock(&gLock);
810 _tbm_bufmgr_mutex_unlock();
814 tbm_bo_size(tbm_bo bo)
816 tbm_bufmgr bufmgr = gBufMgr;
819 _tbm_bufmgr_mutex_lock();
821 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
822 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
824 size = bufmgr->backend->bo_size(bo);
826 TBM_TRACE("bo(%p) size(%d)\n", bo, size);
828 _tbm_bufmgr_mutex_unlock();
834 tbm_bo_ref(tbm_bo bo)
836 _tbm_bufmgr_mutex_lock();
838 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), NULL);
839 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), NULL);
843 TBM_TRACE("bo(%p) ref_cnt(%d)\n", bo, bo->ref_cnt);
845 _tbm_bufmgr_mutex_unlock();
851 tbm_bo_unref(tbm_bo bo)
853 _tbm_bufmgr_mutex_lock();
855 TBM_BUFMGR_RETURN_IF_FAIL(gBufMgr);
856 TBM_BUFMGR_RETURN_IF_FAIL(_tbm_bo_is_valid(bo));
858 TBM_TRACE("bo(%p) ref_cnt(%d)\n", bo, bo->ref_cnt - 1);
860 if (bo->ref_cnt <= 0) {
861 _tbm_bufmgr_mutex_unlock();
866 if (bo->ref_cnt == 0)
869 _tbm_bufmgr_mutex_unlock();
873 tbm_bo_alloc(tbm_bufmgr bufmgr, int size, int flags)
878 _tbm_bufmgr_mutex_lock();
880 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
881 TBM_BUFMGR_RETURN_VAL_IF_FAIL(bufmgr == gBufMgr, NULL);
882 TBM_BUFMGR_RETURN_VAL_IF_FAIL(size > 0, NULL);
884 bo = calloc(1, sizeof(struct _tbm_bo));
886 /* LCOV_EXCL_START */
887 TBM_LOG_E("error: fail to create of tbm_bo size(%d) flag(%s)\n",
888 size, _tbm_flag_to_str(flags));
889 _tbm_set_last_result(TBM_BO_ERROR_HEAP_ALLOC_FAILED);
890 _tbm_bufmgr_mutex_unlock();
895 _tbm_util_check_bo_cnt(bufmgr);
899 bo_priv = bufmgr->backend->bo_alloc(bo, size, flags);
901 /* LCOV_EXCL_START */
902 TBM_LOG_E("error: fail to create of tbm_bo size(%d) flag(%s)\n",
903 size, _tbm_flag_to_str(flags));
904 _tbm_set_last_result(TBM_BO_ERROR_BO_ALLOC_FAILED);
906 _tbm_bufmgr_mutex_unlock();
917 TBM_TRACE("bo(%p) size(%d) refcnt(%d), flag(%s)\n", bo, size, bo->ref_cnt,
918 _tbm_flag_to_str(bo->flags));
920 LIST_INITHEAD(&bo->user_data_list);
922 LIST_ADD(&bo->item_link, &bufmgr->bo_list);
924 _tbm_bufmgr_mutex_unlock();
930 tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key)
935 _tbm_bufmgr_mutex_lock();
937 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
938 TBM_BUFMGR_RETURN_VAL_IF_FAIL(bufmgr == gBufMgr, NULL);
940 if (!bufmgr->backend->bo_import) {
941 /* LCOV_EXCL_START */
942 _tbm_bufmgr_mutex_unlock();
947 _tbm_util_check_bo_cnt(bufmgr);
949 bo = calloc(1, sizeof(struct _tbm_bo));
951 /* LCOV_EXCL_START */
952 TBM_LOG_E("error: fail to import of tbm_bo by key(%d)\n", key);
953 _tbm_bufmgr_mutex_unlock();
960 bo_priv = bufmgr->backend->bo_import(bo, key);
962 /* LCOV_EXCL_START */
963 TBM_LOG_E("error: fail to import of tbm_bo by key(%d)\n", key);
964 _tbm_set_last_result(TBM_BO_ERROR_IMPORT_FAILED);
966 _tbm_bufmgr_mutex_unlock();
971 if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
974 LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) {
975 if (bo2->priv == bo_priv) {
976 TBM_TRACE("find bo(%p) ref(%d) key(%d) flag(%s) in list\n",
977 bo2, bo2->ref_cnt, key,
978 _tbm_flag_to_str(bo2->flags));
981 _tbm_bufmgr_mutex_unlock();
992 if (bufmgr->backend->bo_get_flags)
993 bo->flags = bufmgr->backend->bo_get_flags(bo);
995 bo->flags = TBM_BO_DEFAULT;
997 TBM_TRACE("import new bo(%p) ref(%d) key(%d) flag(%s) in list\n",
998 bo, bo->ref_cnt, key, _tbm_flag_to_str(bo->flags));
1000 LIST_INITHEAD(&bo->user_data_list);
1002 LIST_ADD(&bo->item_link, &bufmgr->bo_list);
1004 _tbm_bufmgr_mutex_unlock();
1010 tbm_bo_import_fd(tbm_bufmgr bufmgr, tbm_fd fd)
1015 _tbm_bufmgr_mutex_lock();
1017 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
1018 TBM_BUFMGR_RETURN_VAL_IF_FAIL(bufmgr == gBufMgr, NULL);
1020 if (!bufmgr->backend->bo_import_fd) {
1021 /* LCOV_EXCL_START */
1022 _tbm_bufmgr_mutex_unlock();
1024 /* LCOV_EXCL_STOP */
1027 _tbm_util_check_bo_cnt(bufmgr);
1029 bo = calloc(1, sizeof(struct _tbm_bo));
1031 /* LCOV_EXCL_START */
1032 TBM_LOG_E("error: fail to import tbm_bo by tbm_fd(%d)\n", fd);
1033 _tbm_bufmgr_mutex_unlock();
1035 /* LCOV_EXCL_STOP */
1038 bo->bufmgr = bufmgr;
1040 bo_priv = bufmgr->backend->bo_import_fd(bo, fd);
1042 /* LCOV_EXCL_START */
1043 TBM_LOG_E("error: fail to import tbm_bo by tbm_fd(%d)\n", fd);
1044 _tbm_set_last_result(TBM_BO_ERROR_IMPORT_FD_FAILED);
1046 _tbm_bufmgr_mutex_unlock();
1048 /* LCOV_EXCL_STOP */
1051 if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
1054 LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) {
1055 if (bo2->priv == bo_priv) {
1056 TBM_TRACE("find bo(%p) ref(%d) fd(%d) flag(%s) in list\n",
1057 bo2, bo2->ref_cnt, fd,
1058 _tbm_flag_to_str(bo2->flags));
1061 _tbm_bufmgr_mutex_unlock();
1072 if (bufmgr->backend->bo_get_flags)
1073 bo->flags = bufmgr->backend->bo_get_flags(bo);
1075 bo->flags = TBM_BO_DEFAULT;
1077 TBM_TRACE("import bo(%p) ref(%d) fd(%d) flag(%s)\n",
1078 bo, bo->ref_cnt, fd, _tbm_flag_to_str(bo->flags));
1080 LIST_INITHEAD(&bo->user_data_list);
1082 LIST_ADD(&bo->item_link, &bufmgr->bo_list);
1084 _tbm_bufmgr_mutex_unlock();
1090 tbm_bo_export(tbm_bo bo)
1092 tbm_bufmgr bufmgr = gBufMgr;
1095 _tbm_bufmgr_mutex_lock();
1097 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1098 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1100 if (!bufmgr->backend->bo_export) {
1101 /* LCOV_EXCL_START */
1102 _tbm_bufmgr_mutex_unlock();
1104 /* LCOV_EXCL_STOP */
1107 ret = bufmgr->backend->bo_export(bo);
1109 /* LCOV_EXCL_START */
1110 _tbm_set_last_result(TBM_BO_ERROR_EXPORT_FAILED);
1111 TBM_LOG_E("error: bo(%p) tbm_key(%d)\n", bo, ret);
1112 _tbm_bufmgr_mutex_unlock();
1114 /* LCOV_EXCL_STOP */
1117 TBM_TRACE("bo(%p) tbm_key(%u)\n", bo, ret);
1119 _tbm_bufmgr_mutex_unlock();
1125 tbm_bo_export_fd(tbm_bo bo)
1127 tbm_bufmgr bufmgr = gBufMgr;
1130 _tbm_bufmgr_mutex_lock();
1132 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), -1);
1133 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), -1);
1135 if (!bufmgr->backend->bo_export_fd) {
1136 /* LCOV_EXCL_START */
1137 _tbm_bufmgr_mutex_unlock();
1139 /* LCOV_EXCL_STOP */
1142 ret = bufmgr->backend->bo_export_fd(bo);
1144 /* LCOV_EXCL_START */
1145 _tbm_set_last_result(TBM_BO_ERROR_EXPORT_FD_FAILED);
1146 TBM_LOG_E("error: bo(%p) tbm_fd(%d)\n", bo, ret);
1147 _tbm_bufmgr_mutex_unlock();
1149 /* LCOV_EXCL_STOP */
1152 TBM_TRACE("bo(%p) tbm_fd(%d)\n", bo, ret);
1154 _tbm_bufmgr_mutex_unlock();
1160 tbm_bo_get_handle(tbm_bo bo, int device)
1162 tbm_bufmgr bufmgr = gBufMgr;
1163 tbm_bo_handle bo_handle;
1165 _tbm_bufmgr_mutex_lock();
1167 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), (tbm_bo_handle) NULL);
1168 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), (tbm_bo_handle) NULL);
1170 bo_handle = bufmgr->backend->bo_get_handle(bo, device);
1171 if (bo_handle.ptr == NULL) {
1172 /* LCOV_EXCL_START */
1173 _tbm_set_last_result(TBM_BO_ERROR_GET_HANDLE_FAILED);
1174 TBM_LOG_E("error: bo(%p) bo_handle(%p)\n", bo, bo_handle.ptr);
1175 _tbm_bufmgr_mutex_unlock();
1176 return (tbm_bo_handle) NULL;
1177 /* LCOV_EXCL_STOP */
1180 TBM_TRACE("bo(%p) bo_handle(%p)\n", bo, bo_handle.ptr);
1182 _tbm_bufmgr_mutex_unlock();
1188 tbm_bo_map(tbm_bo bo, int device, int opt)
1190 tbm_bufmgr bufmgr = gBufMgr;
1191 tbm_bo_handle bo_handle;
1193 _tbm_bufmgr_mutex_lock();
1195 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), (tbm_bo_handle) NULL);
1196 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), (tbm_bo_handle) NULL);
1198 if (!_tbm_bo_lock(bo, device, opt)) {
1199 _tbm_set_last_result(TBM_BO_ERROR_LOCK_FAILED);
1200 TBM_LOG_E("error: fail to lock bo:%p)\n", bo);
1201 _tbm_bufmgr_mutex_unlock();
1202 return (tbm_bo_handle) NULL;
1205 bo_handle = bufmgr->backend->bo_map(bo, device, opt);
1206 if (bo_handle.ptr == NULL) {
1207 /* LCOV_EXCL_START */
1208 _tbm_set_last_result(TBM_BO_ERROR_MAP_FAILED);
1209 TBM_LOG_E("error: fail to map bo:%p\n", bo);
1211 _tbm_bufmgr_mutex_unlock();
1212 return (tbm_bo_handle) NULL;
1213 /* LCOV_EXCL_STOP */
1216 /* increase the map_count */
1219 TBM_TRACE("bo(%p) map_cnt(%d)\n", bo, bo->map_cnt);
1221 _tbm_bufmgr_mutex_unlock();
1227 tbm_bo_unmap(tbm_bo bo)
1229 tbm_bufmgr bufmgr = gBufMgr;
1232 _tbm_bufmgr_mutex_lock();
1234 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1235 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1237 ret = bufmgr->backend->bo_unmap(bo);
1239 /* LCOV_EXCL_START */
1240 TBM_LOG_E("error: bo(%p) map_cnt(%d)\n", bo, bo->map_cnt);
1241 _tbm_set_last_result(TBM_BO_ERROR_UNMAP_FAILED);
1242 _tbm_bufmgr_mutex_unlock();
1244 /* LCOV_EXCL_STOP */
1247 /* decrease the map_count */
1250 TBM_TRACE("bo(%p) map_cnt(%d)\n", bo, bo->map_cnt);
1254 _tbm_bufmgr_mutex_unlock();
1260 tbm_bo_swap(tbm_bo bo1, tbm_bo bo2)
1262 tbm_bufmgr bufmgr = gBufMgr;
1265 _tbm_bufmgr_mutex_lock();
1267 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1268 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo1), 0);
1269 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo2), 0);
1271 TBM_TRACE("before: bo1(%p) bo2(%p)\n", bo1, bo2);
1273 if (bufmgr->backend->bo_size(bo1) != bufmgr->backend->bo_size(bo2)) {
1274 _tbm_set_last_result(TBM_BO_ERROR_SWAP_FAILED);
1275 TBM_LOG_E("error: bo1(%p) bo2(%p)\n", bo1, bo2);
1276 _tbm_bufmgr_mutex_unlock();
1280 TBM_TRACE("after: bo1(%p) bo2(%p)\n", bo1, bo2);
1283 bo1->priv = bo2->priv;
1286 _tbm_bufmgr_mutex_unlock();
1292 tbm_bo_locked(tbm_bo bo)
1294 tbm_bufmgr bufmgr = gBufMgr;
1296 _tbm_bufmgr_mutex_lock();
1298 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1299 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1301 if (bufmgr->lock_type == LOCK_TRY_NEVER) {
1302 TBM_LOG_E("bo(%p) lock_cnt(%d)\n", bo, bo->lock_cnt);
1303 _tbm_bufmgr_mutex_unlock();
1307 if (bo->lock_cnt > 0) {
1308 TBM_TRACE("error: bo(%p) lock_cnt(%d)\n", bo, bo->lock_cnt);
1309 _tbm_bufmgr_mutex_unlock();
1313 TBM_TRACE("bo(%p) lock_cnt(%d)\n", bo, bo->lock_cnt);
1314 _tbm_bufmgr_mutex_unlock();
1320 tbm_bo_add_user_data(tbm_bo bo, unsigned long key,
1321 tbm_data_free data_free_func)
1323 tbm_user_data *data;
1325 _tbm_bufmgr_mutex_lock();
1327 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1328 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1330 /* check if the data according to the key exist if so, return false. */
1331 data = user_data_lookup(&bo->user_data_list, key);
1333 TBM_TRACE("warning: user data already exist key(%ld)\n", key);
1334 _tbm_bufmgr_mutex_unlock();
1338 data = user_data_create(key, data_free_func);
1340 TBM_LOG_E("error: bo(%p) key(%lu)\n", bo, key);
1341 _tbm_bufmgr_mutex_unlock();
1345 TBM_TRACE("bo(%p) key(%lu) data(%p)\n", bo, key, data->data);
1347 LIST_ADD(&data->item_link, &bo->user_data_list);
1349 _tbm_bufmgr_mutex_unlock();
1355 tbm_bo_set_user_data(tbm_bo bo, unsigned long key, void *data)
1357 tbm_user_data *old_data;
1359 _tbm_bufmgr_mutex_lock();
1361 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1362 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1364 if (LIST_IS_EMPTY(&bo->user_data_list)) {
1365 TBM_TRACE("error: bo(%p) key(%lu)\n", bo, key);
1366 _tbm_bufmgr_mutex_unlock();
1370 old_data = user_data_lookup(&bo->user_data_list, key);
1372 TBM_TRACE("error: bo(%p) key(%lu)\n", bo, key);
1373 _tbm_bufmgr_mutex_unlock();
1377 if (old_data->data && old_data->free_func)
1378 old_data->free_func(old_data->data);
1379 old_data->data = data;
1381 TBM_TRACE("bo(%p) key(%lu) data(%p)\n", bo, key, old_data->data);
1383 _tbm_bufmgr_mutex_unlock();
1389 tbm_bo_get_user_data(tbm_bo bo, unsigned long key, void **data)
1391 tbm_user_data *old_data;
1393 _tbm_bufmgr_mutex_lock();
1395 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1396 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1398 if (!data || LIST_IS_EMPTY(&bo->user_data_list)) {
1399 TBM_TRACE("error: bo(%p) key(%lu)\n", bo, key);
1400 _tbm_bufmgr_mutex_unlock();
1404 old_data = user_data_lookup(&bo->user_data_list, key);
1406 TBM_TRACE("error: bo(%p) key(%lu)\n", bo, key);
1408 _tbm_bufmgr_mutex_unlock();
1412 *data = old_data->data;
1414 TBM_TRACE("bo(%p) key(%lu) data(%p)\n", bo, key, old_data->data);
1416 _tbm_bufmgr_mutex_unlock();
1422 tbm_bo_delete_user_data(tbm_bo bo, unsigned long key)
1424 tbm_user_data *old_data;
1426 _tbm_bufmgr_mutex_lock();
1428 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1429 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1431 if (LIST_IS_EMPTY(&bo->user_data_list)) {
1432 TBM_TRACE("error: bo(%p) key(%lu)\n", bo, key);
1433 _tbm_bufmgr_mutex_unlock();
1437 old_data = user_data_lookup(&bo->user_data_list, key);
1439 TBM_TRACE("error: bo(%p) key(%lu)\n", bo, key);
1440 _tbm_bufmgr_mutex_unlock();
1444 TBM_TRACE("bo(%p) key(%lu) data(%p)\n", bo, key, old_data->data);
1446 user_data_delete(old_data);
1448 _tbm_bufmgr_mutex_unlock();
1454 tbm_bufmgr_get_capability(tbm_bufmgr bufmgr)
1456 unsigned int capabilities = TBM_BUFMGR_CAPABILITY_NONE;
1458 _tbm_bufmgr_mutex_lock();
1460 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), TBM_BUFMGR_CAPABILITY_NONE);
1461 TBM_BUFMGR_RETURN_VAL_IF_FAIL(bufmgr == gBufMgr, TBM_BUFMGR_CAPABILITY_NONE);
1463 TBM_TRACE("tbm_bufmgr(%p) capability(%u)\n", bufmgr, bufmgr->capabilities);
1465 capabilities = bufmgr->capabilities;
1467 _tbm_bufmgr_mutex_unlock();
1469 return capabilities;
1473 tbm_bo_get_flags(tbm_bo bo)
1477 _tbm_bufmgr_mutex_lock();
1479 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1480 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1484 TBM_TRACE("bo(%p)\n", bo);
1486 _tbm_bufmgr_mutex_unlock();
1491 /* LCOV_EXCL_START */
1493 tbm_get_last_error(void)
1495 return tbm_last_error;
1499 tbm_bufmgr_debug_tbm_info_get(tbm_bufmgr bufmgr)
1501 char app_name[255] = {0,}, title[512] = {0,};
1502 tbm_surface_debug_data *debug_old_data = NULL;
1507 pthread_mutex_lock(&gLock);
1509 if (!TBM_BUFMGR_IS_VALID(bufmgr) || (bufmgr != gBufMgr)) {
1510 TBM_LOG_E("invalid bufmgr\n");
1511 pthread_mutex_unlock(&gLock);
1517 TBM_LOG_E("Fail to allocate the string.\n");
1518 pthread_mutex_unlock(&gLock);
1522 TBM_SNRPRINTF(str, len, c, "\n");
1523 _tbm_util_get_appname_from_pid(getpid(), app_name);
1524 _tbm_util_get_appname_brief(app_name);
1525 TBM_SNRPRINTF(str, len, c, "============TBM DEBUG: %s(%d)===========================\n",
1526 app_name, getpid());
1528 snprintf(title, 255, "%s", "no surface refcnt width height bpp size n_b n_p flags format app_name ");
1530 if (!LIST_IS_EMPTY(&bufmgr->debug_key_list)) {
1531 LIST_FOR_EACH_ENTRY(debug_old_data, &bufmgr->debug_key_list, item_link) {
1532 strncat(title, " ", MAX_SIZE_N(title));
1533 strncat(title, debug_old_data->key, MAX_SIZE_N(title));
1537 TBM_SNRPRINTF(str, len, c, "[tbm_surface information]\n");
1538 TBM_SNRPRINTF(str, len, c, "%s\n", title);
1540 /* show the tbm_surface information in surf_list */
1541 if (!LIST_IS_EMPTY(&bufmgr->surf_list)) {
1542 tbm_surface_h surf = NULL;
1545 LIST_FOR_EACH_ENTRY(surf, &bufmgr->surf_list, item_link) {
1546 char data[512] = {0,};
1550 pid = _tbm_surface_internal_get_debug_pid(surf);
1552 /* if pid is null, set the self_pid */
1556 memset(app_name, 0x0, 255 * sizeof(char));
1557 _tbm_util_get_appname_from_pid(pid, app_name);
1558 _tbm_util_get_appname_brief(app_name);
1560 snprintf(data, 255, "%-2d %-9p %-4d %-5u %-6u %-3u %-6u %-2d %-2d %-3d %-8s %-15s",
1567 surf->info.size / 1024,
1571 _tbm_surface_internal_format_to_str(surf->info.format) + 11,
1574 if (!LIST_IS_EMPTY(&bufmgr->debug_key_list)) {
1575 LIST_FOR_EACH_ENTRY(debug_old_data, &bufmgr->debug_key_list, item_link) {
1578 strncat(data, " ", MAX_SIZE_N(title));
1580 value = _tbm_surface_internal_get_debug_data(surf, debug_old_data->key);
1582 strncat(data, value, MAX_SIZE_N(title));
1584 strncat(data, "none", MAX_SIZE_N(title));
1587 TBM_SNRPRINTF(str, len, c, "%s\n", data);
1589 for (i = 0; i < surf->num_bos; i++) {
1590 TBM_SNRPRINTF(str, len, c, " bo:%-12p %-26d%-10d\n",
1592 surf->bos[i]->ref_cnt,
1593 bufmgr->backend->bo_size(surf->bos[i]) / 1024);
1597 TBM_SNRPRINTF(str, len, c, " no tbm_surfaces.\n");
1598 TBM_SNRPRINTF(str, len, c, "\n");
1600 TBM_SNRPRINTF(str, len, c, "[tbm_bo information]\n");
1601 TBM_SNRPRINTF(str, len, c, "no bo refcnt size lock_cnt map_cnt flags surface name\n");
1603 /* show the tbm_bo information in bo_list */
1604 if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
1608 LIST_FOR_EACH_ENTRY(bo, &bufmgr->bo_list, item_link) {
1609 TBM_SNRPRINTF(str, len, c, "%-4d%-11p %-4d %-6d %-5d %-4u %-3d %-11p %-4d\n",
1613 bufmgr->backend->bo_size(bo) / 1024,
1618 bufmgr->backend->bo_export(bo));
1621 TBM_SNRPRINTF(str, len, c, "no tbm_bos.\n");
1622 TBM_SNRPRINTF(str, len, c, "\n");
1624 TBM_SNRPRINTF(str, len, c, "===============================================================\n");
1626 pthread_mutex_unlock(&gLock);
1632 tbm_bufmgr_debug_show(tbm_bufmgr bufmgr)
1635 str = tbm_bufmgr_debug_tbm_info_get(bufmgr);
1637 TBM_DEBUG(" %s", str);
1643 tbm_bufmgr_debug_trace(tbm_bufmgr bufmgr, int onoff)
1645 _tbm_bufmgr_mutex_lock();
1647 TBM_BUFMGR_RETURN_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr));
1648 TBM_BUFMGR_RETURN_IF_FAIL(bufmgr == gBufMgr);
1651 TBM_LOG_D("bufmgr=%p onoff=%d\n", bufmgr, onoff);
1655 _tbm_bufmgr_mutex_unlock();
1659 tbm_bufmgr_debug_dump_set_scale(double scale)
1661 pthread_mutex_lock(&gLock);
1662 scale_factor = scale;
1663 pthread_mutex_unlock(&gLock);
1667 tbm_bufmgr_debug_queue_dump(char *path, int count, int onoff)
1669 pthread_mutex_lock(&gLock);
1672 TBM_LOG_D("count=%d onoff=%d\n", count, onoff);
1674 tbm_surface_internal_dump_end();
1679 TBM_LOG_E("path is null");
1680 pthread_mutex_unlock(&gLock);
1683 TBM_LOG_D("path=%s count=%d onoff=%d\n", path, count, onoff);
1685 if (_tbm_util_get_max_surface_size(&w, &h) == 0) {
1686 TBM_LOG_E("Fail to get tbm_surface size.\n");
1687 pthread_mutex_unlock(&gLock);
1691 tbm_surface_internal_dump_with_scale_start(path, w, h, count, scale_factor);
1697 pthread_mutex_unlock(&gLock);
1702 tbm_bufmgr_debug_dump_all(char *path)
1704 int w, h, count = 0;
1705 tbm_surface_h surface = NULL;
1707 TBM_RETURN_VAL_IF_FAIL(path != NULL, 0);
1708 TBM_LOG_D("path=%s\n", path);
1710 pthread_mutex_lock(&gLock);
1712 count = _tbm_util_get_max_surface_size(&w, &h);
1714 TBM_LOG_E("No tbm_surface.\n");
1715 pthread_mutex_unlock(&gLock);
1719 tbm_surface_internal_dump_with_scale_start(path, w, h, count, scale_factor);
1722 LIST_FOR_EACH_ENTRY(surface, &gBufMgr->surf_list, item_link)
1723 tbm_surface_internal_dump_buffer(surface, "dump_all");
1725 tbm_surface_internal_dump_end();
1727 pthread_mutex_unlock(&gLock);
1732 /* internal function */
1734 _tbm_bufmgr_get_bufmgr(void)
1740 _tbm_bo_set_surface(tbm_bo bo, tbm_surface_h surface)
1742 _tbm_bufmgr_mutex_lock();
1744 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1745 TBM_BUFMGR_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
1747 bo->surface = surface;
1749 _tbm_bufmgr_mutex_unlock();
1755 tbm_bufmgr_bind_native_display(tbm_bufmgr bufmgr, void *NativeDisplay)
1759 _tbm_bufmgr_mutex_lock();
1761 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
1763 if (!bufmgr->backend->bufmgr_bind_native_display) {
1764 TBM_TRACE("skip: tbm_bufmgr(%p) NativeDisplay(%p)\n",
1765 bufmgr, NativeDisplay);
1766 _tbm_bufmgr_mutex_unlock();
1770 ret = bufmgr->backend->bufmgr_bind_native_display(bufmgr, NativeDisplay);
1772 TBM_LOG_E("error: tbm_bufmgr(%p) NativeDisplay(%p)\n",
1773 bufmgr, NativeDisplay);
1774 _tbm_bufmgr_mutex_unlock();
1778 TBM_TRACE("tbm_bufmgr(%p) NativeDisplay(%p)\n", bufmgr, NativeDisplay);
1780 _tbm_bufmgr_mutex_unlock();
1785 int tbm_bufmgr_get_fd_limit(void)
1789 if (getrlimit(RLIMIT_NOFILE, &lim))
1792 return (int)lim.rlim_cur;
1794 /* LCOV_EXCL_STOP */