1 /**************************************************************************
5 Copyright 2014 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 **************************************************************************/
33 #include "tbm_bufmgr.h"
34 #include "tbm_bufmgr_int.h"
35 #include "tbm_surface_internal.h"
38 static tbm_bufmgr g_surface_bufmgr;
39 static pthread_mutex_t tbm_surface_lock;
42 _tbm_surface_is_valid(tbm_surface_h surface)
44 tbm_surface_h old_data = NULL, tmp = NULL;
46 if (surface == NULL || g_surface_bufmgr == NULL)
49 if (!LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
50 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp, &g_surface_bufmgr->surf_list, item_link) {
51 if (old_data == surface)
59 _tbm_surface_internal_format_to_str(tbm_format format)
63 return "TBM_FORMAT_C8";
64 case TBM_FORMAT_RGB332:
65 return "TBM_FORMAT_RGB332";
66 case TBM_FORMAT_BGR233:
67 return "TBM_FORMAT_BGR233";
68 case TBM_FORMAT_XRGB4444:
69 return "TBM_FORMAT_XRGB4444";
70 case TBM_FORMAT_XBGR4444:
71 return "TBM_FORMAT_XBGR4444";
72 case TBM_FORMAT_RGBX4444:
73 return "TBM_FORMAT_RGBX4444";
74 case TBM_FORMAT_BGRX4444:
75 return "TBM_FORMAT_BGRX4444";
76 case TBM_FORMAT_ARGB4444:
77 return "TBM_FORMAT_ARGB4444";
78 case TBM_FORMAT_ABGR4444:
79 return "TBM_FORMAT_ABGR4444";
80 case TBM_FORMAT_RGBA4444:
81 return "TBM_FORMAT_RGBA4444";
82 case TBM_FORMAT_BGRA4444:
83 return "TBM_FORMAT_BGRA4444";
84 case TBM_FORMAT_XRGB1555:
85 return "TBM_FORMAT_XRGB1555";
86 case TBM_FORMAT_XBGR1555:
87 return "TBM_FORMAT_XBGR1555";
88 case TBM_FORMAT_RGBX5551:
89 return "TBM_FORMAT_RGBX5551";
90 case TBM_FORMAT_BGRX5551:
91 return "TBM_FORMAT_BGRX5551";
92 case TBM_FORMAT_ARGB1555:
93 return "TBM_FORMAT_ARGB1555";
94 case TBM_FORMAT_ABGR1555:
95 return "TBM_FORMAT_ABGR1555";
96 case TBM_FORMAT_RGBA5551:
97 return "TBM_FORMAT_RGBA5551";
98 case TBM_FORMAT_BGRA5551:
99 return "TBM_FORMAT_BGRA5551";
100 case TBM_FORMAT_RGB565:
101 return "TBM_FORMAT_RGB565";
102 case TBM_FORMAT_BGR565:
103 return "TBM_FORMAT_BGR565";
104 case TBM_FORMAT_RGB888:
105 return "TBM_FORMAT_RGB888";
106 case TBM_FORMAT_BGR888:
107 return "TBM_FORMAT_BGR888";
108 case TBM_FORMAT_XRGB8888:
109 return "TBM_FORMAT_XRGB8888";
110 case TBM_FORMAT_XBGR8888:
111 return "TBM_FORMAT_XBGR8888";
112 case TBM_FORMAT_RGBX8888:
113 return "TBM_FORMAT_RGBX8888";
114 case TBM_FORMAT_BGRX8888:
115 return "TBM_FORMAT_BGRX8888";
116 case TBM_FORMAT_ARGB8888:
117 return "TBM_FORMAT_ARGB8888";
118 case TBM_FORMAT_ABGR8888:
119 return "TBM_FORMAT_ABGR8888";
120 case TBM_FORMAT_RGBA8888:
121 return "TBM_FORMAT_RGBA8888";
122 case TBM_FORMAT_BGRA8888:
123 return "TBM_FORMAT_BGRA8888";
124 case TBM_FORMAT_XRGB2101010:
125 return "TBM_FORMAT_XRGB2101010";
126 case TBM_FORMAT_XBGR2101010:
127 return "TBM_FORMAT_XBGR2101010";
128 case TBM_FORMAT_RGBX1010102:
129 return "TBM_FORMAT_RGBX1010102";
130 case TBM_FORMAT_BGRX1010102:
131 return "TBM_FORMAT_BGRX1010102";
132 case TBM_FORMAT_ARGB2101010:
133 return "TBM_FORMAT_ARGB2101010";
134 case TBM_FORMAT_ABGR2101010:
135 return "TBM_FORMAT_ABGR2101010";
136 case TBM_FORMAT_RGBA1010102:
137 return "TBM_FORMAT_RGBA1010102";
138 case TBM_FORMAT_BGRA1010102:
139 return "TBM_FORMAT_BGRA1010102";
140 case TBM_FORMAT_YUYV:
141 return "TBM_FORMAT_YUYV";
142 case TBM_FORMAT_YVYU:
143 return "TBM_FORMAT_YVYU";
144 case TBM_FORMAT_UYVY:
145 return "TBM_FORMAT_UYVY";
146 case TBM_FORMAT_VYUY:
147 return "TBM_FORMAT_VYUY";
148 case TBM_FORMAT_AYUV:
149 return "TBM_FORMAT_AYUV";
150 case TBM_FORMAT_NV12:
151 return "TBM_FORMAT_NV12";
152 case TBM_FORMAT_NV21:
153 return "TBM_FORMAT_NV21";
154 case TBM_FORMAT_NV16:
155 return "TBM_FORMAT_NV16";
156 case TBM_FORMAT_NV61:
157 return "TBM_FORMAT_NV61";
158 case TBM_FORMAT_YUV410:
159 return "TBM_FORMAT_YUV410";
160 case TBM_FORMAT_YVU410:
161 return "TBM_FORMAT_YVU410";
162 case TBM_FORMAT_YUV411:
163 return "TBM_FORMAT_YUV411";
164 case TBM_FORMAT_YVU411:
165 return "TBM_FORMAT_YVU411";
166 case TBM_FORMAT_YUV420:
167 return "TBM_FORMAT_YUV420";
168 case TBM_FORMAT_YVU420:
169 return "TBM_FORMAT_YVU420";
170 case TBM_FORMAT_YUV422:
171 return "TBM_FORMAT_YUV422";
172 case TBM_FORMAT_YVU422:
173 return "TBM_FORMAT_YVU422";
174 case TBM_FORMAT_YUV444:
175 return "TBM_FORMAT_YUV444";
176 case TBM_FORMAT_YVU444:
177 return "TBM_FORMAT_YVU444";
178 case TBM_FORMAT_NV12MT:
179 return "TBM_FORMAT_NV12MT";
186 _tbm_surface_mutex_init(void)
188 static bool tbm_surface_mutex_init = false;
190 if (tbm_surface_mutex_init)
193 if (pthread_mutex_init(&tbm_surface_lock, NULL)) {
194 TBM_LOG("[libtbm] fail: tbm_surface mutex init\n");
198 tbm_surface_mutex_init = true;
204 _tbm_surface_mutex_lock(void)
206 if (!_tbm_surface_mutex_init())
209 pthread_mutex_lock(&tbm_surface_lock);
213 _tbm_surface_mutex_unlock(void)
215 pthread_mutex_unlock(&tbm_surface_lock);
219 _init_surface_bufmgr(void)
221 g_surface_bufmgr = tbm_bufmgr_init(-1);
225 _deinit_surface_bufmgr(void)
227 if (!g_surface_bufmgr)
230 tbm_bufmgr_deinit(g_surface_bufmgr);
231 g_surface_bufmgr = NULL;
235 _tbm_surface_internal_query_plane_data(tbm_surface_h surface,
236 int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
238 TBM_RETURN_VAL_IF_FAIL(surface, 0);
239 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
241 struct _tbm_surface *surf = (struct _tbm_surface *)surface;
242 struct _tbm_bufmgr *mgr = surf->bufmgr;
245 TBM_RETURN_VAL_IF_FAIL(mgr != NULL, 0);
246 TBM_RETURN_VAL_IF_FAIL(surf->info.width > 0, 0);
247 TBM_RETURN_VAL_IF_FAIL(surf->info.height > 0, 0);
248 TBM_RETURN_VAL_IF_FAIL(surf->info.format > 0, 0);
250 if (!mgr->backend->surface_get_plane_data)
253 ret = mgr->backend->surface_get_plane_data(surf->info.width,
254 surf->info.height, surf->info.format, plane_idx, size, offset, pitch, bo_idx);
262 _tbm_surface_internal_destroy(tbm_surface_h surface)
265 tbm_bufmgr bufmgr = surface->bufmgr;
266 tbm_user_data *old_data = NULL, *tmp = NULL;
268 for (i = 0; i < surface->num_bos; i++) {
269 surface->bos[i]->surface = NULL;
271 tbm_bo_unref(surface->bos[i]);
272 surface->bos[i] = NULL;
275 /* destory the user_data_list */
276 if (!LIST_IS_EMPTY(&surface->user_data_list)) {
277 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp, &surface->user_data_list, item_link) {
278 TBM_LOG("[tbm_surface:%d] free user_data\n",
280 user_data_delete(old_data);
284 LIST_DEL(&surface->item_link);
289 if (LIST_IS_EMPTY(&bufmgr->surf_list)) {
290 LIST_DELINIT(&bufmgr->surf_list);
291 _deinit_surface_bufmgr();
296 tbm_surface_internal_query_supported_formats(uint32_t **formats,
299 struct _tbm_bufmgr *mgr;
302 _tbm_surface_mutex_lock();
304 if (!g_surface_bufmgr) {
305 _init_surface_bufmgr();
306 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
309 mgr = g_surface_bufmgr;
311 if (!mgr->backend->surface_supported_format) {
312 _tbm_surface_mutex_unlock();
316 ret = mgr->backend->surface_supported_format(formats, num);
318 _tbm_surface_mutex_unlock();
324 tbm_surface_internal_get_num_planes(tbm_format format)
330 case TBM_FORMAT_RGB332:
331 case TBM_FORMAT_BGR233:
332 case TBM_FORMAT_XRGB4444:
333 case TBM_FORMAT_XBGR4444:
334 case TBM_FORMAT_RGBX4444:
335 case TBM_FORMAT_BGRX4444:
336 case TBM_FORMAT_ARGB4444:
337 case TBM_FORMAT_ABGR4444:
338 case TBM_FORMAT_RGBA4444:
339 case TBM_FORMAT_BGRA4444:
340 case TBM_FORMAT_XRGB1555:
341 case TBM_FORMAT_XBGR1555:
342 case TBM_FORMAT_RGBX5551:
343 case TBM_FORMAT_BGRX5551:
344 case TBM_FORMAT_ARGB1555:
345 case TBM_FORMAT_ABGR1555:
346 case TBM_FORMAT_RGBA5551:
347 case TBM_FORMAT_BGRA5551:
348 case TBM_FORMAT_RGB565:
349 case TBM_FORMAT_BGR565:
350 case TBM_FORMAT_RGB888:
351 case TBM_FORMAT_BGR888:
352 case TBM_FORMAT_XRGB8888:
353 case TBM_FORMAT_XBGR8888:
354 case TBM_FORMAT_RGBX8888:
355 case TBM_FORMAT_BGRX8888:
356 case TBM_FORMAT_ARGB8888:
357 case TBM_FORMAT_ABGR8888:
358 case TBM_FORMAT_RGBA8888:
359 case TBM_FORMAT_BGRA8888:
360 case TBM_FORMAT_XRGB2101010:
361 case TBM_FORMAT_XBGR2101010:
362 case TBM_FORMAT_RGBX1010102:
363 case TBM_FORMAT_BGRX1010102:
364 case TBM_FORMAT_ARGB2101010:
365 case TBM_FORMAT_ABGR2101010:
366 case TBM_FORMAT_RGBA1010102:
367 case TBM_FORMAT_BGRA1010102:
368 case TBM_FORMAT_YUYV:
369 case TBM_FORMAT_YVYU:
370 case TBM_FORMAT_UYVY:
371 case TBM_FORMAT_VYUY:
372 case TBM_FORMAT_AYUV:
375 case TBM_FORMAT_NV12:
376 case TBM_FORMAT_NV12MT:
377 case TBM_FORMAT_NV21:
378 case TBM_FORMAT_NV16:
379 case TBM_FORMAT_NV61:
382 case TBM_FORMAT_YUV410:
383 case TBM_FORMAT_YVU410:
384 case TBM_FORMAT_YUV411:
385 case TBM_FORMAT_YVU411:
386 case TBM_FORMAT_YUV420:
387 case TBM_FORMAT_YVU420:
388 case TBM_FORMAT_YUV422:
389 case TBM_FORMAT_YVU422:
390 case TBM_FORMAT_YUV444:
391 case TBM_FORMAT_YVU444:
403 tbm_surface_internal_get_bpp(tbm_format format)
409 case TBM_FORMAT_RGB332:
410 case TBM_FORMAT_BGR233:
413 case TBM_FORMAT_XRGB4444:
414 case TBM_FORMAT_XBGR4444:
415 case TBM_FORMAT_RGBX4444:
416 case TBM_FORMAT_BGRX4444:
417 case TBM_FORMAT_ARGB4444:
418 case TBM_FORMAT_ABGR4444:
419 case TBM_FORMAT_RGBA4444:
420 case TBM_FORMAT_BGRA4444:
421 case TBM_FORMAT_XRGB1555:
422 case TBM_FORMAT_XBGR1555:
423 case TBM_FORMAT_RGBX5551:
424 case TBM_FORMAT_BGRX5551:
425 case TBM_FORMAT_ARGB1555:
426 case TBM_FORMAT_ABGR1555:
427 case TBM_FORMAT_RGBA5551:
428 case TBM_FORMAT_BGRA5551:
429 case TBM_FORMAT_RGB565:
430 case TBM_FORMAT_BGR565:
433 case TBM_FORMAT_RGB888:
434 case TBM_FORMAT_BGR888:
437 case TBM_FORMAT_XRGB8888:
438 case TBM_FORMAT_XBGR8888:
439 case TBM_FORMAT_RGBX8888:
440 case TBM_FORMAT_BGRX8888:
441 case TBM_FORMAT_ARGB8888:
442 case TBM_FORMAT_ABGR8888:
443 case TBM_FORMAT_RGBA8888:
444 case TBM_FORMAT_BGRA8888:
445 case TBM_FORMAT_XRGB2101010:
446 case TBM_FORMAT_XBGR2101010:
447 case TBM_FORMAT_RGBX1010102:
448 case TBM_FORMAT_BGRX1010102:
449 case TBM_FORMAT_ARGB2101010:
450 case TBM_FORMAT_ABGR2101010:
451 case TBM_FORMAT_RGBA1010102:
452 case TBM_FORMAT_BGRA1010102:
453 case TBM_FORMAT_YUYV:
454 case TBM_FORMAT_YVYU:
455 case TBM_FORMAT_UYVY:
456 case TBM_FORMAT_VYUY:
457 case TBM_FORMAT_AYUV:
460 case TBM_FORMAT_NV12:
461 case TBM_FORMAT_NV12MT:
462 case TBM_FORMAT_NV21:
465 case TBM_FORMAT_NV16:
466 case TBM_FORMAT_NV61:
469 case TBM_FORMAT_YUV410:
470 case TBM_FORMAT_YVU410:
473 case TBM_FORMAT_YUV411:
474 case TBM_FORMAT_YVU411:
475 case TBM_FORMAT_YUV420:
476 case TBM_FORMAT_YVU420:
479 case TBM_FORMAT_YUV422:
480 case TBM_FORMAT_YVU422:
483 case TBM_FORMAT_YUV444:
484 case TBM_FORMAT_YVU444:
495 tbm_surface_internal_create_with_flags(int width, int height,
496 int format, int flags)
498 TBM_RETURN_VAL_IF_FAIL(width > 0, NULL);
499 TBM_RETURN_VAL_IF_FAIL(height > 0, NULL);
501 struct _tbm_bufmgr *mgr;
502 struct _tbm_surface *surf = NULL;
506 uint32_t bo_size = 0;
510 _tbm_surface_mutex_lock();
512 if (!g_surface_bufmgr) {
513 _init_surface_bufmgr();
514 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
517 mgr = g_surface_bufmgr;
518 if (!TBM_BUFMGR_IS_VALID(mgr)) {
519 _tbm_surface_mutex_unlock();
522 surf = calloc(1, sizeof(struct _tbm_surface));
524 _tbm_surface_mutex_unlock();
529 surf->info.width = width;
530 surf->info.height = height;
531 surf->info.format = format;
532 surf->info.bpp = tbm_surface_internal_get_bpp(format);
533 surf->info.num_planes = tbm_surface_internal_get_num_planes(format);
536 /* get size, stride and offset bo_idx */
537 for (i = 0; i < surf->info.num_planes; i++) {
538 _tbm_surface_internal_query_plane_data(surf, i, &size, &offset, &stride,
540 surf->info.planes[i].size = size;
541 surf->info.planes[i].offset = offset;
542 surf->info.planes[i].stride = stride;
543 surf->planes_bo_idx[i] = bo_idx;
548 for (i = 0; i < surf->info.num_planes; i++) {
549 surf->info.size += surf->info.planes[i].size;
551 if (surf->num_bos -1 > surf->planes_bo_idx[i])
552 surf->num_bos = surf->planes_bo_idx[i]++;
557 for (i = 0; i < surf->num_bos; i++) {
559 for (j = 0; j < surf->info.num_planes; j++) {
560 if (surf->planes_bo_idx[j] == i)
561 bo_size += surf->info.planes[j].size;
564 if (mgr->backend->surface_bo_alloc) {
567 void *bo_priv = NULL;
569 bo = calloc(1, sizeof(struct _tbm_bo));
571 TBM_LOG("[libtbm:%d] "
572 "error %s:%d fail to alloc bo struct\n",
573 getpid(), __func__, __LINE__);
577 bo->bufmgr = surf->bufmgr;
579 pthread_mutex_lock(&surf->bufmgr->lock);
581 bo_priv = mgr->backend->surface_bo_alloc (bo, width, height, format, flags, i);
583 TBM_LOG("[libtbm:%d] "
584 "error %s:%d fail to alloc bo priv\n",
585 getpid(), __func__, __LINE__);
587 pthread_mutex_unlock(&surf->bufmgr->lock);
595 LIST_INITHEAD(&bo->user_data_list);
597 LIST_ADD(&bo->item_link, &surf->bufmgr->bo_list);
599 pthread_mutex_unlock(&surf->bufmgr->lock);
604 surf->bos[i] = tbm_bo_alloc(mgr, bo_size, flags);
608 TBM_LOG("[libtbm:%d] "
609 "error %s:%d fail to alloc bo\n",
610 getpid(), __func__, __LINE__);
614 _tbm_bo_set_surface(surf->bos[i], surf);
618 LIST_INITHEAD(&surf->user_data_list);
620 LIST_ADD(&surf->item_link, &mgr->surf_list);
622 _tbm_surface_mutex_unlock();
627 for (j = 0; j < i; j++) {
629 tbm_bo_unref(surf->bos[j]);
635 if (LIST_IS_EMPTY(&mgr->surf_list)) {
636 LIST_DELINIT(&mgr->surf_list);
637 _deinit_surface_bufmgr();
640 _tbm_surface_mutex_unlock();
645 tbm_surface_internal_create_with_bos(tbm_surface_info_s *info,
646 tbm_bo *bos, int num)
648 TBM_RETURN_VAL_IF_FAIL(bos, NULL);
649 TBM_RETURN_VAL_IF_FAIL(info, NULL);
650 TBM_RETURN_VAL_IF_FAIL(num == 1 || info->num_planes == num, NULL);
652 struct _tbm_bufmgr *mgr;
653 struct _tbm_surface *surf = NULL;
656 _tbm_surface_mutex_lock();
658 if (!g_surface_bufmgr) {
659 _init_surface_bufmgr();
660 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
663 mgr = g_surface_bufmgr;
664 if (!TBM_BUFMGR_IS_VALID(mgr)) {
665 _tbm_surface_mutex_unlock();
669 surf = calloc(1, sizeof(struct _tbm_surface));
671 _tbm_surface_mutex_unlock();
676 surf->info.width = info->width;
677 surf->info.height = info->height;
678 surf->info.format = info->format;
679 surf->info.bpp = info->bpp;
680 surf->info.num_planes = info->num_planes;
683 /* get size, stride and offset */
684 for (i = 0; i < info->num_planes; i++) {
685 surf->info.planes[i].offset = info->planes[i].offset;
686 surf->info.planes[i].stride = info->planes[i].stride;
688 if (info->planes[i].size > 0)
689 surf->info.planes[i].size = info->planes[i].size;
691 surf->info.planes[i].size += surf->info.planes[i].stride * info->height;
694 surf->planes_bo_idx[i] = 0;
696 surf->planes_bo_idx[i] = i;
699 if (info->size > 0) {
700 surf->info.size = info->size;
703 for (i = 0; i < info->num_planes; i++)
704 surf->info.size += surf->info.planes[i].size;
707 surf->flags = TBM_BO_DEFAULT;
709 /* create only one bo */
711 for (i = 0; i < num; i++) {
715 surf->bos[i] = tbm_bo_ref(bos[i]);
716 _tbm_bo_set_surface(bos[i], surf);
719 LIST_INITHEAD(&surf->user_data_list);
721 LIST_ADD(&surf->item_link, &mgr->surf_list);
723 _tbm_surface_mutex_unlock();
727 for (i = 0; i < num; i++) {
729 tbm_bo_unref(surf->bos[i]);
737 if (LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
738 LIST_DELINIT(&g_surface_bufmgr->surf_list);
739 _deinit_surface_bufmgr();
742 _tbm_surface_mutex_unlock();
748 tbm_surface_internal_destroy(tbm_surface_h surface)
750 if (!_tbm_surface_is_valid(surface))
753 _tbm_surface_mutex_lock();
757 if (surface->refcnt > 0) {
758 _tbm_surface_mutex_unlock();
762 if (surface->refcnt == 0)
763 _tbm_surface_internal_destroy(surface);
765 _tbm_surface_mutex_unlock();
769 tbm_surface_internal_ref(tbm_surface_h surface)
771 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
773 _tbm_surface_mutex_lock();
777 _tbm_surface_mutex_unlock();
781 tbm_surface_internal_unref(tbm_surface_h surface)
783 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
785 _tbm_surface_mutex_lock();
789 if (surface->refcnt > 0) {
790 _tbm_surface_mutex_unlock();
794 if (surface->refcnt == 0)
795 _tbm_surface_internal_destroy(surface);
797 _tbm_surface_mutex_unlock();
801 tbm_surface_internal_get_num_bos(tbm_surface_h surface)
803 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
805 struct _tbm_surface *surf;
808 _tbm_surface_mutex_lock();
810 surf = (struct _tbm_surface *)surface;
813 _tbm_surface_mutex_unlock();
819 tbm_surface_internal_get_bo(tbm_surface_h surface, int bo_idx)
821 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), NULL);
822 TBM_RETURN_VAL_IF_FAIL(bo_idx > -1, NULL);
824 struct _tbm_surface *surf;
827 _tbm_surface_mutex_lock();
829 surf = (struct _tbm_surface *)surface;
830 bo = surf->bos[bo_idx];
832 _tbm_surface_mutex_unlock();
838 tbm_surface_internal_get_size(tbm_surface_h surface)
840 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
842 struct _tbm_surface *surf;
845 _tbm_surface_mutex_lock();
847 surf = (struct _tbm_surface *)surface;
848 size = surf->info.size;
850 _tbm_surface_mutex_unlock();
856 tbm_surface_internal_get_plane_data(tbm_surface_h surface, int plane_idx,
857 uint32_t *size, uint32_t *offset, uint32_t *pitch)
859 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
860 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
862 struct _tbm_surface *surf;
864 _tbm_surface_mutex_lock();
866 surf = (struct _tbm_surface *)surface;
868 if (plane_idx >= surf->info.num_planes) {
869 _tbm_surface_mutex_unlock();
874 *size = surf->info.planes[plane_idx].size;
877 *offset = surf->info.planes[plane_idx].offset;
880 *pitch = surf->info.planes[plane_idx].stride;
882 _tbm_surface_mutex_unlock();
888 tbm_surface_internal_get_info(tbm_surface_h surface, int opt,
889 tbm_surface_info_s *info, int map)
891 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
893 struct _tbm_surface *surf;
894 tbm_bo_handle bo_handles[4];
897 _tbm_surface_mutex_lock();
899 memset(bo_handles, 0, sizeof(tbm_bo_handle) * 4);
901 surf = (struct _tbm_surface *)surface;
903 memset(info, 0x00, sizeof(tbm_surface_info_s));
904 info->width = surf->info.width;
905 info->height = surf->info.height;
906 info->format = surf->info.format;
907 info->bpp = surf->info.bpp;
908 info->size = surf->info.size;
909 info->num_planes = surf->info.num_planes;
912 for (i = 0; i < surf->num_bos; i++) {
913 bo_handles[i] = tbm_bo_map(surf->bos[i], TBM_DEVICE_CPU, opt);
914 if (bo_handles[i].ptr == NULL) {
915 for (j = 0; j < i; j++)
916 tbm_bo_unmap(surf->bos[j]);
918 _tbm_surface_mutex_unlock();
923 for (i = 0; i < surf->num_bos; i++)
924 bo_handles[i] = tbm_bo_get_handle(surf->bos[i], TBM_DEVICE_CPU);
927 for (i = 0; i < surf->info.num_planes; i++) {
928 info->planes[i].size = surf->info.planes[i].size;
929 info->planes[i].offset = surf->info.planes[i].offset;
930 info->planes[i].stride = surf->info.planes[i].stride;
932 if (bo_handles[surf->planes_bo_idx[i]].ptr)
933 info->planes[i].ptr = bo_handles[surf->planes_bo_idx[i]].ptr +
934 surf->info.planes[i].offset;
937 _tbm_surface_mutex_unlock();
943 tbm_surface_internal_unmap(tbm_surface_h surface)
945 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
947 struct _tbm_surface *surf;
950 _tbm_surface_mutex_lock();
952 surf = (struct _tbm_surface *)surface;
954 for (i = 0; i < surf->num_bos; i++)
955 tbm_bo_unmap(surf->bos[i]);
957 _tbm_surface_mutex_unlock();
961 tbm_surface_internal_get_width(tbm_surface_h surface)
963 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
965 struct _tbm_surface *surf;
968 _tbm_surface_mutex_lock();
970 surf = (struct _tbm_surface *)surface;
971 width = surf->info.width;
973 _tbm_surface_mutex_unlock();
979 tbm_surface_internal_get_height(tbm_surface_h surface)
981 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
983 struct _tbm_surface *surf;
986 _tbm_surface_mutex_lock();
988 surf = (struct _tbm_surface *)surface;
989 height = surf->info.height;
991 _tbm_surface_mutex_unlock();
998 tbm_surface_internal_get_format(tbm_surface_h surface)
1000 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1002 struct _tbm_surface *surf;
1005 _tbm_surface_mutex_lock();
1007 surf = (struct _tbm_surface *)surface;
1008 format = surf->info.format;
1010 _tbm_surface_mutex_unlock();
1016 tbm_surface_internal_get_plane_bo_idx(tbm_surface_h surface, int plane_idx)
1018 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1019 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
1020 struct _tbm_surface *surf;
1023 _tbm_surface_mutex_lock();
1025 surf = (struct _tbm_surface *)surface;
1026 bo_idx = surf->planes_bo_idx[plane_idx];
1028 _tbm_surface_mutex_unlock();
1034 _tbm_surface_internal_get_debug_pid(tbm_surface_h surface)
1036 TBM_RETURN_VAL_IF_FAIL(surface, 0);
1038 return surface->debug_pid;
1042 tbm_surface_internal_set_debug_pid(tbm_surface_h surface, unsigned int pid)
1044 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
1046 surface->debug_pid = pid;
1050 tbm_surface_internal_add_user_data(tbm_surface_h surface, unsigned long key,
1051 tbm_data_free data_free_func)
1053 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1055 tbm_user_data *data;
1057 /* check if the data according to the key exist if so, return false. */
1058 data = user_data_lookup(&surface->user_data_list, key);
1060 TBM_LOG("[libtbm:%d] "
1061 "waring: %s:%d user data already exist. key:%ld\n",
1062 getpid(), __func__, __LINE__, key);
1066 data = user_data_create(key, data_free_func);
1070 LIST_ADD(&data->item_link, &surface->user_data_list);
1076 tbm_surface_internal_set_user_data(tbm_surface_h surface, unsigned long key,
1079 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1081 tbm_user_data *old_data;
1083 if (LIST_IS_EMPTY(&surface->user_data_list))
1086 old_data = user_data_lookup(&surface->user_data_list, key);
1090 if (old_data->data && old_data->free_func)
1091 old_data->free_func(old_data->data);
1093 old_data->data = data;
1099 tbm_surface_internal_get_user_data(tbm_surface_h surface, unsigned long key,
1102 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1104 tbm_user_data *old_data;
1106 if (!data || LIST_IS_EMPTY(&surface->user_data_list))
1109 old_data = user_data_lookup(&surface->user_data_list, key);
1115 *data = old_data->data;
1121 tbm_surface_internal_delete_user_data(tbm_surface_h surface,
1124 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1126 tbm_user_data *old_data = (void *)0;
1128 if (LIST_IS_EMPTY(&surface->user_data_list))
1131 old_data = user_data_lookup(&surface->user_data_list, key);
1135 user_data_delete(old_data);