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_size(tbm_surface_h surface)
213 TBM_RETURN_VAL_IF_FAIL(surface, 0);
215 struct _tbm_surface *surf = (struct _tbm_surface *)surface;
216 struct _tbm_bufmgr *mgr = surf->bufmgr;
219 TBM_RETURN_VAL_IF_FAIL(mgr != NULL, 0);
220 TBM_RETURN_VAL_IF_FAIL(surf->info.width > 0, 0);
221 TBM_RETURN_VAL_IF_FAIL(surf->info.height > 0, 0);
222 TBM_RETURN_VAL_IF_FAIL(surf->info.format > 0, 0);
224 if (!mgr->backend->surface_get_size)
227 size = mgr->backend->surface_get_size(surf, surf->info.width, surf->info.height, surf->info.format);
232 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)
234 TBM_RETURN_VAL_IF_FAIL(surface, 0);
235 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
237 struct _tbm_surface *surf = (struct _tbm_surface *)surface;
238 struct _tbm_bufmgr *mgr = surf->bufmgr;
241 TBM_RETURN_VAL_IF_FAIL(mgr != NULL, 0);
242 TBM_RETURN_VAL_IF_FAIL(surf->info.width > 0, 0);
243 TBM_RETURN_VAL_IF_FAIL(surf->info.height > 0, 0);
244 TBM_RETURN_VAL_IF_FAIL(surf->info.format > 0, 0);
246 if (!mgr->backend->surface_get_plane_data)
249 ret = mgr->backend->surface_get_plane_data(surf, surf->info.width, surf->info.height, surf->info.format, plane_idx, size, offset, pitch, bo_idx);
256 static int _tbm_surface_internal_query_num_bos(tbm_format format)
258 TBM_RETURN_VAL_IF_FAIL(format > 0, 0);
259 struct _tbm_bufmgr *mgr;
262 mgr = g_surface_bufmgr;
264 if (!mgr->backend->surface_get_num_bos)
267 ret = mgr->backend->surface_get_num_bos(format);
274 static void _tbm_surface_internal_destroy(tbm_surface_h surface)
277 tbm_bufmgr bufmgr = surface->bufmgr;
279 for (i = 0; i < surface->num_bos; i++) {
280 surface->bos[i]->surface = NULL;
282 tbm_bo_unref(surface->bos[i]);
283 surface->bos[i] = NULL;
289 if (LIST_IS_EMPTY(&bufmgr->surf_list)) {
290 LIST_DELINIT(&bufmgr->surf_list);
291 _deinit_surface_bufmgr();
295 int tbm_surface_internal_query_supported_formats(uint32_t ** formats, uint32_t * num)
297 struct _tbm_bufmgr *mgr;
300 _tbm_surface_mutex_lock();
302 if (!g_surface_bufmgr) {
303 _init_surface_bufmgr();
304 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
307 mgr = g_surface_bufmgr;
309 if (!mgr->backend->surface_supported_format) {
310 _tbm_surface_mutex_unlock();
314 ret = mgr->backend->surface_supported_format(formats, num);
316 _tbm_surface_mutex_unlock();
321 int tbm_surface_internal_get_num_planes(tbm_format format)
327 case TBM_FORMAT_RGB332:
328 case TBM_FORMAT_BGR233:
329 case TBM_FORMAT_XRGB4444:
330 case TBM_FORMAT_XBGR4444:
331 case TBM_FORMAT_RGBX4444:
332 case TBM_FORMAT_BGRX4444:
333 case TBM_FORMAT_ARGB4444:
334 case TBM_FORMAT_ABGR4444:
335 case TBM_FORMAT_RGBA4444:
336 case TBM_FORMAT_BGRA4444:
337 case TBM_FORMAT_XRGB1555:
338 case TBM_FORMAT_XBGR1555:
339 case TBM_FORMAT_RGBX5551:
340 case TBM_FORMAT_BGRX5551:
341 case TBM_FORMAT_ARGB1555:
342 case TBM_FORMAT_ABGR1555:
343 case TBM_FORMAT_RGBA5551:
344 case TBM_FORMAT_BGRA5551:
345 case TBM_FORMAT_RGB565:
346 case TBM_FORMAT_BGR565:
347 case TBM_FORMAT_RGB888:
348 case TBM_FORMAT_BGR888:
349 case TBM_FORMAT_XRGB8888:
350 case TBM_FORMAT_XBGR8888:
351 case TBM_FORMAT_RGBX8888:
352 case TBM_FORMAT_BGRX8888:
353 case TBM_FORMAT_ARGB8888:
354 case TBM_FORMAT_ABGR8888:
355 case TBM_FORMAT_RGBA8888:
356 case TBM_FORMAT_BGRA8888:
357 case TBM_FORMAT_XRGB2101010:
358 case TBM_FORMAT_XBGR2101010:
359 case TBM_FORMAT_RGBX1010102:
360 case TBM_FORMAT_BGRX1010102:
361 case TBM_FORMAT_ARGB2101010:
362 case TBM_FORMAT_ABGR2101010:
363 case TBM_FORMAT_RGBA1010102:
364 case TBM_FORMAT_BGRA1010102:
365 case TBM_FORMAT_YUYV:
366 case TBM_FORMAT_YVYU:
367 case TBM_FORMAT_UYVY:
368 case TBM_FORMAT_VYUY:
369 case TBM_FORMAT_AYUV:
372 case TBM_FORMAT_NV12:
373 case TBM_FORMAT_NV21:
374 case TBM_FORMAT_NV16:
375 case TBM_FORMAT_NV61:
378 case TBM_FORMAT_YUV410:
379 case TBM_FORMAT_YVU410:
380 case TBM_FORMAT_YUV411:
381 case TBM_FORMAT_YVU411:
382 case TBM_FORMAT_YUV420:
383 case TBM_FORMAT_YVU420:
384 case TBM_FORMAT_YUV422:
385 case TBM_FORMAT_YVU422:
386 case TBM_FORMAT_YUV444:
387 case TBM_FORMAT_YVU444:
398 int tbm_surface_internal_get_bpp(tbm_format format)
404 case TBM_FORMAT_RGB332:
405 case TBM_FORMAT_BGR233:
408 case TBM_FORMAT_XRGB4444:
409 case TBM_FORMAT_XBGR4444:
410 case TBM_FORMAT_RGBX4444:
411 case TBM_FORMAT_BGRX4444:
412 case TBM_FORMAT_ARGB4444:
413 case TBM_FORMAT_ABGR4444:
414 case TBM_FORMAT_RGBA4444:
415 case TBM_FORMAT_BGRA4444:
416 case TBM_FORMAT_XRGB1555:
417 case TBM_FORMAT_XBGR1555:
418 case TBM_FORMAT_RGBX5551:
419 case TBM_FORMAT_BGRX5551:
420 case TBM_FORMAT_ARGB1555:
421 case TBM_FORMAT_ABGR1555:
422 case TBM_FORMAT_RGBA5551:
423 case TBM_FORMAT_BGRA5551:
424 case TBM_FORMAT_RGB565:
425 case TBM_FORMAT_BGR565:
428 case TBM_FORMAT_RGB888:
429 case TBM_FORMAT_BGR888:
432 case TBM_FORMAT_XRGB8888:
433 case TBM_FORMAT_XBGR8888:
434 case TBM_FORMAT_RGBX8888:
435 case TBM_FORMAT_BGRX8888:
436 case TBM_FORMAT_ARGB8888:
437 case TBM_FORMAT_ABGR8888:
438 case TBM_FORMAT_RGBA8888:
439 case TBM_FORMAT_BGRA8888:
440 case TBM_FORMAT_XRGB2101010:
441 case TBM_FORMAT_XBGR2101010:
442 case TBM_FORMAT_RGBX1010102:
443 case TBM_FORMAT_BGRX1010102:
444 case TBM_FORMAT_ARGB2101010:
445 case TBM_FORMAT_ABGR2101010:
446 case TBM_FORMAT_RGBA1010102:
447 case TBM_FORMAT_BGRA1010102:
448 case TBM_FORMAT_YUYV:
449 case TBM_FORMAT_YVYU:
450 case TBM_FORMAT_UYVY:
451 case TBM_FORMAT_VYUY:
452 case TBM_FORMAT_AYUV:
455 case TBM_FORMAT_NV12:
456 case TBM_FORMAT_NV21:
459 case TBM_FORMAT_NV16:
460 case TBM_FORMAT_NV61:
463 case TBM_FORMAT_YUV410:
464 case TBM_FORMAT_YVU410:
467 case TBM_FORMAT_YUV411:
468 case TBM_FORMAT_YVU411:
469 case TBM_FORMAT_YUV420:
470 case TBM_FORMAT_YVU420:
473 case TBM_FORMAT_YUV422:
474 case TBM_FORMAT_YVU422:
477 case TBM_FORMAT_YUV444:
478 case TBM_FORMAT_YVU444:
488 tbm_surface_h tbm_surface_internal_create_with_flags(int width, int height, int format, int flags)
490 TBM_RETURN_VAL_IF_FAIL(width > 0, NULL);
491 TBM_RETURN_VAL_IF_FAIL(height > 0, NULL);
493 struct _tbm_bufmgr *mgr;
494 struct _tbm_surface *surf = NULL;
498 uint32_t bo_size = 0;
502 _tbm_surface_mutex_lock();
504 if (!g_surface_bufmgr) {
505 _init_surface_bufmgr();
506 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
509 mgr = g_surface_bufmgr;
510 if (!TBM_BUFMGR_IS_VALID(mgr)) {
511 _tbm_surface_mutex_unlock();
514 surf = calloc(1, sizeof(struct _tbm_surface));
516 _tbm_surface_mutex_unlock();
521 surf->info.width = width;
522 surf->info.height = height;
523 surf->info.format = format;
524 surf->info.bpp = tbm_surface_internal_get_bpp(format);
525 surf->info.size = _tbm_surface_internal_query_size(surf);
526 surf->info.num_planes = tbm_surface_internal_get_num_planes(format);
527 surf->num_bos = _tbm_surface_internal_query_num_bos(format);
530 /* get size, stride and offset bo_idx */
531 for (i = 0; i < surf->info.num_planes; i++) {
532 _tbm_surface_internal_query_plane_data(surf, i, &size, &offset, &stride, &bo_idx);
533 surf->info.planes[i].size = size;
534 surf->info.planes[i].offset = offset;
535 surf->info.planes[i].stride = stride;
536 surf->planes_bo_idx[i] = bo_idx;
541 for (i = 0; i < surf->num_bos; i++) {
543 for (j = 0; j < surf->info.num_planes; j++) {
544 if (surf->planes_bo_idx[j] == i)
545 bo_size += surf->info.planes[j].size;
547 surf->bos[i] = tbm_bo_alloc(mgr, bo_size, flags);
549 for (j = 0; j < i; j++)
550 tbm_bo_unref(surf->bos[j]);
555 if (LIST_IS_EMPTY(&mgr->surf_list)) {
556 LIST_DELINIT(&mgr->surf_list);
557 _deinit_surface_bufmgr();
560 _tbm_surface_mutex_unlock();
563 _tbm_bo_set_surface(surf->bos[i], surf);
567 LIST_ADD(&surf->item_link, &mgr->surf_list);
569 _tbm_surface_mutex_unlock();
574 tbm_surface_h tbm_surface_internal_create_with_bos(tbm_surface_info_s * info, tbm_bo * bos, int num)
576 TBM_RETURN_VAL_IF_FAIL(bos, NULL);
577 TBM_RETURN_VAL_IF_FAIL(info, NULL);
578 TBM_RETURN_VAL_IF_FAIL(num == 1 || info->num_planes == num, NULL);
580 struct _tbm_bufmgr *mgr;
581 struct _tbm_surface *surf = NULL;
584 _tbm_surface_mutex_lock();
586 if (!g_surface_bufmgr) {
587 _init_surface_bufmgr();
588 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
591 mgr = g_surface_bufmgr;
592 if (!TBM_BUFMGR_IS_VALID(mgr)) {
593 _tbm_surface_mutex_unlock();
597 surf = calloc(1, sizeof(struct _tbm_surface));
599 _tbm_surface_mutex_unlock();
604 surf->info.width = info->width;
605 surf->info.height = info->height;
606 surf->info.format = info->format;
607 surf->info.bpp = info->bpp;
608 surf->info.num_planes = info->num_planes;
611 /* get size, stride and offset */
612 for (i = 0; i < info->num_planes; i++) {
613 surf->info.planes[i].offset = info->planes[i].offset;
614 surf->info.planes[i].stride = info->planes[i].stride;
616 if (info->planes[i].size > 0)
617 surf->info.planes[i].size = info->planes[i].size;
619 surf->info.planes[i].size += surf->info.planes[i].stride * info->height;
622 surf->planes_bo_idx[i] = 0;
624 surf->planes_bo_idx[i] = i;
627 if (info->size > 0) {
628 surf->info.size = info->size;
631 for (i = 0; i < info->num_planes; i++)
632 surf->info.size += surf->info.planes[i].size;
635 surf->flags = TBM_BO_DEFAULT;
637 /* create only one bo */
639 for (i = 0; i < num; i++) {
643 surf->bos[i] = tbm_bo_ref(bos[i]);
644 _tbm_bo_set_surface(bos[i], surf);
647 LIST_ADD(&surf->item_link, &mgr->surf_list);
649 _tbm_surface_mutex_unlock();
653 for (i = 0; i < num; i++) {
655 tbm_bo_unref(surf->bos[i]);
663 if (LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
664 LIST_DELINIT(&g_surface_bufmgr->surf_list);
665 _deinit_surface_bufmgr();
668 _tbm_surface_mutex_unlock();
673 void tbm_surface_internal_destroy(tbm_surface_h surface)
678 _tbm_surface_mutex_lock();
682 if (surface->refcnt > 0) {
683 _tbm_surface_mutex_unlock();
687 if (surface->refcnt == 0)
688 _tbm_surface_internal_destroy(surface);
690 _tbm_surface_mutex_unlock();
693 void tbm_surface_internal_ref(tbm_surface_h surface)
695 TBM_RETURN_IF_FAIL(surface);
697 _tbm_surface_mutex_lock();
701 _tbm_surface_mutex_unlock();
704 void tbm_surface_internal_unref(tbm_surface_h surface)
706 TBM_RETURN_IF_FAIL(surface);
708 _tbm_surface_mutex_lock();
712 if (surface->refcnt > 0) {
713 _tbm_surface_mutex_unlock();
717 if (surface->refcnt == 0)
718 _tbm_surface_internal_destroy(surface);
720 _tbm_surface_mutex_unlock();
723 int tbm_surface_internal_get_num_bos(tbm_surface_h surface)
725 TBM_RETURN_VAL_IF_FAIL(surface, 0);
727 struct _tbm_surface *surf;
730 _tbm_surface_mutex_lock();
732 surf = (struct _tbm_surface *)surface;
735 _tbm_surface_mutex_unlock();
740 tbm_bo tbm_surface_internal_get_bo(tbm_surface_h surface, int bo_idx)
742 TBM_RETURN_VAL_IF_FAIL(surface, NULL);
743 TBM_RETURN_VAL_IF_FAIL(bo_idx > -1, NULL);
745 struct _tbm_surface *surf;
748 _tbm_surface_mutex_lock();
750 surf = (struct _tbm_surface *)surface;
751 bo = surf->bos[bo_idx];
753 _tbm_surface_mutex_unlock();
758 int tbm_surface_internal_get_size(tbm_surface_h surface)
760 TBM_RETURN_VAL_IF_FAIL(surface, 0);
762 struct _tbm_surface *surf;
765 _tbm_surface_mutex_lock();
767 surf = (struct _tbm_surface *)surface;
768 size = surf->info.size;
770 _tbm_surface_mutex_unlock();
775 int tbm_surface_internal_get_plane_data(tbm_surface_h surface, int plane_idx, uint32_t * size, uint32_t * offset, uint32_t * pitch)
777 TBM_RETURN_VAL_IF_FAIL(surface, 0);
778 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
780 struct _tbm_surface *surf;
782 _tbm_surface_mutex_lock();
784 surf = (struct _tbm_surface *)surface;
786 if (plane_idx >= surf->info.num_planes) {
787 _tbm_surface_mutex_unlock();
791 *size = surf->info.planes[plane_idx].size;
792 *offset = surf->info.planes[plane_idx].offset;
793 *pitch = surf->info.planes[plane_idx].stride;
795 _tbm_surface_mutex_unlock();
800 int tbm_surface_internal_get_info(tbm_surface_h surface, int opt, tbm_surface_info_s * info, int map)
802 struct _tbm_surface *surf;
803 tbm_bo_handle bo_handles[4];
806 _tbm_surface_mutex_lock();
808 memset(bo_handles, 0, sizeof(tbm_bo_handle) * 4);
810 surf = (struct _tbm_surface *)surface;
812 info->width = surf->info.width;
813 info->height = surf->info.height;
814 info->format = surf->info.format;
815 info->bpp = surf->info.bpp;
816 info->size = surf->info.size;
817 info->num_planes = surf->info.num_planes;
820 for (i = 0; i < surf->num_bos; i++) {
821 bo_handles[i] = tbm_bo_map(surf->bos[i], TBM_DEVICE_CPU, opt);
822 if (bo_handles[i].ptr == NULL) {
823 for (j = 0; j < i; j++)
824 tbm_bo_unmap(surf->bos[j]);
826 _tbm_surface_mutex_unlock();
831 for (i = 0; i < surf->num_bos; i++) {
832 bo_handles[i] = tbm_bo_get_handle(surf->bos[i], TBM_DEVICE_CPU);
833 if (bo_handles[i].ptr == NULL) {
834 _tbm_surface_mutex_unlock();
840 for (i = 0; i < surf->info.num_planes; i++) {
841 info->planes[i].size = surf->info.planes[i].size;
842 info->planes[i].offset = surf->info.planes[i].offset;
843 info->planes[i].stride = surf->info.planes[i].stride;
844 info->planes[i].ptr = bo_handles[surf->planes_bo_idx[i]].ptr + surf->info.planes[i].offset;
847 _tbm_surface_mutex_unlock();
852 void tbm_surface_internal_unmap(tbm_surface_h surface)
854 struct _tbm_surface *surf;
857 _tbm_surface_mutex_lock();
859 surf = (struct _tbm_surface *)surface;
861 for (i = 0; i < surf->num_bos; i++)
862 tbm_bo_unmap(surf->bos[i]);
864 _tbm_surface_mutex_unlock();
867 unsigned int tbm_surface_internal_get_width(tbm_surface_h surface)
869 struct _tbm_surface *surf;
872 _tbm_surface_mutex_lock();
874 surf = (struct _tbm_surface *)surface;
875 width = surf->info.width;
877 _tbm_surface_mutex_unlock();
882 unsigned int tbm_surface_internal_get_height(tbm_surface_h surface)
884 struct _tbm_surface *surf;
887 _tbm_surface_mutex_lock();
889 surf = (struct _tbm_surface *)surface;
890 height = surf->info.height;
892 _tbm_surface_mutex_unlock();
898 tbm_format tbm_surface_internal_get_format(tbm_surface_h surface)
900 struct _tbm_surface *surf;
903 _tbm_surface_mutex_lock();
905 surf = (struct _tbm_surface *)surface;
906 format = surf->info.format;
908 _tbm_surface_mutex_unlock();
913 int tbm_surface_internal_get_plane_bo_idx(tbm_surface_h surface, int plane_idx)
915 TBM_RETURN_VAL_IF_FAIL(surface, 0);
916 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
917 struct _tbm_surface *surf;
920 _tbm_surface_mutex_lock();
922 surf = (struct _tbm_surface *)surface;
923 bo_idx = surf->planes_bo_idx[plane_idx];
925 _tbm_surface_mutex_unlock();
930 unsigned int _tbm_surface_internal_get_debug_pid(tbm_surface_h surface)
932 TBM_RETURN_VAL_IF_FAIL(surface, 0);
934 return surface->debug_pid;
937 void tbm_surface_internal_set_debug_pid(tbm_surface_h surface, unsigned int pid)
939 TBM_RETURN_IF_FAIL(surface);
941 surface->debug_pid = pid;