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"
39 #define C(b,m) (((b) >> (m)) & 0xFF)
40 #define B(c,s) ((((unsigned int)(c)) & 0xff) << (s))
41 #define FOURCC(a,b,c,d) (B(d,24) | B(c,16) | B(b,8) | B(a,0))
42 #define FOURCC_STR(id) C(id,0), C(id,8), C(id,16), C(id,24)
43 #define FOURCC_ID(str) FOURCC(((char*)str)[0],((char*)str)[1],((char*)str)[2],((char*)str)[3])
45 static tbm_bufmgr g_surface_bufmgr;
46 static pthread_mutex_t tbm_surface_lock;
50 _tbm_surface_internal_format_to_str(tbm_format format)
54 return "TBM_FORMAT_C8";
55 case TBM_FORMAT_RGB332:
56 return "TBM_FORMAT_RGB332";
57 case TBM_FORMAT_BGR233:
58 return "TBM_FORMAT_BGR233";
59 case TBM_FORMAT_XRGB4444:
60 return "TBM_FORMAT_XRGB4444";
61 case TBM_FORMAT_XBGR4444:
62 return "TBM_FORMAT_XBGR4444";
63 case TBM_FORMAT_RGBX4444:
64 return "TBM_FORMAT_RGBX4444";
65 case TBM_FORMAT_BGRX4444:
66 return "TBM_FORMAT_BGRX4444";
67 case TBM_FORMAT_ARGB4444:
68 return "TBM_FORMAT_ARGB4444";
69 case TBM_FORMAT_ABGR4444:
70 return "TBM_FORMAT_ABGR4444";
71 case TBM_FORMAT_RGBA4444:
72 return "TBM_FORMAT_RGBA4444";
73 case TBM_FORMAT_BGRA4444:
74 return "TBM_FORMAT_BGRA4444";
75 case TBM_FORMAT_XRGB1555:
76 return "TBM_FORMAT_XRGB1555";
77 case TBM_FORMAT_XBGR1555:
78 return "TBM_FORMAT_XBGR1555";
79 case TBM_FORMAT_RGBX5551:
80 return "TBM_FORMAT_RGBX5551";
81 case TBM_FORMAT_BGRX5551:
82 return "TBM_FORMAT_BGRX5551";
83 case TBM_FORMAT_ARGB1555:
84 return "TBM_FORMAT_ARGB1555";
85 case TBM_FORMAT_ABGR1555:
86 return "TBM_FORMAT_ABGR1555";
87 case TBM_FORMAT_RGBA5551:
88 return "TBM_FORMAT_RGBA5551";
89 case TBM_FORMAT_BGRA5551:
90 return "TBM_FORMAT_BGRA5551";
91 case TBM_FORMAT_RGB565:
92 return "TBM_FORMAT_RGB565";
93 case TBM_FORMAT_BGR565:
94 return "TBM_FORMAT_BGR565";
95 case TBM_FORMAT_RGB888:
96 return "TBM_FORMAT_RGB888";
97 case TBM_FORMAT_BGR888:
98 return "TBM_FORMAT_BGR888";
99 case TBM_FORMAT_XRGB8888:
100 return "TBM_FORMAT_XRGB8888";
101 case TBM_FORMAT_XBGR8888:
102 return "TBM_FORMAT_XBGR8888";
103 case TBM_FORMAT_RGBX8888:
104 return "TBM_FORMAT_RGBX8888";
105 case TBM_FORMAT_BGRX8888:
106 return "TBM_FORMAT_BGRX8888";
107 case TBM_FORMAT_ARGB8888:
108 return "TBM_FORMAT_ARGB8888";
109 case TBM_FORMAT_ABGR8888:
110 return "TBM_FORMAT_ABGR8888";
111 case TBM_FORMAT_RGBA8888:
112 return "TBM_FORMAT_RGBA8888";
113 case TBM_FORMAT_BGRA8888:
114 return "TBM_FORMAT_BGRA8888";
115 case TBM_FORMAT_XRGB2101010:
116 return "TBM_FORMAT_XRGB2101010";
117 case TBM_FORMAT_XBGR2101010:
118 return "TBM_FORMAT_XBGR2101010";
119 case TBM_FORMAT_RGBX1010102:
120 return "TBM_FORMAT_RGBX1010102";
121 case TBM_FORMAT_BGRX1010102:
122 return "TBM_FORMAT_BGRX1010102";
123 case TBM_FORMAT_ARGB2101010:
124 return "TBM_FORMAT_ARGB2101010";
125 case TBM_FORMAT_ABGR2101010:
126 return "TBM_FORMAT_ABGR2101010";
127 case TBM_FORMAT_RGBA1010102:
128 return "TBM_FORMAT_RGBA1010102";
129 case TBM_FORMAT_BGRA1010102:
130 return "TBM_FORMAT_BGRA1010102";
131 case TBM_FORMAT_YUYV:
132 return "TBM_FORMAT_YUYV";
133 case TBM_FORMAT_YVYU:
134 return "TBM_FORMAT_YVYU";
135 case TBM_FORMAT_UYVY:
136 return "TBM_FORMAT_UYVY";
137 case TBM_FORMAT_VYUY:
138 return "TBM_FORMAT_VYUY";
139 case TBM_FORMAT_AYUV:
140 return "TBM_FORMAT_AYUV";
141 case TBM_FORMAT_NV12:
142 return "TBM_FORMAT_NV12";
143 case TBM_FORMAT_NV21:
144 return "TBM_FORMAT_NV21";
145 case TBM_FORMAT_NV16:
146 return "TBM_FORMAT_NV16";
147 case TBM_FORMAT_NV61:
148 return "TBM_FORMAT_NV61";
149 case TBM_FORMAT_YUV410:
150 return "TBM_FORMAT_YUV410";
151 case TBM_FORMAT_YVU410:
152 return "TBM_FORMAT_YVU410";
153 case TBM_FORMAT_YUV411:
154 return "TBM_FORMAT_YUV411";
155 case TBM_FORMAT_YVU411:
156 return "TBM_FORMAT_YVU411";
157 case TBM_FORMAT_YUV420:
158 return "TBM_FORMAT_YUV420";
159 case TBM_FORMAT_YVU420:
160 return "TBM_FORMAT_YVU420";
161 case TBM_FORMAT_YUV422:
162 return "TBM_FORMAT_YUV422";
163 case TBM_FORMAT_YVU422:
164 return "TBM_FORMAT_YVU422";
165 case TBM_FORMAT_YUV444:
166 return "TBM_FORMAT_YUV444";
167 case TBM_FORMAT_YVU444:
168 return "TBM_FORMAT_YVU444";
169 case TBM_FORMAT_NV12MT:
170 return "TBM_FORMAT_NV12MT";
178 _tbm_surface_mutex_init(void)
180 static bool tbm_surface_mutex_init = false;
182 if (tbm_surface_mutex_init)
185 if (pthread_mutex_init(&tbm_surface_lock, NULL)) {
186 TBM_LOG_E("fail: tbm_surface mutex init\n");
190 tbm_surface_mutex_init = true;
196 _tbm_surface_mutex_lock(void)
198 if (!_tbm_surface_mutex_init())
201 pthread_mutex_lock(&tbm_surface_lock);
205 _tbm_surface_mutex_unlock(void)
207 pthread_mutex_unlock(&tbm_surface_lock);
211 _init_surface_bufmgr(void)
213 g_surface_bufmgr = tbm_bufmgr_init(-1);
217 _deinit_surface_bufmgr(void)
219 if (!g_surface_bufmgr)
222 tbm_bufmgr_deinit(g_surface_bufmgr);
223 g_surface_bufmgr = NULL;
227 _tbm_surface_internal_query_plane_data(tbm_surface_h surface,
228 int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
230 TBM_RETURN_VAL_IF_FAIL(surface, 0);
231 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
233 struct _tbm_surface *surf = (struct _tbm_surface *)surface;
234 struct _tbm_bufmgr *mgr = surf->bufmgr;
237 TBM_RETURN_VAL_IF_FAIL(mgr != NULL, 0);
238 TBM_RETURN_VAL_IF_FAIL(surf->info.width > 0, 0);
239 TBM_RETURN_VAL_IF_FAIL(surf->info.height > 0, 0);
240 TBM_RETURN_VAL_IF_FAIL(surf->info.format > 0, 0);
242 if (!mgr->backend->surface_get_plane_data)
245 ret = mgr->backend->surface_get_plane_data(surf->info.width,
246 surf->info.height, surf->info.format, plane_idx, size, offset, pitch, bo_idx);
254 _tbm_surface_internal_destroy(tbm_surface_h surface)
257 tbm_bufmgr bufmgr = surface->bufmgr;
258 tbm_user_data *old_data = NULL, *tmp = NULL;
260 for (i = 0; i < surface->num_bos; i++) {
261 surface->bos[i]->surface = NULL;
263 tbm_bo_unref(surface->bos[i]);
264 surface->bos[i] = NULL;
267 /* destory the user_data_list */
268 if (!LIST_IS_EMPTY(&surface->user_data_list)) {
269 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp, &surface->user_data_list, item_link) {
270 DBG("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();
287 tbm_surface_internal_is_valid(tbm_surface_h surface)
289 tbm_surface_h old_data = NULL, tmp = NULL;
291 if (surface == NULL || g_surface_bufmgr == NULL)
294 if (!LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
295 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp, &g_surface_bufmgr->surf_list, item_link) {
296 if (old_data == surface)
304 tbm_surface_internal_query_supported_formats(uint32_t **formats,
307 struct _tbm_bufmgr *mgr;
310 _tbm_surface_mutex_lock();
312 if (!g_surface_bufmgr) {
313 _init_surface_bufmgr();
314 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
317 mgr = g_surface_bufmgr;
319 if (!mgr->backend->surface_supported_format) {
320 _tbm_surface_mutex_unlock();
324 ret = mgr->backend->surface_supported_format(formats, num);
326 _tbm_surface_mutex_unlock();
332 tbm_surface_internal_get_num_planes(tbm_format format)
338 case TBM_FORMAT_RGB332:
339 case TBM_FORMAT_BGR233:
340 case TBM_FORMAT_XRGB4444:
341 case TBM_FORMAT_XBGR4444:
342 case TBM_FORMAT_RGBX4444:
343 case TBM_FORMAT_BGRX4444:
344 case TBM_FORMAT_ARGB4444:
345 case TBM_FORMAT_ABGR4444:
346 case TBM_FORMAT_RGBA4444:
347 case TBM_FORMAT_BGRA4444:
348 case TBM_FORMAT_XRGB1555:
349 case TBM_FORMAT_XBGR1555:
350 case TBM_FORMAT_RGBX5551:
351 case TBM_FORMAT_BGRX5551:
352 case TBM_FORMAT_ARGB1555:
353 case TBM_FORMAT_ABGR1555:
354 case TBM_FORMAT_RGBA5551:
355 case TBM_FORMAT_BGRA5551:
356 case TBM_FORMAT_RGB565:
357 case TBM_FORMAT_BGR565:
358 case TBM_FORMAT_RGB888:
359 case TBM_FORMAT_BGR888:
360 case TBM_FORMAT_XRGB8888:
361 case TBM_FORMAT_XBGR8888:
362 case TBM_FORMAT_RGBX8888:
363 case TBM_FORMAT_BGRX8888:
364 case TBM_FORMAT_ARGB8888:
365 case TBM_FORMAT_ABGR8888:
366 case TBM_FORMAT_RGBA8888:
367 case TBM_FORMAT_BGRA8888:
368 case TBM_FORMAT_XRGB2101010:
369 case TBM_FORMAT_XBGR2101010:
370 case TBM_FORMAT_RGBX1010102:
371 case TBM_FORMAT_BGRX1010102:
372 case TBM_FORMAT_ARGB2101010:
373 case TBM_FORMAT_ABGR2101010:
374 case TBM_FORMAT_RGBA1010102:
375 case TBM_FORMAT_BGRA1010102:
376 case TBM_FORMAT_YUYV:
377 case TBM_FORMAT_YVYU:
378 case TBM_FORMAT_UYVY:
379 case TBM_FORMAT_VYUY:
380 case TBM_FORMAT_AYUV:
383 case TBM_FORMAT_NV12:
384 case TBM_FORMAT_NV12MT:
385 case TBM_FORMAT_NV21:
386 case TBM_FORMAT_NV16:
387 case TBM_FORMAT_NV61:
390 case TBM_FORMAT_YUV410:
391 case TBM_FORMAT_YVU410:
392 case TBM_FORMAT_YUV411:
393 case TBM_FORMAT_YVU411:
394 case TBM_FORMAT_YUV420:
395 case TBM_FORMAT_YVU420:
396 case TBM_FORMAT_YUV422:
397 case TBM_FORMAT_YVU422:
398 case TBM_FORMAT_YUV444:
399 case TBM_FORMAT_YVU444:
411 tbm_surface_internal_get_bpp(tbm_format format)
417 case TBM_FORMAT_RGB332:
418 case TBM_FORMAT_BGR233:
421 case TBM_FORMAT_XRGB4444:
422 case TBM_FORMAT_XBGR4444:
423 case TBM_FORMAT_RGBX4444:
424 case TBM_FORMAT_BGRX4444:
425 case TBM_FORMAT_ARGB4444:
426 case TBM_FORMAT_ABGR4444:
427 case TBM_FORMAT_RGBA4444:
428 case TBM_FORMAT_BGRA4444:
429 case TBM_FORMAT_XRGB1555:
430 case TBM_FORMAT_XBGR1555:
431 case TBM_FORMAT_RGBX5551:
432 case TBM_FORMAT_BGRX5551:
433 case TBM_FORMAT_ARGB1555:
434 case TBM_FORMAT_ABGR1555:
435 case TBM_FORMAT_RGBA5551:
436 case TBM_FORMAT_BGRA5551:
437 case TBM_FORMAT_RGB565:
438 case TBM_FORMAT_BGR565:
441 case TBM_FORMAT_RGB888:
442 case TBM_FORMAT_BGR888:
445 case TBM_FORMAT_XRGB8888:
446 case TBM_FORMAT_XBGR8888:
447 case TBM_FORMAT_RGBX8888:
448 case TBM_FORMAT_BGRX8888:
449 case TBM_FORMAT_ARGB8888:
450 case TBM_FORMAT_ABGR8888:
451 case TBM_FORMAT_RGBA8888:
452 case TBM_FORMAT_BGRA8888:
453 case TBM_FORMAT_XRGB2101010:
454 case TBM_FORMAT_XBGR2101010:
455 case TBM_FORMAT_RGBX1010102:
456 case TBM_FORMAT_BGRX1010102:
457 case TBM_FORMAT_ARGB2101010:
458 case TBM_FORMAT_ABGR2101010:
459 case TBM_FORMAT_RGBA1010102:
460 case TBM_FORMAT_BGRA1010102:
461 case TBM_FORMAT_YUYV:
462 case TBM_FORMAT_YVYU:
463 case TBM_FORMAT_UYVY:
464 case TBM_FORMAT_VYUY:
465 case TBM_FORMAT_AYUV:
468 case TBM_FORMAT_NV12:
469 case TBM_FORMAT_NV12MT:
470 case TBM_FORMAT_NV21:
473 case TBM_FORMAT_NV16:
474 case TBM_FORMAT_NV61:
477 case TBM_FORMAT_YUV410:
478 case TBM_FORMAT_YVU410:
481 case TBM_FORMAT_YUV411:
482 case TBM_FORMAT_YVU411:
483 case TBM_FORMAT_YUV420:
484 case TBM_FORMAT_YVU420:
487 case TBM_FORMAT_YUV422:
488 case TBM_FORMAT_YVU422:
491 case TBM_FORMAT_YUV444:
492 case TBM_FORMAT_YVU444:
503 tbm_surface_internal_create_with_flags(int width, int height,
504 int format, int flags)
506 TBM_RETURN_VAL_IF_FAIL(width > 0, NULL);
507 TBM_RETURN_VAL_IF_FAIL(height > 0, NULL);
509 struct _tbm_bufmgr *mgr;
510 struct _tbm_surface *surf = NULL;
514 uint32_t bo_size = 0;
518 _tbm_surface_mutex_lock();
520 if (!g_surface_bufmgr) {
521 _init_surface_bufmgr();
522 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
525 mgr = g_surface_bufmgr;
526 if (!TBM_BUFMGR_IS_VALID(mgr)) {
527 _tbm_surface_mutex_unlock();
530 surf = calloc(1, sizeof(struct _tbm_surface));
532 _tbm_surface_mutex_unlock();
537 surf->info.width = width;
538 surf->info.height = height;
539 surf->info.format = format;
540 surf->info.bpp = tbm_surface_internal_get_bpp(format);
541 surf->info.num_planes = tbm_surface_internal_get_num_planes(format);
544 /* get size, stride and offset bo_idx */
545 for (i = 0; i < surf->info.num_planes; i++) {
546 _tbm_surface_internal_query_plane_data(surf, i, &size, &offset, &stride,
548 surf->info.planes[i].size = size;
549 surf->info.planes[i].offset = offset;
550 surf->info.planes[i].stride = stride;
551 surf->planes_bo_idx[i] = bo_idx;
556 for (i = 0; i < surf->info.num_planes; i++) {
557 surf->info.size += surf->info.planes[i].size;
559 if (surf->num_bos -1 > surf->planes_bo_idx[i])
560 surf->num_bos = surf->planes_bo_idx[i]++;
565 for (i = 0; i < surf->num_bos; i++) {
567 for (j = 0; j < surf->info.num_planes; j++) {
568 if (surf->planes_bo_idx[j] == i)
569 bo_size += surf->info.planes[j].size;
572 if (mgr->backend->surface_bo_alloc) {
573 /* LCOV_EXCL_START */
575 void *bo_priv = NULL;
577 bo = calloc(1, sizeof(struct _tbm_bo));
579 TBM_LOG_E("fail to alloc bo struct\n");
583 bo->bufmgr = surf->bufmgr;
585 pthread_mutex_lock(&surf->bufmgr->lock);
587 bo_priv = mgr->backend->surface_bo_alloc (bo, width, height, format, flags, i);
589 TBM_LOG_E("fail to alloc bo priv\n");
591 pthread_mutex_unlock(&surf->bufmgr->lock);
599 LIST_INITHEAD(&bo->user_data_list);
601 LIST_ADD(&bo->item_link, &surf->bufmgr->bo_list);
603 pthread_mutex_unlock(&surf->bufmgr->lock);
608 surf->bos[i] = tbm_bo_alloc(mgr, bo_size, flags);
612 TBM_LOG_E("fail to alloc bo idx:%d\n", i);
616 _tbm_bo_set_surface(surf->bos[i], surf);
620 LIST_INITHEAD(&surf->user_data_list);
622 LIST_ADD(&surf->item_link, &mgr->surf_list);
624 _tbm_surface_mutex_unlock();
629 for (j = 0; j < i; j++) {
631 tbm_bo_unref(surf->bos[j]);
637 if (LIST_IS_EMPTY(&mgr->surf_list)) {
638 LIST_DELINIT(&mgr->surf_list);
639 _deinit_surface_bufmgr();
642 _tbm_surface_mutex_unlock();
647 tbm_surface_internal_create_with_bos(tbm_surface_info_s *info,
648 tbm_bo *bos, int num)
650 TBM_RETURN_VAL_IF_FAIL(bos, NULL);
651 TBM_RETURN_VAL_IF_FAIL(info, NULL);
652 TBM_RETURN_VAL_IF_FAIL(num == 1 || info->num_planes == num, NULL);
654 struct _tbm_bufmgr *mgr;
655 struct _tbm_surface *surf = NULL;
658 _tbm_surface_mutex_lock();
660 if (!g_surface_bufmgr) {
661 _init_surface_bufmgr();
662 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
665 mgr = g_surface_bufmgr;
666 if (!TBM_BUFMGR_IS_VALID(mgr)) {
667 _tbm_surface_mutex_unlock();
671 surf = calloc(1, sizeof(struct _tbm_surface));
673 _tbm_surface_mutex_unlock();
678 surf->info.width = info->width;
679 surf->info.height = info->height;
680 surf->info.format = info->format;
681 surf->info.bpp = info->bpp;
682 surf->info.num_planes = info->num_planes;
685 /* get size, stride and offset */
686 for (i = 0; i < info->num_planes; i++) {
687 surf->info.planes[i].offset = info->planes[i].offset;
688 surf->info.planes[i].stride = info->planes[i].stride;
690 if (info->planes[i].size > 0)
691 surf->info.planes[i].size = info->planes[i].size;
693 surf->info.planes[i].size += surf->info.planes[i].stride * info->height;
696 surf->planes_bo_idx[i] = 0;
698 surf->planes_bo_idx[i] = i;
701 if (info->size > 0) {
702 surf->info.size = info->size;
705 for (i = 0; i < info->num_planes; i++)
706 surf->info.size += surf->info.planes[i].size;
709 surf->flags = TBM_BO_DEFAULT;
711 /* create only one bo */
713 for (i = 0; i < num; i++) {
717 surf->bos[i] = tbm_bo_ref(bos[i]);
718 _tbm_bo_set_surface(bos[i], surf);
721 LIST_INITHEAD(&surf->user_data_list);
723 LIST_ADD(&surf->item_link, &mgr->surf_list);
725 _tbm_surface_mutex_unlock();
729 for (i = 0; i < num; i++) {
731 tbm_bo_unref(surf->bos[i]);
739 if (LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
740 LIST_DELINIT(&g_surface_bufmgr->surf_list);
741 _deinit_surface_bufmgr();
744 _tbm_surface_mutex_unlock();
750 tbm_surface_internal_destroy(tbm_surface_h surface)
752 if (!tbm_surface_internal_is_valid(surface))
755 _tbm_surface_mutex_lock();
759 if (surface->refcnt > 0) {
760 _tbm_surface_mutex_unlock();
764 if (surface->refcnt == 0)
765 _tbm_surface_internal_destroy(surface);
767 _tbm_surface_mutex_unlock();
771 tbm_surface_internal_ref(tbm_surface_h surface)
773 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
775 _tbm_surface_mutex_lock();
779 _tbm_surface_mutex_unlock();
783 tbm_surface_internal_unref(tbm_surface_h surface)
785 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
787 _tbm_surface_mutex_lock();
791 if (surface->refcnt > 0) {
792 _tbm_surface_mutex_unlock();
796 if (surface->refcnt == 0)
797 _tbm_surface_internal_destroy(surface);
799 _tbm_surface_mutex_unlock();
803 tbm_surface_internal_get_num_bos(tbm_surface_h surface)
805 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
807 struct _tbm_surface *surf;
810 _tbm_surface_mutex_lock();
812 surf = (struct _tbm_surface *)surface;
815 _tbm_surface_mutex_unlock();
821 tbm_surface_internal_get_bo(tbm_surface_h surface, int bo_idx)
823 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), NULL);
824 TBM_RETURN_VAL_IF_FAIL(bo_idx > -1, NULL);
826 struct _tbm_surface *surf;
829 _tbm_surface_mutex_lock();
831 surf = (struct _tbm_surface *)surface;
832 bo = surf->bos[bo_idx];
834 _tbm_surface_mutex_unlock();
840 tbm_surface_internal_get_size(tbm_surface_h surface)
842 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
844 struct _tbm_surface *surf;
847 _tbm_surface_mutex_lock();
849 surf = (struct _tbm_surface *)surface;
850 size = surf->info.size;
852 _tbm_surface_mutex_unlock();
858 tbm_surface_internal_get_plane_data(tbm_surface_h surface, int plane_idx,
859 uint32_t *size, uint32_t *offset, uint32_t *pitch)
861 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
862 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
864 struct _tbm_surface *surf;
866 _tbm_surface_mutex_lock();
868 surf = (struct _tbm_surface *)surface;
870 if (plane_idx >= surf->info.num_planes) {
871 _tbm_surface_mutex_unlock();
876 *size = surf->info.planes[plane_idx].size;
879 *offset = surf->info.planes[plane_idx].offset;
882 *pitch = surf->info.planes[plane_idx].stride;
884 _tbm_surface_mutex_unlock();
890 tbm_surface_internal_get_info(tbm_surface_h surface, int opt,
891 tbm_surface_info_s *info, int map)
893 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
895 struct _tbm_surface *surf;
896 tbm_bo_handle bo_handles[4];
899 _tbm_surface_mutex_lock();
901 memset(bo_handles, 0, sizeof(tbm_bo_handle) * 4);
903 surf = (struct _tbm_surface *)surface;
905 memset(info, 0x00, sizeof(tbm_surface_info_s));
906 info->width = surf->info.width;
907 info->height = surf->info.height;
908 info->format = surf->info.format;
909 info->bpp = surf->info.bpp;
910 info->size = surf->info.size;
911 info->num_planes = surf->info.num_planes;
914 for (i = 0; i < surf->num_bos; i++) {
915 bo_handles[i] = tbm_bo_map(surf->bos[i], TBM_DEVICE_CPU, opt);
916 if (bo_handles[i].ptr == NULL) {
917 for (j = 0; j < i; j++)
918 tbm_bo_unmap(surf->bos[j]);
920 _tbm_surface_mutex_unlock();
925 for (i = 0; i < surf->num_bos; i++)
926 bo_handles[i] = tbm_bo_get_handle(surf->bos[i], TBM_DEVICE_CPU);
929 for (i = 0; i < surf->info.num_planes; i++) {
930 info->planes[i].size = surf->info.planes[i].size;
931 info->planes[i].offset = surf->info.planes[i].offset;
932 info->planes[i].stride = surf->info.planes[i].stride;
934 if (bo_handles[surf->planes_bo_idx[i]].ptr)
935 info->planes[i].ptr = bo_handles[surf->planes_bo_idx[i]].ptr +
936 surf->info.planes[i].offset;
939 _tbm_surface_mutex_unlock();
945 tbm_surface_internal_unmap(tbm_surface_h surface)
947 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
949 struct _tbm_surface *surf;
952 _tbm_surface_mutex_lock();
954 surf = (struct _tbm_surface *)surface;
956 for (i = 0; i < surf->num_bos; i++)
957 tbm_bo_unmap(surf->bos[i]);
959 _tbm_surface_mutex_unlock();
963 tbm_surface_internal_get_width(tbm_surface_h surface)
965 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
967 struct _tbm_surface *surf;
970 _tbm_surface_mutex_lock();
972 surf = (struct _tbm_surface *)surface;
973 width = surf->info.width;
975 _tbm_surface_mutex_unlock();
981 tbm_surface_internal_get_height(tbm_surface_h surface)
983 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
985 struct _tbm_surface *surf;
988 _tbm_surface_mutex_lock();
990 surf = (struct _tbm_surface *)surface;
991 height = surf->info.height;
993 _tbm_surface_mutex_unlock();
1000 tbm_surface_internal_get_format(tbm_surface_h surface)
1002 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1004 struct _tbm_surface *surf;
1007 _tbm_surface_mutex_lock();
1009 surf = (struct _tbm_surface *)surface;
1010 format = surf->info.format;
1012 _tbm_surface_mutex_unlock();
1018 tbm_surface_internal_get_plane_bo_idx(tbm_surface_h surface, int plane_idx)
1020 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1021 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
1022 struct _tbm_surface *surf;
1025 _tbm_surface_mutex_lock();
1027 surf = (struct _tbm_surface *)surface;
1028 bo_idx = surf->planes_bo_idx[plane_idx];
1030 _tbm_surface_mutex_unlock();
1036 tbm_surface_internal_add_user_data(tbm_surface_h surface, unsigned long key,
1037 tbm_data_free data_free_func)
1039 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1041 tbm_user_data *data;
1043 /* check if the data according to the key exist if so, return false. */
1044 data = user_data_lookup(&surface->user_data_list, key);
1046 TBM_LOG_W("waring user data already exist. key:%ld\n", key);
1050 data = user_data_create(key, data_free_func);
1054 LIST_ADD(&data->item_link, &surface->user_data_list);
1060 tbm_surface_internal_set_user_data(tbm_surface_h surface, unsigned long key,
1063 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1065 tbm_user_data *old_data;
1067 if (LIST_IS_EMPTY(&surface->user_data_list))
1070 old_data = user_data_lookup(&surface->user_data_list, key);
1074 if (old_data->data && old_data->free_func)
1075 old_data->free_func(old_data->data);
1077 old_data->data = data;
1083 tbm_surface_internal_get_user_data(tbm_surface_h surface, unsigned long key,
1086 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1088 tbm_user_data *old_data;
1090 if (!data || LIST_IS_EMPTY(&surface->user_data_list))
1093 old_data = user_data_lookup(&surface->user_data_list, key);
1099 *data = old_data->data;
1105 tbm_surface_internal_delete_user_data(tbm_surface_h surface,
1108 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1110 tbm_user_data *old_data = (void *)0;
1112 if (LIST_IS_EMPTY(&surface->user_data_list))
1115 old_data = user_data_lookup(&surface->user_data_list, key);
1119 user_data_delete(old_data);
1124 /* LCOV_EXCL_START */
1126 _tbm_surface_internal_get_debug_pid(tbm_surface_h surface)
1128 TBM_RETURN_VAL_IF_FAIL(surface, 0);
1130 return surface->debug_pid;
1134 tbm_surface_internal_set_debug_pid(tbm_surface_h surface, unsigned int pid)
1136 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
1138 surface->debug_pid = pid;
1141 typedef struct _tbm_surface_dump_info tbm_surface_dump_info;
1142 typedef struct _tbm_surface_dump_buf_info tbm_surface_dump_buf_info;
1144 struct _tbm_surface_dump_buf_info
1155 tbm_surface_info_s info;
1157 struct list_head link;
1160 struct _tbm_surface_dump_info
1162 char *path; // copy???
1165 struct list_head *link;
1166 struct list_head surface_list; /* link of surface */
1169 static tbm_surface_dump_info *g_dump_info = NULL;
1170 static const char *dump_postfix[2] = {"png", "yuv"};
1173 _tbm_surface_internal_dump_file_raw(const char *file, void *data1, int size1, void *data2,
1174 int size2, void *data3, int size3)
1176 unsigned int *blocks;
1177 FILE *fp = fopen(file, "w+");
1178 TBM_RETURN_IF_FAIL(fp != NULL);
1180 blocks = (unsigned int *)data1;
1181 fwrite(blocks, 1, size1, fp);
1184 blocks = (unsigned int *)data2;
1185 fwrite(blocks, 1, size2, fp);
1189 blocks = (unsigned int *)data3;
1190 fwrite(blocks, 1, size3, fp);
1197 _tbm_surface_internal_dump_file_png(const char *file, const void *data, int width,
1200 FILE *fp = fopen(file, "wb");
1201 TBM_RETURN_IF_FAIL(fp != NULL);
1204 png_structp pPngStruct =
1205 png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
1211 png_infop pPngInfo = png_create_info_struct(pPngStruct);
1213 png_destroy_write_struct(&pPngStruct, NULL);
1218 png_init_io(pPngStruct, fp);
1219 png_set_IHDR(pPngStruct,
1224 PNG_COLOR_TYPE_RGBA,
1226 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
1228 png_set_bgr(pPngStruct);
1229 png_write_info(pPngStruct, pPngInfo);
1231 const int pixel_size = 4; // RGBA
1232 png_bytep *row_pointers =
1233 png_malloc(pPngStruct, height * sizeof(png_byte *));
1235 unsigned int *blocks = (unsigned int *)data;
1239 for (; y < height; ++y) {
1241 png_malloc(pPngStruct, sizeof(png_byte) * width * pixel_size);
1242 row_pointers[y] = (png_bytep)row;
1243 for (x = 0; x < width; ++x) {
1244 unsigned int curBlock = blocks[y * width + x];
1245 row[x * pixel_size] = (curBlock & 0xFF);
1246 row[1 + x * pixel_size] = (curBlock >> 8) & 0xFF;
1247 row[2 + x * pixel_size] = (curBlock >> 16) & 0xFF;
1248 row[3 + x * pixel_size] = (curBlock >> 24) & 0xFF;
1252 png_write_image(pPngStruct, row_pointers);
1253 png_write_end(pPngStruct, pPngInfo);
1255 for (y = 0; y < height; y++)
1256 png_free(pPngStruct, row_pointers[y]);
1257 png_free(pPngStruct, row_pointers);
1259 png_destroy_write_struct(&pPngStruct, &pPngInfo);
1265 tbm_surface_internal_dump_start(char *path, int w, int h, int count)
1267 TBM_RETURN_IF_FAIL(path != NULL);
1268 TBM_RETURN_IF_FAIL(w > 0);
1269 TBM_RETURN_IF_FAIL(h > 0);
1270 TBM_RETURN_IF_FAIL(count > 0);
1272 tbm_surface_dump_buf_info *buf_info = NULL;
1273 tbm_surface_dump_buf_info *tmp;
1277 tbm_surface_h tbm_surface;
1278 tbm_surface_info_s info;
1279 tbm_surface_error_e err;
1283 TBM_LOG_W("waring already running the tbm_surface_internal_dump.\n");
1287 g_dump_info = calloc(1, sizeof (struct _tbm_surface_dump_info));
1288 TBM_RETURN_IF_FAIL(g_dump_info);
1290 LIST_INITHEAD(&g_dump_info->surface_list);
1291 g_dump_info->count = 0;
1292 g_dump_info->dump_max = count;
1294 /* get buffer size */
1295 tbm_surface = tbm_surface_create(w, h, TBM_FORMAT_ARGB8888);
1296 if (tbm_surface == NULL) {
1297 TBM_LOG_E("tbm_surface_create fail\n");
1302 err = tbm_surface_map(tbm_surface, TBM_SURF_OPTION_READ, &info);
1303 if (err != TBM_SURFACE_ERROR_NONE) {
1304 TBM_LOG_E("tbm_surface_map fail\n");
1305 tbm_surface_destroy(tbm_surface);
1310 buffer_size = info.planes[0].stride * h;
1311 tbm_surface_unmap(tbm_surface);
1312 tbm_surface_destroy(tbm_surface);
1314 /* create dump lists */
1315 for (i = 0; i < count; i++) {
1316 buf_info = calloc(1, sizeof(tbm_surface_dump_buf_info));
1317 TBM_GOTO_VAL_IF_FAIL(buf_info, fail);
1318 bo = tbm_bo_alloc(g_surface_bufmgr, buffer_size, TBM_BO_DEFAULT);
1324 buf_info->index = i;
1326 buf_info->size = buffer_size;
1328 LIST_ADDTAIL(&buf_info->link, &g_dump_info->surface_list);
1331 g_dump_info->path = path;
1332 g_dump_info->link = &g_dump_info->surface_list;
1334 TBM_LOG_I("Dump Start.. path:%s, count:%d\n", g_dump_info->path, count);
1338 /* free resources */
1339 if (!LIST_IS_EMPTY(&g_dump_info->surface_list)) {
1340 LIST_FOR_EACH_ENTRY_SAFE(buf_info, tmp, &g_dump_info->surface_list, link) {
1341 tbm_bo_unref(buf_info->bo);
1346 TBM_LOG_E("Dump Start fail.. path:%s\n", g_dump_info->path);
1355 tbm_surface_internal_dump_end(void)
1357 tbm_surface_dump_buf_info *buf_info, *tmp;
1358 tbm_bo_handle bo_handle;
1364 if (!LIST_IS_EMPTY(&g_dump_info->surface_list)) {
1365 LIST_FOR_EACH_ENTRY_SAFE(buf_info, tmp, &g_dump_info->surface_list, link) {
1368 if (buf_info->dirty) {
1372 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_READ);
1373 if (bo_handle.ptr == NULL)
1376 snprintf(file, sizeof(file), "%s/%s", g_dump_info->path, buf_info->name);
1377 TBM_LOG_I("Dump File.. %s generated.\n", file);
1379 switch (buf_info->info.format) {
1380 case TBM_FORMAT_ARGB8888:
1381 case TBM_FORMAT_XRGB8888:
1382 _tbm_surface_internal_dump_file_png(file, bo_handle.ptr,
1383 buf_info->info.planes[0].stride >> 2, buf_info->info.height);
1385 case TBM_FORMAT_YVU420:
1386 case TBM_FORMAT_YUV420:
1387 ptr1 = bo_handle.ptr + buf_info->info.planes[0].stride * buf_info->info.height;
1388 ptr2 = ptr1 + buf_info->info.planes[1].stride * (buf_info->info.height >> 1);
1389 _tbm_surface_internal_dump_file_raw(file, bo_handle.ptr,
1390 buf_info->info.planes[0].stride * buf_info->info.height,
1392 buf_info->info.planes[1].stride * (buf_info->info.height >> 1),
1394 buf_info->info.planes[2].stride * (buf_info->info.height >> 1));
1396 case TBM_FORMAT_NV12:
1397 case TBM_FORMAT_NV21:
1398 ptr1 = bo_handle.ptr + buf_info->info.planes[0].stride * buf_info->info.height;
1399 _tbm_surface_internal_dump_file_raw(file, bo_handle.ptr,
1400 buf_info->info.planes[0].stride * buf_info->info.height,
1402 buf_info->info.planes[1].stride * (buf_info->info.height >> 1),
1405 case TBM_FORMAT_YUYV:
1406 case TBM_FORMAT_UYVY:
1407 _tbm_surface_internal_dump_file_raw(file, bo_handle.ptr,
1408 buf_info->info.planes[0].stride * buf_info->info.height,
1412 TBM_LOG_E("can't dump %c%c%c%c buffer", FOURCC_STR(buf_info->info.format));
1413 tbm_bo_unmap(buf_info->bo);
1417 tbm_bo_unmap(buf_info->bo);
1418 } else if (buf_info->dirty_shm) {
1419 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_READ);
1420 if (bo_handle.ptr == NULL)
1423 snprintf(file, sizeof(file), "%s/%s", g_dump_info->path, buf_info->name);
1424 TBM_LOG_I("Dump File.. %s generated.\n", file);
1426 _tbm_surface_internal_dump_file_png(file, bo_handle.ptr,
1427 buf_info->shm_stride >> 2, buf_info->shm_h);
1429 tbm_bo_unmap(buf_info->bo);
1435 /* free resources */
1436 if (!LIST_IS_EMPTY(&g_dump_info->surface_list)) {
1437 LIST_FOR_EACH_ENTRY_SAFE(buf_info, tmp, &g_dump_info->surface_list, link) {
1438 tbm_bo_unref(buf_info->bo);
1446 TBM_LOG_I("Dump End..\n");
1450 tbm_surface_internal_dump_buffer(tbm_surface_h surface, const char *type)
1452 TBM_RETURN_IF_FAIL(surface != NULL);
1453 TBM_RETURN_IF_FAIL(type != NULL);
1455 tbm_surface_dump_buf_info *buf_info;
1456 tbm_surface_info_s info;
1457 struct list_head *next_link;
1458 tbm_bo_handle bo_handle;
1460 const char *postfix;
1465 next_link = g_dump_info->link->next;
1466 TBM_RETURN_IF_FAIL(next_link != NULL);
1468 if (next_link == &g_dump_info->surface_list) {
1469 next_link = next_link->next;
1470 TBM_RETURN_IF_FAIL(next_link != NULL);
1473 buf_info = LIST_ENTRY(tbm_surface_dump_buf_info, next_link, link);
1474 TBM_RETURN_IF_FAIL(buf_info != NULL);
1476 ret = tbm_surface_map(surface, TBM_SURF_OPTION_READ|TBM_SURF_OPTION_WRITE, &info);
1477 TBM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE);
1479 if (info.size > buf_info->size) {
1480 TBM_LOG_W("Dump skip. surface over created buffer size(%d, %d)\n", info.size, buf_info->size);
1481 tbm_surface_unmap(surface);
1485 if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888)
1486 postfix = dump_postfix[0];
1488 postfix = dump_postfix[1];
1490 /* make the file information */
1491 memcpy(&buf_info->info, &info, sizeof(tbm_surface_info_s));
1494 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE);
1495 TBM_RETURN_IF_FAIL(bo_handle.ptr != NULL);
1496 memset(bo_handle.ptr, 0x00, buf_info->size);
1498 switch (info.format) {
1499 case TBM_FORMAT_ARGB8888:
1500 case TBM_FORMAT_XRGB8888:
1501 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s.%s", g_dump_info->count++, type, postfix);
1502 memcpy(bo_handle.ptr, info.planes[0].ptr, info.size);
1504 case TBM_FORMAT_YVU420:
1505 case TBM_FORMAT_YUV420:
1506 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s_%dx%d_%c%c%c%c.%s",
1507 g_dump_info->count++, type, info.planes[0].stride, info.height, FOURCC_STR(info.format), postfix);
1508 memcpy(bo_handle.ptr, info.planes[0].ptr, info.planes[0].stride * info.height);
1509 bo_handle.ptr += info.planes[0].stride * info.height;
1510 memcpy(bo_handle.ptr, info.planes[1].ptr, info.planes[1].stride * (info.height >> 1));
1511 bo_handle.ptr += info.planes[1].stride * (info.height >> 1);
1512 memcpy(bo_handle.ptr, info.planes[2].ptr, info.planes[2].stride * (info.height >> 1));
1514 case TBM_FORMAT_NV12:
1515 case TBM_FORMAT_NV21:
1516 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s_%dx%d_%c%c%c%c.%s",
1517 g_dump_info->count++, type, info.planes[0].stride, info.height, FOURCC_STR(info.format), postfix);
1518 memcpy(bo_handle.ptr, info.planes[0].ptr, info.planes[0].stride * info.height);
1519 bo_handle.ptr += info.planes[0].stride * info.height;
1520 memcpy(bo_handle.ptr, info.planes[1].ptr, info.planes[1].stride * (info.height >> 1));
1522 case TBM_FORMAT_YUYV:
1523 case TBM_FORMAT_UYVY:
1524 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s_%dx%d_%c%c%c%c.%s",
1525 g_dump_info->count++, type, info.planes[0].stride, info.height, FOURCC_STR(info.format), postfix);
1526 memcpy(bo_handle.ptr, info.planes[0].ptr, info.planes[0].stride * info.height);
1529 TBM_LOG_E("can't copy %c%c%c%c buffer", FOURCC_STR(info.format));
1530 tbm_bo_unmap(buf_info->bo);
1534 tbm_bo_unmap(buf_info->bo);
1536 tbm_surface_unmap(surface);
1538 buf_info->dirty = 1;
1539 buf_info->dirty_shm = 0;
1541 if (g_dump_info->count == 1000)
1542 g_dump_info->count = 0;
1544 g_dump_info->link = next_link;
1546 TBM_LOG_I("Dump %s \n", buf_info->name);
1549 void tbm_surface_internal_dump_shm_buffer(void *ptr, int w, int h, int stride, const char *type)
1551 TBM_RETURN_IF_FAIL(ptr != NULL);
1552 TBM_RETURN_IF_FAIL(w > 0);
1553 TBM_RETURN_IF_FAIL(h > 0);
1554 TBM_RETURN_IF_FAIL(stride > 0);
1555 TBM_RETURN_IF_FAIL(type != NULL);
1557 tbm_surface_dump_buf_info *buf_info;
1558 struct list_head *next_link;
1559 tbm_bo_handle bo_handle;
1564 next_link = g_dump_info->link->next;
1565 TBM_RETURN_IF_FAIL(next_link != NULL);
1567 if (next_link == &g_dump_info->surface_list) {
1568 next_link = next_link->next;
1569 TBM_RETURN_IF_FAIL(next_link != NULL);
1572 buf_info = LIST_ENTRY(tbm_surface_dump_buf_info, next_link, link);
1573 TBM_RETURN_IF_FAIL(buf_info != NULL);
1575 if (stride * h > buf_info->size) {
1576 TBM_LOG_W("Dump skip. shm buffer over created buffer size(%d, %d)\n", stride * h, buf_info->size);
1581 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE);
1582 TBM_RETURN_IF_FAIL(bo_handle.ptr != NULL);
1583 memset(bo_handle.ptr, 0x00, buf_info->size);
1584 memset(&buf_info->info, 0x00, sizeof(tbm_surface_info_s));
1587 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s.%s", g_dump_info->count++, type, dump_postfix[0]);
1588 memcpy(bo_handle.ptr, ptr, stride * h);
1590 tbm_bo_unmap(buf_info->bo);
1592 buf_info->dirty = 0;
1593 buf_info->dirty_shm = 1;
1594 buf_info->shm_stride = stride;
1595 buf_info->shm_h = h;
1597 if (g_dump_info->count == 1000)
1598 g_dump_info->count = 0;
1600 g_dump_info->link = next_link;
1602 TBM_LOG_I("Dump %s \n", buf_info->name);