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 = NULL;
39 static pthread_mutex_t tbm_surface_lock;
41 char *_tbm_surface_internal_format_to_str(tbm_format format)
45 return "TBM_FORMAT_C8";
46 case TBM_FORMAT_RGB332:
47 return "TBM_FORMAT_RGB332";
48 case TBM_FORMAT_BGR233:
49 return "TBM_FORMAT_BGR233";
50 case TBM_FORMAT_XRGB4444:
51 return "TBM_FORMAT_XRGB4444";
52 case TBM_FORMAT_XBGR4444:
53 return "TBM_FORMAT_XBGR4444";
54 case TBM_FORMAT_RGBX4444:
55 return "TBM_FORMAT_RGBX4444";
56 case TBM_FORMAT_BGRX4444:
57 return "TBM_FORMAT_BGRX4444";
58 case TBM_FORMAT_ARGB4444:
59 return "TBM_FORMAT_ARGB4444";
60 case TBM_FORMAT_ABGR4444:
61 return "TBM_FORMAT_ABGR4444";
62 case TBM_FORMAT_RGBA4444:
63 return "TBM_FORMAT_RGBA4444";
64 case TBM_FORMAT_BGRA4444:
65 return "TBM_FORMAT_BGRA4444";
66 case TBM_FORMAT_XRGB1555:
67 return "TBM_FORMAT_XRGB1555";
68 case TBM_FORMAT_XBGR1555:
69 return "TBM_FORMAT_XBGR1555";
70 case TBM_FORMAT_RGBX5551:
71 return "TBM_FORMAT_RGBX5551";
72 case TBM_FORMAT_BGRX5551:
73 return "TBM_FORMAT_BGRX5551";
74 case TBM_FORMAT_ARGB1555:
75 return "TBM_FORMAT_ARGB1555";
76 case TBM_FORMAT_ABGR1555:
77 return "TBM_FORMAT_ABGR1555";
78 case TBM_FORMAT_RGBA5551:
79 return "TBM_FORMAT_RGBA5551";
80 case TBM_FORMAT_BGRA5551:
81 return "TBM_FORMAT_BGRA5551";
82 case TBM_FORMAT_RGB565:
83 return "TBM_FORMAT_RGB565";
84 case TBM_FORMAT_BGR565:
85 return "TBM_FORMAT_BGR565";
86 case TBM_FORMAT_RGB888:
87 return "TBM_FORMAT_RGB888";
88 case TBM_FORMAT_BGR888:
89 return "TBM_FORMAT_BGR888";
90 case TBM_FORMAT_XRGB8888:
91 return "TBM_FORMAT_XRGB8888";
92 case TBM_FORMAT_XBGR8888:
93 return "TBM_FORMAT_XBGR8888";
94 case TBM_FORMAT_RGBX8888:
95 return "TBM_FORMAT_RGBX8888";
96 case TBM_FORMAT_BGRX8888:
97 return "TBM_FORMAT_BGRX8888";
98 case TBM_FORMAT_ARGB8888:
99 return "TBM_FORMAT_ARGB8888";
100 case TBM_FORMAT_ABGR8888:
101 return "TBM_FORMAT_ABGR8888";
102 case TBM_FORMAT_RGBA8888:
103 return "TBM_FORMAT_RGBA8888";
104 case TBM_FORMAT_BGRA8888:
105 return "TBM_FORMAT_BGRA8888";
106 case TBM_FORMAT_XRGB2101010:
107 return "TBM_FORMAT_XRGB2101010";
108 case TBM_FORMAT_XBGR2101010:
109 return "TBM_FORMAT_XBGR2101010";
110 case TBM_FORMAT_RGBX1010102:
111 return "TBM_FORMAT_RGBX1010102";
112 case TBM_FORMAT_BGRX1010102:
113 return "TBM_FORMAT_BGRX1010102";
114 case TBM_FORMAT_ARGB2101010:
115 return "TBM_FORMAT_ARGB2101010";
116 case TBM_FORMAT_ABGR2101010:
117 return "TBM_FORMAT_ABGR2101010";
118 case TBM_FORMAT_RGBA1010102:
119 return "TBM_FORMAT_RGBA1010102";
120 case TBM_FORMAT_BGRA1010102:
121 return "TBM_FORMAT_BGRA1010102";
122 case TBM_FORMAT_YUYV:
123 return "TBM_FORMAT_YUYV";
124 case TBM_FORMAT_YVYU:
125 return "TBM_FORMAT_YVYU";
126 case TBM_FORMAT_UYVY:
127 return "TBM_FORMAT_UYVY";
128 case TBM_FORMAT_VYUY:
129 return "TBM_FORMAT_VYUY";
130 case TBM_FORMAT_AYUV:
131 return "TBM_FORMAT_AYUV";
132 case TBM_FORMAT_NV12:
133 return "TBM_FORMAT_NV12";
134 case TBM_FORMAT_NV21:
135 return "TBM_FORMAT_NV21";
136 case TBM_FORMAT_NV16:
137 return "TBM_FORMAT_NV16";
138 case TBM_FORMAT_NV61:
139 return "TBM_FORMAT_NV61";
140 case TBM_FORMAT_YUV410:
141 return "TBM_FORMAT_YUV410";
142 case TBM_FORMAT_YVU410:
143 return "TBM_FORMAT_YVU410";
144 case TBM_FORMAT_YUV411:
145 return "TBM_FORMAT_YUV411";
146 case TBM_FORMAT_YVU411:
147 return "TBM_FORMAT_YVU411";
148 case TBM_FORMAT_YUV420:
149 return "TBM_FORMAT_YUV420";
150 case TBM_FORMAT_YVU420:
151 return "TBM_FORMAT_YVU420";
152 case TBM_FORMAT_YUV422:
153 return "TBM_FORMAT_YUV422";
154 case TBM_FORMAT_YVU422:
155 return "TBM_FORMAT_YVU422";
156 case TBM_FORMAT_YUV444:
157 return "TBM_FORMAT_YUV444";
158 case TBM_FORMAT_YVU444:
159 return "TBM_FORMAT_YVU444";
160 case TBM_FORMAT_NV12MT:
161 return "TBM_FORMAT_NV12MT";
167 static bool _tbm_surface_mutex_init(void)
169 static bool tbm_surface_mutex_init = false;
171 if (tbm_surface_mutex_init)
174 if (pthread_mutex_init(&tbm_surface_lock, NULL)) {
175 TBM_LOG("[libtbm] fail: tbm_surface mutex init\n");
179 tbm_surface_mutex_init = true;
184 void _tbm_surface_mutex_lock(void)
186 if (!_tbm_surface_mutex_init())
189 pthread_mutex_lock(&tbm_surface_lock);
192 void _tbm_surface_mutex_unlock(void)
194 pthread_mutex_unlock(&tbm_surface_lock);
197 static void _init_surface_bufmgr()
199 g_surface_bufmgr = tbm_bufmgr_init(-1);
202 static void _deinit_surface_bufmgr()
204 if (!g_surface_bufmgr)
207 tbm_bufmgr_deinit(g_surface_bufmgr);
208 g_surface_bufmgr = NULL;
211 static int _tbm_surface_internal_query_plane_data(tbm_surface_h surface, int plane_idx, uint32_t * size, uint32_t * offset, uint32_t * pitch, int *bo_idx)
213 TBM_RETURN_VAL_IF_FAIL(surface, 0);
214 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
216 struct _tbm_surface *surf = (struct _tbm_surface *)surface;
217 struct _tbm_bufmgr *mgr = surf->bufmgr;
220 TBM_RETURN_VAL_IF_FAIL(mgr != NULL, 0);
221 TBM_RETURN_VAL_IF_FAIL(surf->info.width > 0, 0);
222 TBM_RETURN_VAL_IF_FAIL(surf->info.height > 0, 0);
223 TBM_RETURN_VAL_IF_FAIL(surf->info.format > 0, 0);
225 if (!mgr->backend->surface_get_plane_data)
228 ret = mgr->backend->surface_get_plane_data(surf, surf->info.width, surf->info.height, surf->info.format, plane_idx, size, offset, pitch, bo_idx);
235 static int _tbm_surface_internal_query_num_bos(tbm_format format)
237 TBM_RETURN_VAL_IF_FAIL(format > 0, 0);
238 struct _tbm_bufmgr *mgr;
241 mgr = g_surface_bufmgr;
243 if (!mgr->backend->surface_get_num_bos)
246 ret = mgr->backend->surface_get_num_bos(format);
253 static void _tbm_surface_internal_destroy(tbm_surface_h surface)
256 tbm_bufmgr bufmgr = surface->bufmgr;
257 tbm_user_data *old_data = NULL, *tmp = NULL;
259 for (i = 0; i < surface->num_bos; i++) {
260 surface->bos[i]->surface = NULL;
262 tbm_bo_unref(surface->bos[i]);
263 surface->bos[i] = NULL;
266 /* destory the user_data_list */
267 if (!LIST_IS_EMPTY(&surface->user_data_list)) {
268 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp, &surface->user_data_list, item_link) {
269 TBM_LOG("[tbm_surface:%d] free user_data \n",
271 user_data_delete(old_data);
275 LIST_DEL(&surface->item_link);
280 if (LIST_IS_EMPTY(&bufmgr->surf_list)) {
281 LIST_DELINIT(&bufmgr->surf_list);
282 _deinit_surface_bufmgr();
286 int tbm_surface_internal_query_supported_formats(uint32_t ** formats, uint32_t * num)
288 struct _tbm_bufmgr *mgr;
291 _tbm_surface_mutex_lock();
293 if (!g_surface_bufmgr) {
294 _init_surface_bufmgr();
295 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
298 mgr = g_surface_bufmgr;
300 if (!mgr->backend->surface_supported_format) {
301 _tbm_surface_mutex_unlock();
305 ret = mgr->backend->surface_supported_format(formats, num);
307 _tbm_surface_mutex_unlock();
312 int tbm_surface_internal_get_num_planes(tbm_format format)
318 case TBM_FORMAT_RGB332:
319 case TBM_FORMAT_BGR233:
320 case TBM_FORMAT_XRGB4444:
321 case TBM_FORMAT_XBGR4444:
322 case TBM_FORMAT_RGBX4444:
323 case TBM_FORMAT_BGRX4444:
324 case TBM_FORMAT_ARGB4444:
325 case TBM_FORMAT_ABGR4444:
326 case TBM_FORMAT_RGBA4444:
327 case TBM_FORMAT_BGRA4444:
328 case TBM_FORMAT_XRGB1555:
329 case TBM_FORMAT_XBGR1555:
330 case TBM_FORMAT_RGBX5551:
331 case TBM_FORMAT_BGRX5551:
332 case TBM_FORMAT_ARGB1555:
333 case TBM_FORMAT_ABGR1555:
334 case TBM_FORMAT_RGBA5551:
335 case TBM_FORMAT_BGRA5551:
336 case TBM_FORMAT_RGB565:
337 case TBM_FORMAT_BGR565:
338 case TBM_FORMAT_RGB888:
339 case TBM_FORMAT_BGR888:
340 case TBM_FORMAT_XRGB8888:
341 case TBM_FORMAT_XBGR8888:
342 case TBM_FORMAT_RGBX8888:
343 case TBM_FORMAT_BGRX8888:
344 case TBM_FORMAT_ARGB8888:
345 case TBM_FORMAT_ABGR8888:
346 case TBM_FORMAT_RGBA8888:
347 case TBM_FORMAT_BGRA8888:
348 case TBM_FORMAT_XRGB2101010:
349 case TBM_FORMAT_XBGR2101010:
350 case TBM_FORMAT_RGBX1010102:
351 case TBM_FORMAT_BGRX1010102:
352 case TBM_FORMAT_ARGB2101010:
353 case TBM_FORMAT_ABGR2101010:
354 case TBM_FORMAT_RGBA1010102:
355 case TBM_FORMAT_BGRA1010102:
356 case TBM_FORMAT_YUYV:
357 case TBM_FORMAT_YVYU:
358 case TBM_FORMAT_UYVY:
359 case TBM_FORMAT_VYUY:
360 case TBM_FORMAT_AYUV:
363 case TBM_FORMAT_NV12:
364 case TBM_FORMAT_NV21:
365 case TBM_FORMAT_NV16:
366 case TBM_FORMAT_NV61:
369 case TBM_FORMAT_YUV410:
370 case TBM_FORMAT_YVU410:
371 case TBM_FORMAT_YUV411:
372 case TBM_FORMAT_YVU411:
373 case TBM_FORMAT_YUV420:
374 case TBM_FORMAT_YVU420:
375 case TBM_FORMAT_YUV422:
376 case TBM_FORMAT_YVU422:
377 case TBM_FORMAT_YUV444:
378 case TBM_FORMAT_YVU444:
389 int tbm_surface_internal_get_bpp(tbm_format format)
395 case TBM_FORMAT_RGB332:
396 case TBM_FORMAT_BGR233:
399 case TBM_FORMAT_XRGB4444:
400 case TBM_FORMAT_XBGR4444:
401 case TBM_FORMAT_RGBX4444:
402 case TBM_FORMAT_BGRX4444:
403 case TBM_FORMAT_ARGB4444:
404 case TBM_FORMAT_ABGR4444:
405 case TBM_FORMAT_RGBA4444:
406 case TBM_FORMAT_BGRA4444:
407 case TBM_FORMAT_XRGB1555:
408 case TBM_FORMAT_XBGR1555:
409 case TBM_FORMAT_RGBX5551:
410 case TBM_FORMAT_BGRX5551:
411 case TBM_FORMAT_ARGB1555:
412 case TBM_FORMAT_ABGR1555:
413 case TBM_FORMAT_RGBA5551:
414 case TBM_FORMAT_BGRA5551:
415 case TBM_FORMAT_RGB565:
416 case TBM_FORMAT_BGR565:
419 case TBM_FORMAT_RGB888:
420 case TBM_FORMAT_BGR888:
423 case TBM_FORMAT_XRGB8888:
424 case TBM_FORMAT_XBGR8888:
425 case TBM_FORMAT_RGBX8888:
426 case TBM_FORMAT_BGRX8888:
427 case TBM_FORMAT_ARGB8888:
428 case TBM_FORMAT_ABGR8888:
429 case TBM_FORMAT_RGBA8888:
430 case TBM_FORMAT_BGRA8888:
431 case TBM_FORMAT_XRGB2101010:
432 case TBM_FORMAT_XBGR2101010:
433 case TBM_FORMAT_RGBX1010102:
434 case TBM_FORMAT_BGRX1010102:
435 case TBM_FORMAT_ARGB2101010:
436 case TBM_FORMAT_ABGR2101010:
437 case TBM_FORMAT_RGBA1010102:
438 case TBM_FORMAT_BGRA1010102:
439 case TBM_FORMAT_YUYV:
440 case TBM_FORMAT_YVYU:
441 case TBM_FORMAT_UYVY:
442 case TBM_FORMAT_VYUY:
443 case TBM_FORMAT_AYUV:
446 case TBM_FORMAT_NV12:
447 case TBM_FORMAT_NV21:
450 case TBM_FORMAT_NV16:
451 case TBM_FORMAT_NV61:
454 case TBM_FORMAT_YUV410:
455 case TBM_FORMAT_YVU410:
458 case TBM_FORMAT_YUV411:
459 case TBM_FORMAT_YVU411:
460 case TBM_FORMAT_YUV420:
461 case TBM_FORMAT_YVU420:
464 case TBM_FORMAT_YUV422:
465 case TBM_FORMAT_YVU422:
468 case TBM_FORMAT_YUV444:
469 case TBM_FORMAT_YVU444:
479 tbm_surface_h tbm_surface_internal_create_with_flags(int width, int height, int format, int flags)
481 TBM_RETURN_VAL_IF_FAIL(width > 0, NULL);
482 TBM_RETURN_VAL_IF_FAIL(height > 0, NULL);
484 struct _tbm_bufmgr *mgr;
485 struct _tbm_surface *surf = NULL;
489 uint32_t bo_size = 0;
493 _tbm_surface_mutex_lock();
495 if (!g_surface_bufmgr) {
496 _init_surface_bufmgr();
497 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
500 mgr = g_surface_bufmgr;
501 if (!TBM_BUFMGR_IS_VALID(mgr)) {
502 _tbm_surface_mutex_unlock();
505 surf = calloc(1, sizeof(struct _tbm_surface));
507 _tbm_surface_mutex_unlock();
512 surf->info.width = width;
513 surf->info.height = height;
514 surf->info.format = format;
515 surf->info.bpp = tbm_surface_internal_get_bpp(format);
516 surf->info.num_planes = tbm_surface_internal_get_num_planes(format);
517 surf->num_bos = _tbm_surface_internal_query_num_bos(format);
520 /* get size, stride and offset bo_idx */
521 for (i = 0; i < surf->info.num_planes; i++) {
522 _tbm_surface_internal_query_plane_data(surf, i, &size, &offset, &stride, &bo_idx);
523 surf->info.planes[i].size = size;
524 surf->info.planes[i].offset = offset;
525 surf->info.planes[i].stride = stride;
526 surf->planes_bo_idx[i] = bo_idx;
529 for (i = 0; i < surf->info.num_planes; i++)
530 surf->info.size += surf->info.planes[i].size;
534 for (i = 0; i < surf->num_bos; i++) {
536 for (j = 0; j < surf->info.num_planes; j++) {
537 if (surf->planes_bo_idx[j] == i)
538 bo_size += surf->info.planes[j].size;
540 surf->bos[i] = tbm_bo_alloc(mgr, bo_size, flags);
542 for (j = 0; j < i; j++) {
544 tbm_bo_unref(surf->bos[j]);
550 if (LIST_IS_EMPTY(&mgr->surf_list)) {
551 LIST_DELINIT(&mgr->surf_list);
552 _deinit_surface_bufmgr();
555 _tbm_surface_mutex_unlock();
558 _tbm_bo_set_surface(surf->bos[i], surf);
562 LIST_INITHEAD(&surf->user_data_list);
564 LIST_ADD(&surf->item_link, &mgr->surf_list);
566 _tbm_surface_mutex_unlock();
571 tbm_surface_h tbm_surface_internal_create_with_bos(tbm_surface_info_s * info, tbm_bo * bos, int num)
573 TBM_RETURN_VAL_IF_FAIL(bos, NULL);
574 TBM_RETURN_VAL_IF_FAIL(info, NULL);
575 TBM_RETURN_VAL_IF_FAIL(num == 1 || info->num_planes == num, NULL);
577 struct _tbm_bufmgr *mgr;
578 struct _tbm_surface *surf = NULL;
581 _tbm_surface_mutex_lock();
583 if (!g_surface_bufmgr) {
584 _init_surface_bufmgr();
585 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
588 mgr = g_surface_bufmgr;
589 if (!TBM_BUFMGR_IS_VALID(mgr)) {
590 _tbm_surface_mutex_unlock();
594 surf = calloc(1, sizeof(struct _tbm_surface));
596 _tbm_surface_mutex_unlock();
601 surf->info.width = info->width;
602 surf->info.height = info->height;
603 surf->info.format = info->format;
604 surf->info.bpp = info->bpp;
605 surf->info.num_planes = info->num_planes;
608 /* get size, stride and offset */
609 for (i = 0; i < info->num_planes; i++) {
610 surf->info.planes[i].offset = info->planes[i].offset;
611 surf->info.planes[i].stride = info->planes[i].stride;
613 if (info->planes[i].size > 0)
614 surf->info.planes[i].size = info->planes[i].size;
616 surf->info.planes[i].size += surf->info.planes[i].stride * info->height;
619 surf->planes_bo_idx[i] = 0;
621 surf->planes_bo_idx[i] = i;
624 if (info->size > 0) {
625 surf->info.size = info->size;
628 for (i = 0; i < info->num_planes; i++)
629 surf->info.size += surf->info.planes[i].size;
632 surf->flags = TBM_BO_DEFAULT;
634 /* create only one bo */
636 for (i = 0; i < num; i++) {
640 surf->bos[i] = tbm_bo_ref(bos[i]);
641 _tbm_bo_set_surface(bos[i], surf);
644 LIST_INITHEAD(&surf->user_data_list);
646 LIST_ADD(&surf->item_link, &mgr->surf_list);
648 _tbm_surface_mutex_unlock();
652 for (i = 0; i < num; i++) {
654 tbm_bo_unref(surf->bos[i]);
662 if (LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
663 LIST_DELINIT(&g_surface_bufmgr->surf_list);
664 _deinit_surface_bufmgr();
667 _tbm_surface_mutex_unlock();
672 void tbm_surface_internal_destroy(tbm_surface_h surface)
677 _tbm_surface_mutex_lock();
681 if (surface->refcnt > 0) {
682 _tbm_surface_mutex_unlock();
686 if (surface->refcnt == 0)
687 _tbm_surface_internal_destroy(surface);
689 _tbm_surface_mutex_unlock();
692 void tbm_surface_internal_ref(tbm_surface_h surface)
694 TBM_RETURN_IF_FAIL(surface);
696 _tbm_surface_mutex_lock();
700 _tbm_surface_mutex_unlock();
703 void tbm_surface_internal_unref(tbm_surface_h surface)
705 TBM_RETURN_IF_FAIL(surface);
707 _tbm_surface_mutex_lock();
711 if (surface->refcnt > 0) {
712 _tbm_surface_mutex_unlock();
716 if (surface->refcnt == 0)
717 _tbm_surface_internal_destroy(surface);
719 _tbm_surface_mutex_unlock();
722 int tbm_surface_internal_get_num_bos(tbm_surface_h surface)
724 TBM_RETURN_VAL_IF_FAIL(surface, 0);
726 struct _tbm_surface *surf;
729 _tbm_surface_mutex_lock();
731 surf = (struct _tbm_surface *)surface;
734 _tbm_surface_mutex_unlock();
739 tbm_bo tbm_surface_internal_get_bo(tbm_surface_h surface, int bo_idx)
741 TBM_RETURN_VAL_IF_FAIL(surface, NULL);
742 TBM_RETURN_VAL_IF_FAIL(bo_idx > -1, NULL);
744 struct _tbm_surface *surf;
747 _tbm_surface_mutex_lock();
749 surf = (struct _tbm_surface *)surface;
750 bo = surf->bos[bo_idx];
752 _tbm_surface_mutex_unlock();
757 int tbm_surface_internal_get_size(tbm_surface_h surface)
759 TBM_RETURN_VAL_IF_FAIL(surface, 0);
761 struct _tbm_surface *surf;
764 _tbm_surface_mutex_lock();
766 surf = (struct _tbm_surface *)surface;
767 size = surf->info.size;
769 _tbm_surface_mutex_unlock();
774 int tbm_surface_internal_get_plane_data(tbm_surface_h surface, int plane_idx, uint32_t * size, uint32_t * offset, uint32_t * pitch)
776 TBM_RETURN_VAL_IF_FAIL(surface, 0);
777 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
779 struct _tbm_surface *surf;
781 _tbm_surface_mutex_lock();
783 surf = (struct _tbm_surface *)surface;
785 if (plane_idx >= surf->info.num_planes) {
786 _tbm_surface_mutex_unlock();
791 *size = surf->info.planes[plane_idx].size;
794 *offset = surf->info.planes[plane_idx].offset;
797 *pitch = surf->info.planes[plane_idx].stride;
799 _tbm_surface_mutex_unlock();
804 int tbm_surface_internal_get_info(tbm_surface_h surface, int opt, tbm_surface_info_s * info, int map)
806 struct _tbm_surface *surf;
807 tbm_bo_handle bo_handles[4];
810 _tbm_surface_mutex_lock();
812 memset(bo_handles, 0, sizeof(tbm_bo_handle) * 4);
814 surf = (struct _tbm_surface *)surface;
816 memset(info, 0x00, sizeof (tbm_surface_info_s));
817 info->width = surf->info.width;
818 info->height = surf->info.height;
819 info->format = surf->info.format;
820 info->bpp = surf->info.bpp;
821 info->size = surf->info.size;
822 info->num_planes = surf->info.num_planes;
825 for (i = 0; i < surf->num_bos; i++) {
826 bo_handles[i] = tbm_bo_map(surf->bos[i], TBM_DEVICE_CPU, opt);
827 if (bo_handles[i].ptr == NULL) {
828 for (j = 0; j < i; j++)
829 tbm_bo_unmap(surf->bos[j]);
831 _tbm_surface_mutex_unlock();
836 for (i = 0; i < surf->num_bos; i++) {
837 bo_handles[i] = tbm_bo_get_handle(surf->bos[i], TBM_DEVICE_CPU);
841 for (i = 0; i < surf->info.num_planes; i++) {
842 info->planes[i].size = surf->info.planes[i].size;
843 info->planes[i].offset = surf->info.planes[i].offset;
844 info->planes[i].stride = surf->info.planes[i].stride;
846 if (bo_handles[surf->planes_bo_idx[i]].ptr)
847 info->planes[i].ptr = bo_handles[surf->planes_bo_idx[i]].ptr + surf->info.planes[i].offset;
850 _tbm_surface_mutex_unlock();
855 void tbm_surface_internal_unmap(tbm_surface_h surface)
857 struct _tbm_surface *surf;
860 _tbm_surface_mutex_lock();
862 surf = (struct _tbm_surface *)surface;
864 for (i = 0; i < surf->num_bos; i++)
865 tbm_bo_unmap(surf->bos[i]);
867 _tbm_surface_mutex_unlock();
870 unsigned int tbm_surface_internal_get_width(tbm_surface_h surface)
872 struct _tbm_surface *surf;
875 _tbm_surface_mutex_lock();
877 surf = (struct _tbm_surface *)surface;
878 width = surf->info.width;
880 _tbm_surface_mutex_unlock();
885 unsigned int tbm_surface_internal_get_height(tbm_surface_h surface)
887 struct _tbm_surface *surf;
890 _tbm_surface_mutex_lock();
892 surf = (struct _tbm_surface *)surface;
893 height = surf->info.height;
895 _tbm_surface_mutex_unlock();
901 tbm_format tbm_surface_internal_get_format(tbm_surface_h surface)
903 struct _tbm_surface *surf;
906 _tbm_surface_mutex_lock();
908 surf = (struct _tbm_surface *)surface;
909 format = surf->info.format;
911 _tbm_surface_mutex_unlock();
916 int tbm_surface_internal_get_plane_bo_idx(tbm_surface_h surface, int plane_idx)
918 TBM_RETURN_VAL_IF_FAIL(surface, 0);
919 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
920 struct _tbm_surface *surf;
923 _tbm_surface_mutex_lock();
925 surf = (struct _tbm_surface *)surface;
926 bo_idx = surf->planes_bo_idx[plane_idx];
928 _tbm_surface_mutex_unlock();
933 unsigned int _tbm_surface_internal_get_debug_pid(tbm_surface_h surface)
935 TBM_RETURN_VAL_IF_FAIL(surface, 0);
937 return surface->debug_pid;
940 void tbm_surface_internal_set_debug_pid(tbm_surface_h surface, unsigned int pid)
942 TBM_RETURN_IF_FAIL(surface);
944 surface->debug_pid = pid;
947 int tbm_surface_internal_add_user_data(tbm_surface_h surface, unsigned long key, tbm_data_free data_free_func)
949 TBM_RETURN_VAL_IF_FAIL(surface, 0);
953 /* check if the data according to the key exist if so, return false. */
954 data = user_data_lookup(&surface->user_data_list, key);
956 TBM_LOG("[libtbm:%d] "
957 "waring: %s:%d user data already exist. key:%ld\n",
958 getpid(), __FUNCTION__, __LINE__, key);
962 data = user_data_create(key, data_free_func);
966 LIST_ADD(&data->item_link, &surface->user_data_list);
971 int tbm_surface_internal_set_user_data(tbm_surface_h surface, unsigned long key, void *data)
973 TBM_RETURN_VAL_IF_FAIL(surface, 0);
975 tbm_user_data *old_data;
977 if (LIST_IS_EMPTY(&surface->user_data_list))
980 old_data = user_data_lookup(&surface->user_data_list, key);
984 if (old_data->data && old_data->free_func)
985 old_data->free_func(old_data->data);
987 old_data->data = data;
992 int tbm_surface_internal_get_user_data(tbm_surface_h surface, unsigned long key, void **data)
994 TBM_RETURN_VAL_IF_FAIL(surface, 0);
996 tbm_user_data *old_data;
998 if (!data || LIST_IS_EMPTY(&surface->user_data_list))
1001 old_data = user_data_lookup(&surface->user_data_list, key);
1007 *data = old_data->data;
1012 int tbm_surface_internal_delete_user_data(tbm_surface_h surface, unsigned long key)
1014 TBM_RETURN_VAL_IF_FAIL(surface, 0);
1016 tbm_user_data *old_data = (void *)0;
1018 if (LIST_IS_EMPTY(&surface->user_data_list))
1021 old_data = user_data_lookup(&surface->user_data_list, key);
1025 user_data_delete(old_data);