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;
563 surf->bos[i] = tbm_bo_alloc(mgr, bo_size, flags);
565 for (j = 0; j < i; j++) {
567 tbm_bo_unref(surf->bos[j]);
573 if (LIST_IS_EMPTY(&mgr->surf_list)) {
574 LIST_DELINIT(&mgr->surf_list);
575 _deinit_surface_bufmgr();
578 _tbm_surface_mutex_unlock();
581 _tbm_bo_set_surface(surf->bos[i], surf);
585 LIST_INITHEAD(&surf->user_data_list);
587 LIST_ADD(&surf->item_link, &mgr->surf_list);
589 _tbm_surface_mutex_unlock();
595 tbm_surface_internal_create_with_bos(tbm_surface_info_s *info,
596 tbm_bo *bos, int num)
598 TBM_RETURN_VAL_IF_FAIL(bos, NULL);
599 TBM_RETURN_VAL_IF_FAIL(info, NULL);
600 TBM_RETURN_VAL_IF_FAIL(num == 1 || info->num_planes == num, NULL);
602 struct _tbm_bufmgr *mgr;
603 struct _tbm_surface *surf = NULL;
606 _tbm_surface_mutex_lock();
608 if (!g_surface_bufmgr) {
609 _init_surface_bufmgr();
610 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
613 mgr = g_surface_bufmgr;
614 if (!TBM_BUFMGR_IS_VALID(mgr)) {
615 _tbm_surface_mutex_unlock();
619 surf = calloc(1, sizeof(struct _tbm_surface));
621 _tbm_surface_mutex_unlock();
626 surf->info.width = info->width;
627 surf->info.height = info->height;
628 surf->info.format = info->format;
629 surf->info.bpp = info->bpp;
630 surf->info.num_planes = info->num_planes;
633 /* get size, stride and offset */
634 for (i = 0; i < info->num_planes; i++) {
635 surf->info.planes[i].offset = info->planes[i].offset;
636 surf->info.planes[i].stride = info->planes[i].stride;
638 if (info->planes[i].size > 0)
639 surf->info.planes[i].size = info->planes[i].size;
641 surf->info.planes[i].size += surf->info.planes[i].stride * info->height;
644 surf->planes_bo_idx[i] = 0;
646 surf->planes_bo_idx[i] = i;
649 if (info->size > 0) {
650 surf->info.size = info->size;
653 for (i = 0; i < info->num_planes; i++)
654 surf->info.size += surf->info.planes[i].size;
657 surf->flags = TBM_BO_DEFAULT;
659 /* create only one bo */
661 for (i = 0; i < num; i++) {
665 surf->bos[i] = tbm_bo_ref(bos[i]);
666 _tbm_bo_set_surface(bos[i], surf);
669 LIST_INITHEAD(&surf->user_data_list);
671 LIST_ADD(&surf->item_link, &mgr->surf_list);
673 _tbm_surface_mutex_unlock();
677 for (i = 0; i < num; i++) {
679 tbm_bo_unref(surf->bos[i]);
687 if (LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
688 LIST_DELINIT(&g_surface_bufmgr->surf_list);
689 _deinit_surface_bufmgr();
692 _tbm_surface_mutex_unlock();
698 tbm_surface_internal_destroy(tbm_surface_h surface)
700 if (!_tbm_surface_is_valid(surface))
703 _tbm_surface_mutex_lock();
707 if (surface->refcnt > 0) {
708 _tbm_surface_mutex_unlock();
712 if (surface->refcnt == 0)
713 _tbm_surface_internal_destroy(surface);
715 _tbm_surface_mutex_unlock();
719 tbm_surface_internal_ref(tbm_surface_h surface)
721 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
723 _tbm_surface_mutex_lock();
727 _tbm_surface_mutex_unlock();
731 tbm_surface_internal_unref(tbm_surface_h surface)
733 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
735 _tbm_surface_mutex_lock();
739 if (surface->refcnt > 0) {
740 _tbm_surface_mutex_unlock();
744 if (surface->refcnt == 0)
745 _tbm_surface_internal_destroy(surface);
747 _tbm_surface_mutex_unlock();
751 tbm_surface_internal_get_num_bos(tbm_surface_h surface)
753 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
755 struct _tbm_surface *surf;
758 _tbm_surface_mutex_lock();
760 surf = (struct _tbm_surface *)surface;
763 _tbm_surface_mutex_unlock();
769 tbm_surface_internal_get_bo(tbm_surface_h surface, int bo_idx)
771 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), NULL);
772 TBM_RETURN_VAL_IF_FAIL(bo_idx > -1, NULL);
774 struct _tbm_surface *surf;
777 _tbm_surface_mutex_lock();
779 surf = (struct _tbm_surface *)surface;
780 bo = surf->bos[bo_idx];
782 _tbm_surface_mutex_unlock();
788 tbm_surface_internal_get_size(tbm_surface_h surface)
790 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
792 struct _tbm_surface *surf;
795 _tbm_surface_mutex_lock();
797 surf = (struct _tbm_surface *)surface;
798 size = surf->info.size;
800 _tbm_surface_mutex_unlock();
806 tbm_surface_internal_get_plane_data(tbm_surface_h surface, int plane_idx,
807 uint32_t *size, uint32_t *offset, uint32_t *pitch)
809 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
810 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
812 struct _tbm_surface *surf;
814 _tbm_surface_mutex_lock();
816 surf = (struct _tbm_surface *)surface;
818 if (plane_idx >= surf->info.num_planes) {
819 _tbm_surface_mutex_unlock();
824 *size = surf->info.planes[plane_idx].size;
827 *offset = surf->info.planes[plane_idx].offset;
830 *pitch = surf->info.planes[plane_idx].stride;
832 _tbm_surface_mutex_unlock();
838 tbm_surface_internal_get_info(tbm_surface_h surface, int opt,
839 tbm_surface_info_s *info, int map)
841 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
843 struct _tbm_surface *surf;
844 tbm_bo_handle bo_handles[4];
847 _tbm_surface_mutex_lock();
849 memset(bo_handles, 0, sizeof(tbm_bo_handle) * 4);
851 surf = (struct _tbm_surface *)surface;
853 memset(info, 0x00, sizeof(tbm_surface_info_s));
854 info->width = surf->info.width;
855 info->height = surf->info.height;
856 info->format = surf->info.format;
857 info->bpp = surf->info.bpp;
858 info->size = surf->info.size;
859 info->num_planes = surf->info.num_planes;
862 for (i = 0; i < surf->num_bos; i++) {
863 bo_handles[i] = tbm_bo_map(surf->bos[i], TBM_DEVICE_CPU, opt);
864 if (bo_handles[i].ptr == NULL) {
865 for (j = 0; j < i; j++)
866 tbm_bo_unmap(surf->bos[j]);
868 _tbm_surface_mutex_unlock();
873 for (i = 0; i < surf->num_bos; i++)
874 bo_handles[i] = tbm_bo_get_handle(surf->bos[i], TBM_DEVICE_CPU);
877 for (i = 0; i < surf->info.num_planes; i++) {
878 info->planes[i].size = surf->info.planes[i].size;
879 info->planes[i].offset = surf->info.planes[i].offset;
880 info->planes[i].stride = surf->info.planes[i].stride;
882 if (bo_handles[surf->planes_bo_idx[i]].ptr)
883 info->planes[i].ptr = bo_handles[surf->planes_bo_idx[i]].ptr +
884 surf->info.planes[i].offset;
887 _tbm_surface_mutex_unlock();
893 tbm_surface_internal_unmap(tbm_surface_h surface)
895 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
897 struct _tbm_surface *surf;
900 _tbm_surface_mutex_lock();
902 surf = (struct _tbm_surface *)surface;
904 for (i = 0; i < surf->num_bos; i++)
905 tbm_bo_unmap(surf->bos[i]);
907 _tbm_surface_mutex_unlock();
911 tbm_surface_internal_get_width(tbm_surface_h surface)
913 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
915 struct _tbm_surface *surf;
918 _tbm_surface_mutex_lock();
920 surf = (struct _tbm_surface *)surface;
921 width = surf->info.width;
923 _tbm_surface_mutex_unlock();
929 tbm_surface_internal_get_height(tbm_surface_h surface)
931 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
933 struct _tbm_surface *surf;
936 _tbm_surface_mutex_lock();
938 surf = (struct _tbm_surface *)surface;
939 height = surf->info.height;
941 _tbm_surface_mutex_unlock();
948 tbm_surface_internal_get_format(tbm_surface_h surface)
950 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
952 struct _tbm_surface *surf;
955 _tbm_surface_mutex_lock();
957 surf = (struct _tbm_surface *)surface;
958 format = surf->info.format;
960 _tbm_surface_mutex_unlock();
966 tbm_surface_internal_get_plane_bo_idx(tbm_surface_h surface, int plane_idx)
968 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
969 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
970 struct _tbm_surface *surf;
973 _tbm_surface_mutex_lock();
975 surf = (struct _tbm_surface *)surface;
976 bo_idx = surf->planes_bo_idx[plane_idx];
978 _tbm_surface_mutex_unlock();
984 _tbm_surface_internal_get_debug_pid(tbm_surface_h surface)
986 TBM_RETURN_VAL_IF_FAIL(surface, 0);
988 return surface->debug_pid;
992 tbm_surface_internal_set_debug_pid(tbm_surface_h surface, unsigned int pid)
994 TBM_RETURN_IF_FAIL(_tbm_surface_is_valid(surface));
996 surface->debug_pid = pid;
1000 tbm_surface_internal_add_user_data(tbm_surface_h surface, unsigned long key,
1001 tbm_data_free data_free_func)
1003 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1005 tbm_user_data *data;
1007 /* check if the data according to the key exist if so, return false. */
1008 data = user_data_lookup(&surface->user_data_list, key);
1010 TBM_LOG("[libtbm:%d] "
1011 "waring: %s:%d user data already exist. key:%ld\n",
1012 getpid(), __func__, __LINE__, key);
1016 data = user_data_create(key, data_free_func);
1020 LIST_ADD(&data->item_link, &surface->user_data_list);
1026 tbm_surface_internal_set_user_data(tbm_surface_h surface, unsigned long key,
1029 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1031 tbm_user_data *old_data;
1033 if (LIST_IS_EMPTY(&surface->user_data_list))
1036 old_data = user_data_lookup(&surface->user_data_list, key);
1040 if (old_data->data && old_data->free_func)
1041 old_data->free_func(old_data->data);
1043 old_data->data = data;
1049 tbm_surface_internal_get_user_data(tbm_surface_h surface, unsigned long key,
1052 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1054 tbm_user_data *old_data;
1056 if (!data || LIST_IS_EMPTY(&surface->user_data_list))
1059 old_data = user_data_lookup(&surface->user_data_list, key);
1065 *data = old_data->data;
1071 tbm_surface_internal_delete_user_data(tbm_surface_h surface,
1074 TBM_RETURN_VAL_IF_FAIL(_tbm_surface_is_valid(surface), 0);
1076 tbm_user_data *old_data = (void *)0;
1078 if (LIST_IS_EMPTY(&surface->user_data_list))
1081 old_data = user_data_lookup(&surface->user_data_list, key);
1085 user_data_delete(old_data);