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_drm_helper.h"
39 #include <sys/resource.h>
50 static pthread_mutex_t gLock = PTHREAD_MUTEX_INITIALIZER;
51 static pthread_mutex_t tbm_bufmgr_lock = PTHREAD_MUTEX_INITIALIZER;
52 static double scale_factor = 0;
53 void _tbm_bufmgr_mutex_unlock(void);
55 //#define TBM_BUFMGR_INIT_TIME
57 #define MAX_SIZE_N(dest) (sizeof(dest) - strlen(dest) - 1)
60 #define TBM_BUFMGR_RETURN_IF_FAIL(cond) {\
62 TBM_ERR("'%s' failed.\n", #cond);\
63 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);\
64 _tbm_bufmgr_mutex_unlock();\
69 #define TBM_BUFMGR_RETURN_VAL_IF_FAIL(cond, val) {\
71 TBM_ERR("'%s' failed.\n", #cond);\
72 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);\
73 _tbm_bufmgr_mutex_unlock();\
81 _tbm_bufmgr_mutex_lock(void)
83 pthread_mutex_lock(&tbm_bufmgr_lock);
87 _tbm_bufmgr_mutex_unlock(void)
89 pthread_mutex_unlock(&tbm_bufmgr_lock);
93 _tbm_util_get_max_surface_size(int *w, int *h)
95 tbm_surface_info_s info;
96 tbm_surface_h surface = NULL;
102 if (gBufMgr == NULL || LIST_IS_EMPTY(&gBufMgr->surf_list))
105 LIST_FOR_EACH_ENTRY(surface, &gBufMgr->surf_list, item_link) {
106 if (tbm_surface_get_info(surface, &info) == TBM_SURFACE_ERROR_NONE) {
110 if (*h < info.height)
119 _tbm_util_get_appname_brief(char *brief)
123 char temp[255] = {0,};
124 char *saveptr = NULL;
126 token = strtok_r(brief, delim, &saveptr);
128 while (token != NULL) {
129 memset(temp, 0x00, 255 * sizeof(char));
130 strncpy(temp, token, 254 * sizeof(char));
131 token = strtok_r(NULL, delim, &saveptr);
134 snprintf(brief, sizeof(temp), "%s", temp);
138 _tbm_util_get_appname_from_pid(long pid, char *str)
140 char fn_cmdline[255] = {0, }, cmdline[255];
144 if (pid <= 0) return;
146 snprintf(fn_cmdline, sizeof(fn_cmdline), "/proc/%ld/cmdline", pid);
148 fp = fopen(fn_cmdline, "r");
150 TBM_ERR("cannot file open %s\n", fn_cmdline);
154 if (!fgets(cmdline, 255, fp)) {
155 TBM_ERR("fail to get appname for pid(%ld)\n", pid);
162 len = strlen(cmdline);
164 memset(cmdline, 0x00, 255);
168 snprintf(str, sizeof(cmdline), "%s", cmdline);
174 _tbm_bufmgr_init(int fd, int server)
176 #ifdef TBM_BUFMGR_INIT_TIME
177 struct timeval start_tv, end_tv;
181 #ifdef TBM_BUFMGR_INIT_TIME
182 /* get the start tv */
183 gettimeofday(&start_tv, NULL);
188 /* LCOV_EXCL_START */
190 env = getenv("TBM_TRACE");
192 trace_mask = atoi(env);
193 TBM_DBG("TBM_TRACE=%s\n", env);
198 pthread_mutex_lock(&gLock);
200 _tbm_set_last_result(TBM_ERROR_NONE);
203 TBM_WRN("!!!!!WARNING:: The tbm_bufmgr_init DOSE NOT use argument fd ANYMORE.\n");
204 TBM_WRN("!!!!!WARNING:: IT WILL BE CHANGED like tbm_bufmgr_init(int fd) --> tbm_bufmgr_init(void).\n");
208 /* initialize buffer manager */
210 gBufMgr->ref_count++;
211 TBM_DBG("reuse tbm_bufmgr(%p) ref_count(%d) fd(%d)\n", gBufMgr, gBufMgr->ref_count, gBufMgr->fd);
212 pthread_mutex_unlock(&gLock);
216 TBM_DBG("bufmgr init\n");
218 /* allocate bufmgr */
219 gBufMgr = calloc(1, sizeof(struct _tbm_bufmgr));
221 TBM_ERR("error: fail to alloc bufmgr fd(%d)\n", fd);
222 _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY);
223 pthread_mutex_unlock(&gLock);
229 /* set the display_server flag before loading the backend module */
231 TBM_INFO("The tbm_bufmgr(%p) is used by display server. Need to bind the native_display.\n", gBufMgr);
232 gBufMgr->display_server = 1;
235 /* load bufmgr priv from env */
236 gBufMgr->module = tbm_module_load(gBufMgr, gBufMgr->fd);
237 if (!gBufMgr->module) {
238 TBM_ERR("error : Fail to load bufmgr backend\n");
239 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
242 pthread_mutex_unlock(&gLock);
247 /* check the essential capabilities of tbm_module */
248 gBufMgr->capabilities = tbm_module_bufmgr_get_capabilities(gBufMgr->module);
249 if (gBufMgr->capabilities == HAL_TBM_BUFMGR_CAPABILITY_NONE) {
250 TBM_ERR("The capabilities of the backend module is TBM_BUFMGR_CAPABILITY_NONE.");
251 TBM_ERR("TBM_BUFMGR_CAPABILITY_SHARE_FD is the essential capability.");
252 tbm_module_unload(gBufMgr->module);
253 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
256 pthread_mutex_unlock(&gLock);
260 if (!(gBufMgr->capabilities & HAL_TBM_BUFMGR_CAPABILITY_SHARE_FD)) {
261 TBM_ERR("The capabilities of the backend module had no TBM_BUFMGR_CAPABILITY_SHARE_FD.");
262 TBM_ERR("The tbm backend has to get TBM_BUFMGR_CAPABILITY_SHARE_FD. ");
263 tbm_module_unload(gBufMgr->module);
264 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
267 pthread_mutex_unlock(&gLock);
273 gBufMgr->ref_count = 1;
275 TBM_INFO("create tizen bufmgr:%p ref_count:%d\n",
276 gBufMgr, gBufMgr->ref_count);
278 /* setup the bo_lock_type */
279 env = getenv("BUFMGR_LOCK_TYPE");
280 if (env && !strcmp(env, "always"))
281 gBufMgr->bo_lock_type = TBM_BUFMGR_BO_LOCK_TYPE_ALWAYS;
282 else if (env && !strcmp(env, "none"))
283 gBufMgr->bo_lock_type = TBM_BUFMGR_BO_LOCK_TYPE_NEVER;
284 else if (env && !strcmp(env, "once"))
285 gBufMgr->bo_lock_type = TBM_BUFMGR_BO_LOCK_TYPE_ONCE;
287 gBufMgr->bo_lock_type = TBM_BUFMGR_BO_LOCK_TYPE_ALWAYS;
289 TBM_DBG("BUFMGR_LOCK_TYPE=%s\n", env ? env : "default:once");
291 /* intialize bo_list */
292 LIST_INITHEAD(&gBufMgr->bo_list);
294 /* intialize surf_list */
295 LIST_INITHEAD(&gBufMgr->surf_list);
297 /* intialize surf_queue_list */
298 LIST_INITHEAD(&gBufMgr->surf_queue_list);
300 /* intialize debug_key_list */
301 LIST_INITHEAD(&gBufMgr->debug_key_list);
303 #ifdef TBM_BUFMGR_INIT_TIME
305 gettimeofday(&end_tv, NULL);
306 TBM_INFO("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)));
309 pthread_mutex_unlock(&gLock);
315 tbm_bufmgr_init(int fd)
319 bufmgr = _tbm_bufmgr_init(fd, 0);
325 tbm_bufmgr_deinit(tbm_bufmgr bufmgr)
327 TBM_RETURN_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr));
329 _tbm_bufmgr_mutex_lock();
330 pthread_mutex_lock(&gLock);
331 _tbm_set_last_result(TBM_ERROR_NONE);
334 TBM_ERR("gBufmgr already destroy: bufmgr:%p\n", bufmgr);
335 pthread_mutex_unlock(&gLock);
336 _tbm_bufmgr_mutex_unlock();
341 if (bufmgr->ref_count > 0) {
342 TBM_DBG("reduce a ref_count(%d) of tbm_bufmgr(%p)\n", bufmgr->ref_count, bufmgr);
343 pthread_mutex_unlock(&gLock);
344 _tbm_bufmgr_mutex_unlock();
348 /* destroy bo_list */
349 if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
350 tbm_bo bo = NULL, tmp;
352 LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, &bufmgr->bo_list, item_link) {
353 TBM_ERR("Un-freed bo(%p, ref:%d)\n", bo, bo->ref_cnt);
356 LIST_DELINIT(&bufmgr->bo_list);
359 /* destroy surf_list */
360 if (!LIST_IS_EMPTY(&bufmgr->surf_list)) {
361 tbm_surface_h surf = NULL, tmp;
363 LIST_FOR_EACH_ENTRY_SAFE(surf, tmp, &bufmgr->surf_list, item_link) {
364 TBM_ERR("Un-freed surf(%p, ref:%d)\n", surf, surf->refcnt);
365 tbm_surface_destroy(surf);
367 LIST_DELINIT(&bufmgr->surf_list);
370 tbm_module_unload(bufmgr->module);
375 TBM_INFO("destroy tbm_bufmgr(%p)\n", bufmgr);
380 pthread_mutex_unlock(&gLock);
381 _tbm_bufmgr_mutex_unlock();
385 tbm_bufmgr_get_capability(tbm_bufmgr bufmgr)
387 unsigned int capabilities = TBM_BUFMGR_CAPABILITY_NONE;
389 _tbm_bufmgr_mutex_lock();
390 _tbm_set_last_result(TBM_ERROR_NONE);
392 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), TBM_BUFMGR_CAPABILITY_NONE);
393 TBM_BUFMGR_RETURN_VAL_IF_FAIL(bufmgr == gBufMgr, TBM_BUFMGR_CAPABILITY_NONE);
395 capabilities = bufmgr->capabilities;
397 _tbm_bufmgr_mutex_unlock();
402 /* LCOV_EXCL_START */
404 tbm_bufmgr_debug_tbm_info_get(tbm_bufmgr bufmgr)
406 char app_name[255] = {0,}, title[512] = {0,};
407 tbm_surface_debug_data *debug_old_data = NULL;
415 pthread_mutex_lock(&gLock);
416 _tbm_set_last_result(TBM_ERROR_NONE);
418 if (!TBM_BUFMGR_IS_VALID(bufmgr) || (bufmgr != gBufMgr)) {
419 TBM_ERR("invalid bufmgr\n");
420 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
421 pthread_mutex_unlock(&gLock);
427 TBM_ERR("Fail to allocate the string.\n");
428 _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY);
429 pthread_mutex_unlock(&gLock);
433 TBM_SNRPRINTF(str, len, c, "\n");
434 pid = syscall(SYS_getpid);
435 _tbm_util_get_appname_from_pid(pid, app_name);
436 _tbm_util_get_appname_brief(app_name);
437 TBM_SNRPRINTF(str, len, c, "===========================================TBM DEBUG: %s(%ld)===========================================\n",
440 snprintf(title, 255, "%s", "no surface refcnt width height bpp size n_b n_p flags format app_name ");
442 if (!LIST_IS_EMPTY(&bufmgr->debug_key_list)) {
443 LIST_FOR_EACH_ENTRY(debug_old_data, &bufmgr->debug_key_list, item_link) {
444 strncat(title, " ", MAX_SIZE_N(title));
445 strncat(title, debug_old_data->key, MAX_SIZE_N(title));
449 TBM_SNRPRINTF(str, len, c, "[tbm_surface information]\n");
450 TBM_SNRPRINTF(str, len, c, "%s\n", title);
452 /* show the tbm_surface information in surf_list */
453 if (!LIST_IS_EMPTY(&bufmgr->surf_list)) {
454 tbm_surface_h surf = NULL;
457 LIST_FOR_EACH_ENTRY(surf, &bufmgr->surf_list, item_link) {
458 char data[512] = {0,};
459 unsigned int surf_pid = 0;
462 surf_pid = _tbm_surface_internal_get_debug_pid(surf);
464 /* if pid is null, set the self_pid */
465 surf_pid = syscall(SYS_getpid);;
468 memset(app_name, 0x0, 255 * sizeof(char));
469 if (geteuid() == 0) {
470 _tbm_util_get_appname_from_pid(surf_pid, app_name);
471 _tbm_util_get_appname_brief(app_name);
473 snprintf(app_name, sizeof(app_name), "%d", surf_pid);
476 snprintf(data, 255, "%-3d %-11p %-5d %-6u %-7u %-4u %-7u %-3d %-3d %-8d %-9s %-22s",
483 surf->info.size / 1024,
487 _tbm_surface_internal_format_to_str(surf->info.format) + 11,
490 if (!LIST_IS_EMPTY(&bufmgr->debug_key_list)) {
491 LIST_FOR_EACH_ENTRY(debug_old_data, &bufmgr->debug_key_list, item_link) {
494 strncat(data, " ", MAX_SIZE_N(title));
496 value = _tbm_surface_internal_get_debug_data(surf, debug_old_data->key);
498 strncat(data, value, MAX_SIZE_N(title));
500 strncat(data, "none", MAX_SIZE_N(title));
503 TBM_SNRPRINTF(str, len, c, "%s\n", data);
505 for (i = 0; i < surf->num_bos; i++) {
506 if (bufmgr->use_hal_tbm) {
507 size = hal_tbm_bo_get_size((hal_tbm_bo *)surf->bos[i]->bo_data, (hal_tbm_error *)&error);
508 if (error != TBM_ERROR_NONE)
509 TBM_WRN("fail to get the size of bo.");
510 } else if (bufmgr->backend_module_data) {
511 size = bufmgr->bo_func->bo_get_size(surf->bos[i]->bo_data, &error);
512 if (error != TBM_ERROR_NONE)
513 TBM_WRN("fail to get the size of bo.");
515 size = bufmgr->backend->bo_size(surf->bos[i]);
516 TBM_SNRPRINTF(str, len, c, " bo:%-12p %-26d%-10d\n",
518 surf->bos[i]->ref_cnt,
523 TBM_SNRPRINTF(str, len, c, " no tbm_surfaces.\n");
524 TBM_SNRPRINTF(str, len, c, "\n");
526 TBM_SNRPRINTF(str, len, c, "[tbm_bo information]\n");
527 TBM_SNRPRINTF(str, len, c, "no bo refcnt size lock_cnt map_cnt flags surface name\n");
529 /* show the tbm_bo information in bo_list */
530 if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
535 LIST_FOR_EACH_ENTRY(bo, &bufmgr->bo_list, item_link) {
536 if (bo->bufmgr->use_hal_tbm) {
537 size = hal_tbm_bo_get_size((hal_tbm_bo *)bo->bo_data, (hal_tbm_error *)&error);
538 if (error != TBM_ERROR_NONE)
539 TBM_WRN("fail to get the size of bo.");
540 key = (tbm_key)hal_tbm_bo_export_key((hal_tbm_bo *)bo->bo_data, (hal_tbm_error *)&error);
541 } else if (bufmgr->backend_module_data) {
542 size = bufmgr->bo_func->bo_get_size(bo->bo_data, &error);
543 if (error != TBM_ERROR_NONE)
544 TBM_WRN("fail to get the size of bo.");
545 key = bufmgr->bo_func->bo_export_key(bo->bo_data, &error);
546 if (error != TBM_ERROR_NONE)
547 TBM_WRN("fail to get the tdm_key of bo.");
549 size = bufmgr->backend->bo_size(bo);
550 key = bufmgr->backend->bo_export(bo);
552 TBM_SNRPRINTF(str, len, c, "%-3d %-11p %-5d %-7d %-6d %-5u %-7d %-11p %-4d\n",
564 TBM_SNRPRINTF(str, len, c, "no tbm_bos.\n");
565 TBM_SNRPRINTF(str, len, c, "\n");
567 TBM_SNRPRINTF(str, len, c, "========================================================================================================\n");
569 pthread_mutex_unlock(&gLock);
575 tbm_bufmgr_debug_show(tbm_bufmgr bufmgr)
578 str = tbm_bufmgr_debug_tbm_info_get(bufmgr);
586 tbm_bufmgr_debug_trace(tbm_bufmgr bufmgr, int onoff)
588 _tbm_bufmgr_mutex_lock();
589 _tbm_set_last_result(TBM_ERROR_NONE);
591 TBM_BUFMGR_RETURN_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr));
592 TBM_BUFMGR_RETURN_IF_FAIL(bufmgr == gBufMgr);
595 TBM_LOG_D("bufmgr=%p onoff=%d\n", bufmgr, onoff);
599 _tbm_bufmgr_mutex_unlock();
603 tbm_bufmgr_debug_set_trace_mask(tbm_bufmgr bufmgr, tbm_bufmgr_debug_trace_mask mask, int set)
605 _tbm_bufmgr_mutex_lock();
606 _tbm_set_last_result(TBM_ERROR_NONE);
608 TBM_BUFMGR_RETURN_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr));
609 TBM_BUFMGR_RETURN_IF_FAIL(bufmgr == gBufMgr);
614 TBM_INFO("bufmgr=%p sets the trace_mask=%d\n", bufmgr, mask);
615 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_BO)
616 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_BO");
617 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_INTERNAL)
618 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_SURFACE_INTERNAL");
619 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE)
620 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_SURFACE");
621 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_QUEUE)
622 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_SURFACE_QUEUE");
623 } else if (set == 0) {
626 TBM_INFO("bufmgr=%p unsets the trace_mask=%d\n", bufmgr, mask);
627 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_BO)
628 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_BO");
629 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_INTERNAL)
630 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_SURFACE_INTERNAL");
631 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE)
632 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_SURFACE");
633 if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_QUEUE)
634 TBM_INFO(" TBM_BUFGMR_DEBUG_TRACE_SURFACE_QUEUE");
636 TBM_WRN("set value is wrong.(set=%d)", set);
639 _tbm_bufmgr_mutex_unlock();
643 tbm_bufmgr_debug_dump_set_scale(double scale)
645 pthread_mutex_lock(&gLock);
646 _tbm_set_last_result(TBM_ERROR_NONE);
647 scale_factor = scale;
648 pthread_mutex_unlock(&gLock);
652 tbm_bufmgr_debug_get_ref_count(void)
656 pthread_mutex_lock(&gLock);
658 _tbm_set_last_result(TBM_ERROR_NONE);
660 refcnt = (gBufMgr) ? gBufMgr->ref_count : 0;
662 pthread_mutex_unlock(&gLock);
668 tbm_bufmgr_debug_queue_dump(char *path, int count, int onoff)
670 pthread_mutex_lock(&gLock);
671 _tbm_set_last_result(TBM_ERROR_NONE);
674 TBM_DBG("count=%d onoff=%d\n", count, onoff);
676 tbm_surface_internal_dump_end();
681 TBM_ERR("path is null");
682 pthread_mutex_unlock(&gLock);
685 TBM_DBG("path=%s count=%d onoff=%d\n", path, count, onoff);
687 if (_tbm_util_get_max_surface_size(&w, &h) == 0) {
688 TBM_ERR("Fail to get tbm_surface size.\n");
689 pthread_mutex_unlock(&gLock);
693 tbm_surface_internal_dump_with_scale_start(path, w, h, count, scale_factor);
699 pthread_mutex_unlock(&gLock);
705 tbm_bufmgr_debug_dump_all(char *path)
708 tbm_surface_h surface = NULL;
710 pthread_mutex_lock(&gLock);
711 _tbm_set_last_result(TBM_ERROR_NONE);
714 TBM_ERR("path is null.\n");
715 pthread_mutex_unlock(&gLock);
719 TBM_DBG("path=%s\n", path);
721 count = _tbm_util_get_max_surface_size(&w, &h);
723 TBM_ERR("No tbm_surface.\n");
724 pthread_mutex_unlock(&gLock);
728 tbm_surface_internal_dump_with_scale_start(path, w, h, count, scale_factor);
731 LIST_FOR_EACH_ENTRY(surface, &gBufMgr->surf_list, item_link)
732 tbm_surface_internal_dump_buffer(surface, "dump_all");
734 tbm_surface_internal_dump_end();
736 pthread_mutex_unlock(&gLock);
741 /* internal function */
743 _tbm_bufmgr_get_bufmgr(void)
749 tbm_bufmgr_bind_native_display(tbm_bufmgr bufmgr, void *native_display)
754 _tbm_bufmgr_mutex_lock();
755 _tbm_set_last_result(TBM_ERROR_NONE);
757 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
759 if (bufmgr->use_hal_tbm) {
760 if (hal_tbm_backend_has_drm_device(bufmgr->hal_backend, &ret)) {
761 int fd = tbm_drm_helper_get_fd(); // this must be the auth drm_fd.(master drm_fd);
763 TBM_ERR("error: tbm_bufmgr(%p) native_display(%p)\n", bufmgr, native_display);
764 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
765 _tbm_bufmgr_mutex_unlock();
769 // make the wayland server socket for sending the authenticated drm_fd to wayland clients.
770 if (!tbm_drm_helper_wl_auth_server_init(native_display, fd, NULL, 0)) {
771 TBM_ERR("error: tbm_drm_helper_wl_auth_server_init failed\n", bufmgr, native_display);
773 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
774 _tbm_bufmgr_mutex_unlock();
777 TBM_INFO("tbm creates a wayland socket for authentication of drm_fd.");
779 bufmgr->auth_wl_socket_created = 1;
780 bufmgr->auth_fd = fd;
782 // TODO: this duplication will be removed after refactoring tbm_module
783 bufmgr->module->auth_wl_socket_created = 1;
784 bufmgr->module->bufmgr->auth_fd = fd;
786 } else if (bufmgr->backend_module_data) {
787 if (!bufmgr->bufmgr_func->bufmgr_bind_native_display) {
788 TBM_WRN("skip: tbm_bufmgr(%p) native_display(%p)\n",
789 bufmgr, native_display);
790 _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED);
791 _tbm_bufmgr_mutex_unlock();
795 error = bufmgr->bufmgr_func->bufmgr_bind_native_display(bufmgr->bufmgr_data, (tbm_native_display *)native_display);
796 if (error != TBM_ERROR_NONE) {
797 TBM_ERR("error: tbm_bufmgr(%p) native_display(%p) error(%d)\n",
798 bufmgr, native_display, error);
799 _tbm_set_last_result(error);
800 _tbm_bufmgr_mutex_unlock();
805 if (!bufmgr->backend->bufmgr_bind_native_display) {
806 TBM_WRN("skip: tbm_bufmgr(%p) native_display(%p)\n",
807 bufmgr, native_display);
808 _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED);
809 _tbm_bufmgr_mutex_unlock();
813 ret = bufmgr->backend->bufmgr_bind_native_display(bufmgr, native_display);
815 TBM_ERR("error: tbm_bufmgr(%p) native_display(%p)\n",
816 bufmgr, native_display);
817 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
818 _tbm_bufmgr_mutex_unlock();
823 TBM_INFO("tbm_bufmgr(%p) native_display(%p)\n", bufmgr, native_display);
825 _tbm_bufmgr_mutex_unlock();
831 tbm_bufmgr_server_init(void)
835 bufmgr = _tbm_bufmgr_init(-1, 1);
841 tbm_bufmgr_set_bo_lock_type(tbm_bufmgr bufmgr, tbm_bufmgr_bo_lock_type bo_lock_type)
843 _tbm_bufmgr_mutex_lock();
844 _tbm_set_last_result(TBM_ERROR_NONE);
846 TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(gBufMgr), 0);
847 TBM_BUFMGR_RETURN_VAL_IF_FAIL(bufmgr == gBufMgr, 0);
849 pthread_mutex_lock(&gLock);
850 gBufMgr->bo_lock_type = bo_lock_type;
851 pthread_mutex_unlock(&gLock);
853 TBM_INFO("The bo_lock_type of the bo is %d\n", bo_lock_type);
855 _tbm_bufmgr_mutex_unlock();
861 int tbm_bufmgr_get_fd_limit(void)
865 if (getrlimit(RLIMIT_NOFILE, &lim))
868 return (int)lim.rlim_cur;
871 tbm_bufmgr tbm_bufmgr_get(void)