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;
49 _tbm_surface_internal_format_to_str(tbm_format format)
53 return "TBM_FORMAT_C8";
54 case TBM_FORMAT_RGB332:
55 return "TBM_FORMAT_RGB332";
56 case TBM_FORMAT_BGR233:
57 return "TBM_FORMAT_BGR233";
58 case TBM_FORMAT_XRGB4444:
59 return "TBM_FORMAT_XRGB4444";
60 case TBM_FORMAT_XBGR4444:
61 return "TBM_FORMAT_XBGR4444";
62 case TBM_FORMAT_RGBX4444:
63 return "TBM_FORMAT_RGBX4444";
64 case TBM_FORMAT_BGRX4444:
65 return "TBM_FORMAT_BGRX4444";
66 case TBM_FORMAT_ARGB4444:
67 return "TBM_FORMAT_ARGB4444";
68 case TBM_FORMAT_ABGR4444:
69 return "TBM_FORMAT_ABGR4444";
70 case TBM_FORMAT_RGBA4444:
71 return "TBM_FORMAT_RGBA4444";
72 case TBM_FORMAT_BGRA4444:
73 return "TBM_FORMAT_BGRA4444";
74 case TBM_FORMAT_XRGB1555:
75 return "TBM_FORMAT_XRGB1555";
76 case TBM_FORMAT_XBGR1555:
77 return "TBM_FORMAT_XBGR1555";
78 case TBM_FORMAT_RGBX5551:
79 return "TBM_FORMAT_RGBX5551";
80 case TBM_FORMAT_BGRX5551:
81 return "TBM_FORMAT_BGRX5551";
82 case TBM_FORMAT_ARGB1555:
83 return "TBM_FORMAT_ARGB1555";
84 case TBM_FORMAT_ABGR1555:
85 return "TBM_FORMAT_ABGR1555";
86 case TBM_FORMAT_RGBA5551:
87 return "TBM_FORMAT_RGBA5551";
88 case TBM_FORMAT_BGRA5551:
89 return "TBM_FORMAT_BGRA5551";
90 case TBM_FORMAT_RGB565:
91 return "TBM_FORMAT_RGB565";
92 case TBM_FORMAT_BGR565:
93 return "TBM_FORMAT_BGR565";
94 case TBM_FORMAT_RGB888:
95 return "TBM_FORMAT_RGB888";
96 case TBM_FORMAT_BGR888:
97 return "TBM_FORMAT_BGR888";
98 case TBM_FORMAT_XRGB8888:
99 return "TBM_FORMAT_XRGB8888";
100 case TBM_FORMAT_XBGR8888:
101 return "TBM_FORMAT_XBGR8888";
102 case TBM_FORMAT_RGBX8888:
103 return "TBM_FORMAT_RGBX8888";
104 case TBM_FORMAT_BGRX8888:
105 return "TBM_FORMAT_BGRX8888";
106 case TBM_FORMAT_ARGB8888:
107 return "TBM_FORMAT_ARGB8888";
108 case TBM_FORMAT_ABGR8888:
109 return "TBM_FORMAT_ABGR8888";
110 case TBM_FORMAT_RGBA8888:
111 return "TBM_FORMAT_RGBA8888";
112 case TBM_FORMAT_BGRA8888:
113 return "TBM_FORMAT_BGRA8888";
114 case TBM_FORMAT_XRGB2101010:
115 return "TBM_FORMAT_XRGB2101010";
116 case TBM_FORMAT_XBGR2101010:
117 return "TBM_FORMAT_XBGR2101010";
118 case TBM_FORMAT_RGBX1010102:
119 return "TBM_FORMAT_RGBX1010102";
120 case TBM_FORMAT_BGRX1010102:
121 return "TBM_FORMAT_BGRX1010102";
122 case TBM_FORMAT_ARGB2101010:
123 return "TBM_FORMAT_ARGB2101010";
124 case TBM_FORMAT_ABGR2101010:
125 return "TBM_FORMAT_ABGR2101010";
126 case TBM_FORMAT_RGBA1010102:
127 return "TBM_FORMAT_RGBA1010102";
128 case TBM_FORMAT_BGRA1010102:
129 return "TBM_FORMAT_BGRA1010102";
130 case TBM_FORMAT_YUYV:
131 return "TBM_FORMAT_YUYV";
132 case TBM_FORMAT_YVYU:
133 return "TBM_FORMAT_YVYU";
134 case TBM_FORMAT_UYVY:
135 return "TBM_FORMAT_UYVY";
136 case TBM_FORMAT_VYUY:
137 return "TBM_FORMAT_VYUY";
138 case TBM_FORMAT_AYUV:
139 return "TBM_FORMAT_AYUV";
140 case TBM_FORMAT_NV12:
141 return "TBM_FORMAT_NV12";
142 case TBM_FORMAT_NV21:
143 return "TBM_FORMAT_NV21";
144 case TBM_FORMAT_NV16:
145 return "TBM_FORMAT_NV16";
146 case TBM_FORMAT_NV61:
147 return "TBM_FORMAT_NV61";
148 case TBM_FORMAT_YUV410:
149 return "TBM_FORMAT_YUV410";
150 case TBM_FORMAT_YVU410:
151 return "TBM_FORMAT_YVU410";
152 case TBM_FORMAT_YUV411:
153 return "TBM_FORMAT_YUV411";
154 case TBM_FORMAT_YVU411:
155 return "TBM_FORMAT_YVU411";
156 case TBM_FORMAT_YUV420:
157 return "TBM_FORMAT_YUV420";
158 case TBM_FORMAT_YVU420:
159 return "TBM_FORMAT_YVU420";
160 case TBM_FORMAT_YUV422:
161 return "TBM_FORMAT_YUV422";
162 case TBM_FORMAT_YVU422:
163 return "TBM_FORMAT_YVU422";
164 case TBM_FORMAT_YUV444:
165 return "TBM_FORMAT_YUV444";
166 case TBM_FORMAT_YVU444:
167 return "TBM_FORMAT_YVU444";
168 case TBM_FORMAT_NV12MT:
169 return "TBM_FORMAT_NV12MT";
176 _tbm_surface_mutex_init(void)
178 static bool tbm_surface_mutex_init = false;
180 if (tbm_surface_mutex_init)
183 if (pthread_mutex_init(&tbm_surface_lock, NULL)) {
184 TBM_LOG("[libtbm] fail: tbm_surface mutex init\n");
188 tbm_surface_mutex_init = true;
194 _tbm_surface_mutex_lock(void)
196 if (!_tbm_surface_mutex_init())
199 pthread_mutex_lock(&tbm_surface_lock);
203 _tbm_surface_mutex_unlock(void)
205 pthread_mutex_unlock(&tbm_surface_lock);
209 _init_surface_bufmgr(void)
211 g_surface_bufmgr = tbm_bufmgr_init(-1);
215 _deinit_surface_bufmgr(void)
217 if (!g_surface_bufmgr)
220 tbm_bufmgr_deinit(g_surface_bufmgr);
221 g_surface_bufmgr = NULL;
225 _tbm_surface_internal_query_plane_data(tbm_surface_h surface,
226 int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
228 TBM_RETURN_VAL_IF_FAIL(surface, 0);
229 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
231 struct _tbm_surface *surf = (struct _tbm_surface *)surface;
232 struct _tbm_bufmgr *mgr = surf->bufmgr;
235 TBM_RETURN_VAL_IF_FAIL(mgr != NULL, 0);
236 TBM_RETURN_VAL_IF_FAIL(surf->info.width > 0, 0);
237 TBM_RETURN_VAL_IF_FAIL(surf->info.height > 0, 0);
238 TBM_RETURN_VAL_IF_FAIL(surf->info.format > 0, 0);
240 if (!mgr->backend->surface_get_plane_data)
243 ret = mgr->backend->surface_get_plane_data(surf->info.width,
244 surf->info.height, surf->info.format, plane_idx, size, offset, pitch, bo_idx);
252 _tbm_surface_internal_destroy(tbm_surface_h surface)
255 tbm_bufmgr bufmgr = surface->bufmgr;
256 tbm_user_data *old_data = NULL, *tmp = NULL;
258 for (i = 0; i < surface->num_bos; i++) {
259 surface->bos[i]->surface = NULL;
261 tbm_bo_unref(surface->bos[i]);
262 surface->bos[i] = NULL;
265 /* destory the user_data_list */
266 if (!LIST_IS_EMPTY(&surface->user_data_list)) {
267 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp, &surface->user_data_list, item_link) {
268 TBM_LOG("[tbm_surface:%d] free user_data\n",
270 user_data_delete(old_data);
274 LIST_DEL(&surface->item_link);
279 if (LIST_IS_EMPTY(&bufmgr->surf_list)) {
280 LIST_DELINIT(&bufmgr->surf_list);
281 _deinit_surface_bufmgr();
286 tbm_surface_internal_is_valid(tbm_surface_h surface)
288 tbm_surface_h old_data = NULL, tmp = NULL;
290 if (surface == NULL || g_surface_bufmgr == NULL)
293 if (!LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
294 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp, &g_surface_bufmgr->surf_list, item_link) {
295 if (old_data == surface)
303 tbm_surface_internal_query_supported_formats(uint32_t **formats,
306 struct _tbm_bufmgr *mgr;
309 _tbm_surface_mutex_lock();
311 if (!g_surface_bufmgr) {
312 _init_surface_bufmgr();
313 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
316 mgr = g_surface_bufmgr;
318 if (!mgr->backend->surface_supported_format) {
319 _tbm_surface_mutex_unlock();
323 ret = mgr->backend->surface_supported_format(formats, num);
325 _tbm_surface_mutex_unlock();
331 tbm_surface_internal_get_num_planes(tbm_format format)
337 case TBM_FORMAT_RGB332:
338 case TBM_FORMAT_BGR233:
339 case TBM_FORMAT_XRGB4444:
340 case TBM_FORMAT_XBGR4444:
341 case TBM_FORMAT_RGBX4444:
342 case TBM_FORMAT_BGRX4444:
343 case TBM_FORMAT_ARGB4444:
344 case TBM_FORMAT_ABGR4444:
345 case TBM_FORMAT_RGBA4444:
346 case TBM_FORMAT_BGRA4444:
347 case TBM_FORMAT_XRGB1555:
348 case TBM_FORMAT_XBGR1555:
349 case TBM_FORMAT_RGBX5551:
350 case TBM_FORMAT_BGRX5551:
351 case TBM_FORMAT_ARGB1555:
352 case TBM_FORMAT_ABGR1555:
353 case TBM_FORMAT_RGBA5551:
354 case TBM_FORMAT_BGRA5551:
355 case TBM_FORMAT_RGB565:
356 case TBM_FORMAT_BGR565:
357 case TBM_FORMAT_RGB888:
358 case TBM_FORMAT_BGR888:
359 case TBM_FORMAT_XRGB8888:
360 case TBM_FORMAT_XBGR8888:
361 case TBM_FORMAT_RGBX8888:
362 case TBM_FORMAT_BGRX8888:
363 case TBM_FORMAT_ARGB8888:
364 case TBM_FORMAT_ABGR8888:
365 case TBM_FORMAT_RGBA8888:
366 case TBM_FORMAT_BGRA8888:
367 case TBM_FORMAT_XRGB2101010:
368 case TBM_FORMAT_XBGR2101010:
369 case TBM_FORMAT_RGBX1010102:
370 case TBM_FORMAT_BGRX1010102:
371 case TBM_FORMAT_ARGB2101010:
372 case TBM_FORMAT_ABGR2101010:
373 case TBM_FORMAT_RGBA1010102:
374 case TBM_FORMAT_BGRA1010102:
375 case TBM_FORMAT_YUYV:
376 case TBM_FORMAT_YVYU:
377 case TBM_FORMAT_UYVY:
378 case TBM_FORMAT_VYUY:
379 case TBM_FORMAT_AYUV:
382 case TBM_FORMAT_NV12:
383 case TBM_FORMAT_NV12MT:
384 case TBM_FORMAT_NV21:
385 case TBM_FORMAT_NV16:
386 case TBM_FORMAT_NV61:
389 case TBM_FORMAT_YUV410:
390 case TBM_FORMAT_YVU410:
391 case TBM_FORMAT_YUV411:
392 case TBM_FORMAT_YVU411:
393 case TBM_FORMAT_YUV420:
394 case TBM_FORMAT_YVU420:
395 case TBM_FORMAT_YUV422:
396 case TBM_FORMAT_YVU422:
397 case TBM_FORMAT_YUV444:
398 case TBM_FORMAT_YVU444:
410 tbm_surface_internal_get_bpp(tbm_format format)
416 case TBM_FORMAT_RGB332:
417 case TBM_FORMAT_BGR233:
420 case TBM_FORMAT_XRGB4444:
421 case TBM_FORMAT_XBGR4444:
422 case TBM_FORMAT_RGBX4444:
423 case TBM_FORMAT_BGRX4444:
424 case TBM_FORMAT_ARGB4444:
425 case TBM_FORMAT_ABGR4444:
426 case TBM_FORMAT_RGBA4444:
427 case TBM_FORMAT_BGRA4444:
428 case TBM_FORMAT_XRGB1555:
429 case TBM_FORMAT_XBGR1555:
430 case TBM_FORMAT_RGBX5551:
431 case TBM_FORMAT_BGRX5551:
432 case TBM_FORMAT_ARGB1555:
433 case TBM_FORMAT_ABGR1555:
434 case TBM_FORMAT_RGBA5551:
435 case TBM_FORMAT_BGRA5551:
436 case TBM_FORMAT_RGB565:
437 case TBM_FORMAT_BGR565:
440 case TBM_FORMAT_RGB888:
441 case TBM_FORMAT_BGR888:
444 case TBM_FORMAT_XRGB8888:
445 case TBM_FORMAT_XBGR8888:
446 case TBM_FORMAT_RGBX8888:
447 case TBM_FORMAT_BGRX8888:
448 case TBM_FORMAT_ARGB8888:
449 case TBM_FORMAT_ABGR8888:
450 case TBM_FORMAT_RGBA8888:
451 case TBM_FORMAT_BGRA8888:
452 case TBM_FORMAT_XRGB2101010:
453 case TBM_FORMAT_XBGR2101010:
454 case TBM_FORMAT_RGBX1010102:
455 case TBM_FORMAT_BGRX1010102:
456 case TBM_FORMAT_ARGB2101010:
457 case TBM_FORMAT_ABGR2101010:
458 case TBM_FORMAT_RGBA1010102:
459 case TBM_FORMAT_BGRA1010102:
460 case TBM_FORMAT_YUYV:
461 case TBM_FORMAT_YVYU:
462 case TBM_FORMAT_UYVY:
463 case TBM_FORMAT_VYUY:
464 case TBM_FORMAT_AYUV:
467 case TBM_FORMAT_NV12:
468 case TBM_FORMAT_NV12MT:
469 case TBM_FORMAT_NV21:
472 case TBM_FORMAT_NV16:
473 case TBM_FORMAT_NV61:
476 case TBM_FORMAT_YUV410:
477 case TBM_FORMAT_YVU410:
480 case TBM_FORMAT_YUV411:
481 case TBM_FORMAT_YVU411:
482 case TBM_FORMAT_YUV420:
483 case TBM_FORMAT_YVU420:
486 case TBM_FORMAT_YUV422:
487 case TBM_FORMAT_YVU422:
490 case TBM_FORMAT_YUV444:
491 case TBM_FORMAT_YVU444:
502 tbm_surface_internal_create_with_flags(int width, int height,
503 int format, int flags)
505 TBM_RETURN_VAL_IF_FAIL(width > 0, NULL);
506 TBM_RETURN_VAL_IF_FAIL(height > 0, NULL);
508 struct _tbm_bufmgr *mgr;
509 struct _tbm_surface *surf = NULL;
513 uint32_t bo_size = 0;
517 _tbm_surface_mutex_lock();
519 if (!g_surface_bufmgr) {
520 _init_surface_bufmgr();
521 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
524 mgr = g_surface_bufmgr;
525 if (!TBM_BUFMGR_IS_VALID(mgr)) {
526 _tbm_surface_mutex_unlock();
529 surf = calloc(1, sizeof(struct _tbm_surface));
531 _tbm_surface_mutex_unlock();
536 surf->info.width = width;
537 surf->info.height = height;
538 surf->info.format = format;
539 surf->info.bpp = tbm_surface_internal_get_bpp(format);
540 surf->info.num_planes = tbm_surface_internal_get_num_planes(format);
543 /* get size, stride and offset bo_idx */
544 for (i = 0; i < surf->info.num_planes; i++) {
545 _tbm_surface_internal_query_plane_data(surf, i, &size, &offset, &stride,
547 surf->info.planes[i].size = size;
548 surf->info.planes[i].offset = offset;
549 surf->info.planes[i].stride = stride;
550 surf->planes_bo_idx[i] = bo_idx;
555 for (i = 0; i < surf->info.num_planes; i++) {
556 surf->info.size += surf->info.planes[i].size;
558 if (surf->num_bos -1 > surf->planes_bo_idx[i])
559 surf->num_bos = surf->planes_bo_idx[i]++;
564 for (i = 0; i < surf->num_bos; i++) {
566 for (j = 0; j < surf->info.num_planes; j++) {
567 if (surf->planes_bo_idx[j] == i)
568 bo_size += surf->info.planes[j].size;
571 if (mgr->backend->surface_bo_alloc) {
574 void *bo_priv = NULL;
576 bo = calloc(1, sizeof(struct _tbm_bo));
578 TBM_LOG("[libtbm:%d] "
579 "error %s:%d fail to alloc bo struct\n",
580 getpid(), __func__, __LINE__);
584 bo->bufmgr = surf->bufmgr;
586 pthread_mutex_lock(&surf->bufmgr->lock);
588 bo_priv = mgr->backend->surface_bo_alloc (bo, width, height, format, flags, i);
590 TBM_LOG("[libtbm:%d] "
591 "error %s:%d fail to alloc bo priv\n",
592 getpid(), __func__, __LINE__);
594 pthread_mutex_unlock(&surf->bufmgr->lock);
602 LIST_INITHEAD(&bo->user_data_list);
604 LIST_ADD(&bo->item_link, &surf->bufmgr->bo_list);
606 pthread_mutex_unlock(&surf->bufmgr->lock);
611 surf->bos[i] = tbm_bo_alloc(mgr, bo_size, flags);
615 TBM_LOG("[libtbm:%d] "
616 "error %s:%d fail to alloc bo\n",
617 getpid(), __func__, __LINE__);
621 _tbm_bo_set_surface(surf->bos[i], surf);
625 LIST_INITHEAD(&surf->user_data_list);
627 LIST_ADD(&surf->item_link, &mgr->surf_list);
629 _tbm_surface_mutex_unlock();
634 for (j = 0; j < i; j++) {
636 tbm_bo_unref(surf->bos[j]);
642 if (LIST_IS_EMPTY(&mgr->surf_list)) {
643 LIST_DELINIT(&mgr->surf_list);
644 _deinit_surface_bufmgr();
647 _tbm_surface_mutex_unlock();
652 tbm_surface_internal_create_with_bos(tbm_surface_info_s *info,
653 tbm_bo *bos, int num)
655 TBM_RETURN_VAL_IF_FAIL(bos, NULL);
656 TBM_RETURN_VAL_IF_FAIL(info, NULL);
657 TBM_RETURN_VAL_IF_FAIL(num == 1 || info->num_planes == num, NULL);
659 struct _tbm_bufmgr *mgr;
660 struct _tbm_surface *surf = NULL;
663 _tbm_surface_mutex_lock();
665 if (!g_surface_bufmgr) {
666 _init_surface_bufmgr();
667 LIST_INITHEAD(&g_surface_bufmgr->surf_list);
670 mgr = g_surface_bufmgr;
671 if (!TBM_BUFMGR_IS_VALID(mgr)) {
672 _tbm_surface_mutex_unlock();
676 surf = calloc(1, sizeof(struct _tbm_surface));
678 _tbm_surface_mutex_unlock();
683 surf->info.width = info->width;
684 surf->info.height = info->height;
685 surf->info.format = info->format;
686 surf->info.bpp = info->bpp;
687 surf->info.num_planes = info->num_planes;
690 /* get size, stride and offset */
691 for (i = 0; i < info->num_planes; i++) {
692 surf->info.planes[i].offset = info->planes[i].offset;
693 surf->info.planes[i].stride = info->planes[i].stride;
695 if (info->planes[i].size > 0)
696 surf->info.planes[i].size = info->planes[i].size;
698 surf->info.planes[i].size += surf->info.planes[i].stride * info->height;
701 surf->planes_bo_idx[i] = 0;
703 surf->planes_bo_idx[i] = i;
706 if (info->size > 0) {
707 surf->info.size = info->size;
710 for (i = 0; i < info->num_planes; i++)
711 surf->info.size += surf->info.planes[i].size;
714 surf->flags = TBM_BO_DEFAULT;
716 /* create only one bo */
718 for (i = 0; i < num; i++) {
722 surf->bos[i] = tbm_bo_ref(bos[i]);
723 _tbm_bo_set_surface(bos[i], surf);
726 LIST_INITHEAD(&surf->user_data_list);
728 LIST_ADD(&surf->item_link, &mgr->surf_list);
730 _tbm_surface_mutex_unlock();
734 for (i = 0; i < num; i++) {
736 tbm_bo_unref(surf->bos[i]);
744 if (LIST_IS_EMPTY(&g_surface_bufmgr->surf_list)) {
745 LIST_DELINIT(&g_surface_bufmgr->surf_list);
746 _deinit_surface_bufmgr();
749 _tbm_surface_mutex_unlock();
755 tbm_surface_internal_destroy(tbm_surface_h surface)
757 if (!tbm_surface_internal_is_valid(surface))
760 _tbm_surface_mutex_lock();
764 if (surface->refcnt > 0) {
765 _tbm_surface_mutex_unlock();
769 if (surface->refcnt == 0)
770 _tbm_surface_internal_destroy(surface);
772 _tbm_surface_mutex_unlock();
776 tbm_surface_internal_ref(tbm_surface_h surface)
778 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
780 _tbm_surface_mutex_lock();
784 _tbm_surface_mutex_unlock();
788 tbm_surface_internal_unref(tbm_surface_h surface)
790 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
792 _tbm_surface_mutex_lock();
796 if (surface->refcnt > 0) {
797 _tbm_surface_mutex_unlock();
801 if (surface->refcnt == 0)
802 _tbm_surface_internal_destroy(surface);
804 _tbm_surface_mutex_unlock();
808 tbm_surface_internal_get_num_bos(tbm_surface_h surface)
810 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
812 struct _tbm_surface *surf;
815 _tbm_surface_mutex_lock();
817 surf = (struct _tbm_surface *)surface;
820 _tbm_surface_mutex_unlock();
826 tbm_surface_internal_get_bo(tbm_surface_h surface, int bo_idx)
828 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), NULL);
829 TBM_RETURN_VAL_IF_FAIL(bo_idx > -1, NULL);
831 struct _tbm_surface *surf;
834 _tbm_surface_mutex_lock();
836 surf = (struct _tbm_surface *)surface;
837 bo = surf->bos[bo_idx];
839 _tbm_surface_mutex_unlock();
845 tbm_surface_internal_get_size(tbm_surface_h surface)
847 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
849 struct _tbm_surface *surf;
852 _tbm_surface_mutex_lock();
854 surf = (struct _tbm_surface *)surface;
855 size = surf->info.size;
857 _tbm_surface_mutex_unlock();
863 tbm_surface_internal_get_plane_data(tbm_surface_h surface, int plane_idx,
864 uint32_t *size, uint32_t *offset, uint32_t *pitch)
866 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
867 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
869 struct _tbm_surface *surf;
871 _tbm_surface_mutex_lock();
873 surf = (struct _tbm_surface *)surface;
875 if (plane_idx >= surf->info.num_planes) {
876 _tbm_surface_mutex_unlock();
881 *size = surf->info.planes[plane_idx].size;
884 *offset = surf->info.planes[plane_idx].offset;
887 *pitch = surf->info.planes[plane_idx].stride;
889 _tbm_surface_mutex_unlock();
895 tbm_surface_internal_get_info(tbm_surface_h surface, int opt,
896 tbm_surface_info_s *info, int map)
898 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
900 struct _tbm_surface *surf;
901 tbm_bo_handle bo_handles[4];
904 _tbm_surface_mutex_lock();
906 memset(bo_handles, 0, sizeof(tbm_bo_handle) * 4);
908 surf = (struct _tbm_surface *)surface;
910 memset(info, 0x00, sizeof(tbm_surface_info_s));
911 info->width = surf->info.width;
912 info->height = surf->info.height;
913 info->format = surf->info.format;
914 info->bpp = surf->info.bpp;
915 info->size = surf->info.size;
916 info->num_planes = surf->info.num_planes;
919 for (i = 0; i < surf->num_bos; i++) {
920 bo_handles[i] = tbm_bo_map(surf->bos[i], TBM_DEVICE_CPU, opt);
921 if (bo_handles[i].ptr == NULL) {
922 for (j = 0; j < i; j++)
923 tbm_bo_unmap(surf->bos[j]);
925 _tbm_surface_mutex_unlock();
930 for (i = 0; i < surf->num_bos; i++)
931 bo_handles[i] = tbm_bo_get_handle(surf->bos[i], TBM_DEVICE_CPU);
934 for (i = 0; i < surf->info.num_planes; i++) {
935 info->planes[i].size = surf->info.planes[i].size;
936 info->planes[i].offset = surf->info.planes[i].offset;
937 info->planes[i].stride = surf->info.planes[i].stride;
939 if (bo_handles[surf->planes_bo_idx[i]].ptr)
940 info->planes[i].ptr = bo_handles[surf->planes_bo_idx[i]].ptr +
941 surf->info.planes[i].offset;
944 _tbm_surface_mutex_unlock();
950 tbm_surface_internal_unmap(tbm_surface_h surface)
952 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
954 struct _tbm_surface *surf;
957 _tbm_surface_mutex_lock();
959 surf = (struct _tbm_surface *)surface;
961 for (i = 0; i < surf->num_bos; i++)
962 tbm_bo_unmap(surf->bos[i]);
964 _tbm_surface_mutex_unlock();
968 tbm_surface_internal_get_width(tbm_surface_h surface)
970 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
972 struct _tbm_surface *surf;
975 _tbm_surface_mutex_lock();
977 surf = (struct _tbm_surface *)surface;
978 width = surf->info.width;
980 _tbm_surface_mutex_unlock();
986 tbm_surface_internal_get_height(tbm_surface_h surface)
988 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
990 struct _tbm_surface *surf;
993 _tbm_surface_mutex_lock();
995 surf = (struct _tbm_surface *)surface;
996 height = surf->info.height;
998 _tbm_surface_mutex_unlock();
1005 tbm_surface_internal_get_format(tbm_surface_h surface)
1007 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1009 struct _tbm_surface *surf;
1012 _tbm_surface_mutex_lock();
1014 surf = (struct _tbm_surface *)surface;
1015 format = surf->info.format;
1017 _tbm_surface_mutex_unlock();
1023 tbm_surface_internal_get_plane_bo_idx(tbm_surface_h surface, int plane_idx)
1025 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1026 TBM_RETURN_VAL_IF_FAIL(plane_idx > -1, 0);
1027 struct _tbm_surface *surf;
1030 _tbm_surface_mutex_lock();
1032 surf = (struct _tbm_surface *)surface;
1033 bo_idx = surf->planes_bo_idx[plane_idx];
1035 _tbm_surface_mutex_unlock();
1041 _tbm_surface_internal_get_debug_pid(tbm_surface_h surface)
1043 TBM_RETURN_VAL_IF_FAIL(surface, 0);
1045 return surface->debug_pid;
1049 tbm_surface_internal_set_debug_pid(tbm_surface_h surface, unsigned int pid)
1051 TBM_RETURN_IF_FAIL(tbm_surface_internal_is_valid(surface));
1053 surface->debug_pid = pid;
1057 tbm_surface_internal_add_user_data(tbm_surface_h surface, unsigned long key,
1058 tbm_data_free data_free_func)
1060 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1062 tbm_user_data *data;
1064 /* check if the data according to the key exist if so, return false. */
1065 data = user_data_lookup(&surface->user_data_list, key);
1067 TBM_LOG("[libtbm:%d] "
1068 "waring: %s:%d user data already exist. key:%ld\n",
1069 getpid(), __func__, __LINE__, key);
1073 data = user_data_create(key, data_free_func);
1077 LIST_ADD(&data->item_link, &surface->user_data_list);
1083 tbm_surface_internal_set_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 (LIST_IS_EMPTY(&surface->user_data_list))
1093 old_data = user_data_lookup(&surface->user_data_list, key);
1097 if (old_data->data && old_data->free_func)
1098 old_data->free_func(old_data->data);
1100 old_data->data = data;
1106 tbm_surface_internal_get_user_data(tbm_surface_h surface, unsigned long key,
1109 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1111 tbm_user_data *old_data;
1113 if (!data || LIST_IS_EMPTY(&surface->user_data_list))
1116 old_data = user_data_lookup(&surface->user_data_list, key);
1122 *data = old_data->data;
1128 tbm_surface_internal_delete_user_data(tbm_surface_h surface,
1131 TBM_RETURN_VAL_IF_FAIL(tbm_surface_internal_is_valid(surface), 0);
1133 tbm_user_data *old_data = (void *)0;
1135 if (LIST_IS_EMPTY(&surface->user_data_list))
1138 old_data = user_data_lookup(&surface->user_data_list, key);
1142 user_data_delete(old_data);
1147 typedef struct _tbm_surface_dump_info tbm_surface_dump_info;
1148 typedef struct _tbm_surface_dump_buf_info tbm_surface_dump_buf_info;
1150 struct _tbm_surface_dump_buf_info
1161 tbm_surface_info_s info;
1163 struct list_head link;
1166 struct _tbm_surface_dump_info
1168 char *path; // copy???
1171 struct list_head *link;
1172 struct list_head surface_list; /* link of surface */
1175 static tbm_surface_dump_info *g_dump_info = NULL;
1176 static const char *dump_postfix[2] = {"png", "yuv"};
1179 _tbm_surface_internal_dump_file_raw(const char *file, void *data1, int size1, void *data2,
1180 int size2, void *data3, int size3)
1182 unsigned int *blocks;
1183 FILE *fp = fopen(file, "w+");
1184 TBM_RETURN_IF_FAIL(fp != NULL);
1186 blocks = (unsigned int *)data1;
1187 fwrite(blocks, 1, size1, fp);
1190 blocks = (unsigned int *)data2;
1191 fwrite(blocks, 1, size2, fp);
1195 blocks = (unsigned int *)data3;
1196 fwrite(blocks, 1, size3, fp);
1203 _tbm_surface_internal_dump_file_png(const char *file, const void *data, int width,
1206 FILE *fp = fopen(file, "wb");
1207 TBM_RETURN_IF_FAIL(fp != NULL);
1210 png_structp pPngStruct =
1211 png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
1217 png_infop pPngInfo = png_create_info_struct(pPngStruct);
1219 png_destroy_write_struct(&pPngStruct, NULL);
1224 png_init_io(pPngStruct, fp);
1225 png_set_IHDR(pPngStruct,
1230 PNG_COLOR_TYPE_RGBA,
1232 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
1234 png_set_bgr(pPngStruct);
1235 png_write_info(pPngStruct, pPngInfo);
1237 const int pixel_size = 4; // RGBA
1238 png_bytep *row_pointers =
1239 png_malloc(pPngStruct, height * sizeof(png_byte *));
1241 unsigned int *blocks = (unsigned int *)data;
1245 for (; y < height; ++y) {
1247 png_malloc(pPngStruct, sizeof(png_byte) * width * pixel_size);
1248 row_pointers[y] = (png_bytep)row;
1249 for (x = 0; x < width; ++x) {
1250 unsigned int curBlock = blocks[y * width + x];
1251 row[x * pixel_size] = (curBlock & 0xFF);
1252 row[1 + x * pixel_size] = (curBlock >> 8) & 0xFF;
1253 row[2 + x * pixel_size] = (curBlock >> 16) & 0xFF;
1254 row[3 + x * pixel_size] = (curBlock >> 24) & 0xFF;
1258 png_write_image(pPngStruct, row_pointers);
1259 png_write_end(pPngStruct, pPngInfo);
1261 for (y = 0; y < height; y++)
1262 png_free(pPngStruct, row_pointers[y]);
1263 png_free(pPngStruct, row_pointers);
1265 png_destroy_write_struct(&pPngStruct, &pPngInfo);
1271 tbm_surface_internal_dump_start(char *path, int w, int h, int count)
1273 TBM_RETURN_IF_FAIL(path != NULL);
1274 TBM_RETURN_IF_FAIL(w > 0);
1275 TBM_RETURN_IF_FAIL(h > 0);
1276 TBM_RETURN_IF_FAIL(count > 0);
1278 tbm_surface_dump_buf_info *buf_info = NULL;
1279 tbm_surface_dump_buf_info *tmp;
1283 tbm_surface_h tbm_surface;
1284 tbm_surface_info_s info;
1285 tbm_surface_error_e err;
1289 TBM_LOG("[libtbm:%d] "
1290 "waring: %s:%d already running the tbm_surface_internal_dump.\n",
1291 getpid(), __func__, __LINE__);
1295 g_dump_info = calloc(1, sizeof (struct _tbm_surface_dump_info));
1296 TBM_RETURN_IF_FAIL(g_dump_info);
1298 LIST_INITHEAD(&g_dump_info->surface_list);
1299 g_dump_info->count = 0;
1300 g_dump_info->dump_max = count;
1302 /* get buffer size */
1303 tbm_surface = tbm_surface_create(w, h, TBM_FORMAT_ARGB8888);
1304 if (tbm_surface == NULL) {
1305 TBM_LOG("tbm_surface_create fail\n");
1310 err = tbm_surface_map(tbm_surface, TBM_SURF_OPTION_READ, &info);
1311 if (err != TBM_SURFACE_ERROR_NONE) {
1312 TBM_LOG("tbm_surface_map fail\n");
1313 tbm_surface_destroy(tbm_surface);
1318 buffer_size = info.planes[0].stride * h;
1319 tbm_surface_unmap(tbm_surface);
1320 tbm_surface_destroy(tbm_surface);
1322 /* create dump lists */
1323 for (i = 0; i < count; i++) {
1324 buf_info = calloc(1, sizeof(tbm_surface_dump_buf_info));
1325 TBM_GOTO_VAL_IF_FAIL(buf_info, fail);
1326 bo = tbm_bo_alloc(g_surface_bufmgr, buffer_size, TBM_BO_DEFAULT);
1332 buf_info->index = i;
1334 buf_info->size = buffer_size;
1336 LIST_ADDTAIL(&buf_info->link, &g_dump_info->surface_list);
1339 g_dump_info->path = path;
1340 g_dump_info->link = &g_dump_info->surface_list;
1342 TBM_LOG("Dump Start.. path:%s, count:%d\n", g_dump_info->path, count);
1346 /* free resources */
1347 if (!LIST_IS_EMPTY(&g_dump_info->surface_list)) {
1348 LIST_FOR_EACH_ENTRY_SAFE(buf_info, tmp, &g_dump_info->surface_list, link) {
1349 tbm_bo_unref(buf_info->bo);
1354 TBM_LOG("Dump Start fail.. path:%s\n", g_dump_info->path);
1363 tbm_surface_internal_dump_end(void)
1365 tbm_surface_dump_buf_info *buf_info, *tmp;
1366 tbm_bo_handle bo_handle;
1372 if (!LIST_IS_EMPTY(&g_dump_info->surface_list)) {
1373 LIST_FOR_EACH_ENTRY_SAFE(buf_info, tmp, &g_dump_info->surface_list, link) {
1376 if (buf_info->dirty) {
1380 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_READ);
1381 if (bo_handle.ptr == NULL)
1384 snprintf(file, sizeof(file), "%s/%s", g_dump_info->path, buf_info->name);
1385 TBM_LOG("Dump File.. %s generated.\n", file);
1387 switch (buf_info->info.format) {
1388 case TBM_FORMAT_ARGB8888:
1389 case TBM_FORMAT_XRGB8888:
1390 _tbm_surface_internal_dump_file_png(file, bo_handle.ptr,
1391 buf_info->info.planes[0].stride >> 2, buf_info->info.height);
1393 case TBM_FORMAT_YVU420:
1394 case TBM_FORMAT_YUV420:
1395 ptr1 = bo_handle.ptr + buf_info->info.planes[0].stride * buf_info->info.height;
1396 ptr2 = ptr1 + buf_info->info.planes[1].stride * (buf_info->info.height >> 1);
1397 _tbm_surface_internal_dump_file_raw(file, bo_handle.ptr,
1398 buf_info->info.planes[0].stride * buf_info->info.height,
1400 buf_info->info.planes[1].stride * (buf_info->info.height >> 1),
1402 buf_info->info.planes[2].stride * (buf_info->info.height >> 1));
1404 case TBM_FORMAT_NV12:
1405 case TBM_FORMAT_NV21:
1406 ptr1 = bo_handle.ptr + buf_info->info.planes[0].stride * buf_info->info.height;
1407 _tbm_surface_internal_dump_file_raw(file, bo_handle.ptr,
1408 buf_info->info.planes[0].stride * buf_info->info.height,
1410 buf_info->info.planes[1].stride * (buf_info->info.height >> 1),
1413 case TBM_FORMAT_YUYV:
1414 case TBM_FORMAT_UYVY:
1415 _tbm_surface_internal_dump_file_raw(file, bo_handle.ptr,
1416 buf_info->info.planes[0].stride * buf_info->info.height,
1420 TBM_LOG("can't dump %c%c%c%c buffer", FOURCC_STR(buf_info->info.format));
1421 tbm_bo_unmap(buf_info->bo);
1425 tbm_bo_unmap(buf_info->bo);
1426 } else if (buf_info->dirty_shm) {
1427 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_READ);
1428 if (bo_handle.ptr == NULL)
1431 snprintf(file, sizeof(file), "%s/%s", g_dump_info->path, buf_info->name);
1432 TBM_LOG("Dump File.. %s generated.\n", file);
1434 _tbm_surface_internal_dump_file_png(file, bo_handle.ptr,
1435 buf_info->shm_stride >> 2, buf_info->shm_h);
1437 tbm_bo_unmap(buf_info->bo);
1443 /* free resources */
1444 if (!LIST_IS_EMPTY(&g_dump_info->surface_list)) {
1445 LIST_FOR_EACH_ENTRY_SAFE(buf_info, tmp, &g_dump_info->surface_list, link) {
1446 tbm_bo_unref(buf_info->bo);
1454 TBM_LOG("Dump End..\n");
1458 tbm_surface_internal_dump_buffer(tbm_surface_h surface, const char *type)
1460 TBM_RETURN_IF_FAIL(surface != NULL);
1461 TBM_RETURN_IF_FAIL(type != NULL);
1463 tbm_surface_dump_buf_info *buf_info;
1464 tbm_surface_info_s info;
1465 struct list_head *next_link;
1466 tbm_bo_handle bo_handle;
1468 const char *postfix;
1473 next_link = g_dump_info->link->next;
1474 TBM_RETURN_IF_FAIL(next_link != NULL);
1476 if (next_link == &g_dump_info->surface_list) {
1477 next_link = next_link->next;
1478 TBM_RETURN_IF_FAIL(next_link != NULL);
1481 buf_info = LIST_ENTRY(tbm_surface_dump_buf_info, next_link, link);
1482 TBM_RETURN_IF_FAIL(buf_info != NULL);
1484 ret = tbm_surface_map(surface, TBM_SURF_OPTION_READ|TBM_SURF_OPTION_WRITE, &info);
1485 TBM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE);
1487 if (info.size > buf_info->size) {
1488 TBM_LOG("Dump skip. surface over created buffer size(%d, %d)\n", info.size, buf_info->size);
1489 tbm_surface_unmap(surface);
1493 if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888)
1494 postfix = dump_postfix[0];
1496 postfix = dump_postfix[1];
1498 /* make the file information */
1499 memcpy(&buf_info->info, &info, sizeof(tbm_surface_info_s));
1502 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE);
1503 TBM_RETURN_IF_FAIL(bo_handle.ptr != NULL);
1504 memset(bo_handle.ptr, 0x00, buf_info->size);
1506 switch (info.format) {
1507 case TBM_FORMAT_ARGB8888:
1508 case TBM_FORMAT_XRGB8888:
1509 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s.%s", g_dump_info->count++, type, postfix);
1510 memcpy(bo_handle.ptr, info.planes[0].ptr, info.size);
1512 case TBM_FORMAT_YVU420:
1513 case TBM_FORMAT_YUV420:
1514 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s_%dx%d_%c%c%c%c.%s",
1515 g_dump_info->count++, type, info.planes[0].stride, info.height, FOURCC_STR(info.format), postfix);
1516 memcpy(bo_handle.ptr, info.planes[0].ptr, info.planes[0].stride * info.height);
1517 bo_handle.ptr += info.planes[0].stride * info.height;
1518 memcpy(bo_handle.ptr, info.planes[1].ptr, info.planes[1].stride * (info.height >> 1));
1519 bo_handle.ptr += info.planes[1].stride * (info.height >> 1);
1520 memcpy(bo_handle.ptr, info.planes[2].ptr, info.planes[2].stride * (info.height >> 1));
1522 case TBM_FORMAT_NV12:
1523 case TBM_FORMAT_NV21:
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);
1527 bo_handle.ptr += info.planes[0].stride * info.height;
1528 memcpy(bo_handle.ptr, info.planes[1].ptr, info.planes[1].stride * (info.height >> 1));
1530 case TBM_FORMAT_YUYV:
1531 case TBM_FORMAT_UYVY:
1532 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s_%dx%d_%c%c%c%c.%s",
1533 g_dump_info->count++, type, info.planes[0].stride, info.height, FOURCC_STR(info.format), postfix);
1534 memcpy(bo_handle.ptr, info.planes[0].ptr, info.planes[0].stride * info.height);
1537 TBM_LOG("can't copy %c%c%c%c buffer", FOURCC_STR(info.format));
1538 tbm_bo_unmap(buf_info->bo);
1542 tbm_bo_unmap(buf_info->bo);
1544 tbm_surface_unmap(surface);
1546 buf_info->dirty = 1;
1547 buf_info->dirty_shm = 0;
1549 if (g_dump_info->count == 1000)
1550 g_dump_info->count = 0;
1552 g_dump_info->link = next_link;
1554 TBM_LOG("Dump %s \n", buf_info->name);
1557 void tbm_surface_internal_dump_shm_buffer(void *ptr, int w, int h, int stride, const char *type)
1559 TBM_RETURN_IF_FAIL(ptr != NULL);
1560 TBM_RETURN_IF_FAIL(w > 0);
1561 TBM_RETURN_IF_FAIL(h > 0);
1562 TBM_RETURN_IF_FAIL(stride > 0);
1563 TBM_RETURN_IF_FAIL(type != NULL);
1565 tbm_surface_dump_buf_info *buf_info;
1566 struct list_head *next_link;
1567 tbm_bo_handle bo_handle;
1572 next_link = g_dump_info->link->next;
1573 TBM_RETURN_IF_FAIL(next_link != NULL);
1575 if (next_link == &g_dump_info->surface_list) {
1576 next_link = next_link->next;
1577 TBM_RETURN_IF_FAIL(next_link != NULL);
1580 buf_info = LIST_ENTRY(tbm_surface_dump_buf_info, next_link, link);
1581 TBM_RETURN_IF_FAIL(buf_info != NULL);
1583 if (stride * h > buf_info->size) {
1584 TBM_LOG("Dump skip. shm buffer over created buffer size(%d, %d)\n", stride * h, buf_info->size);
1589 bo_handle = tbm_bo_map(buf_info->bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE);
1590 TBM_RETURN_IF_FAIL(bo_handle.ptr != NULL);
1591 memset(bo_handle.ptr, 0x00, buf_info->size);
1592 memset(&buf_info->info, 0x00, sizeof(tbm_surface_info_s));
1595 snprintf(buf_info->name, sizeof(buf_info->name), "%03d-%s.%s", g_dump_info->count++, type, dump_postfix[0]);
1596 memcpy(bo_handle.ptr, ptr, stride * h);
1598 tbm_bo_unmap(buf_info->bo);
1600 buf_info->dirty = 0;
1601 buf_info->dirty_shm = 1;
1602 buf_info->shm_stride = stride;
1603 buf_info->shm_h = h;
1605 if (g_dump_info->count == 1000)
1606 g_dump_info->count = 0;
1608 g_dump_info->link = next_link;
1610 TBM_LOG("Dump %s \n", buf_info->name);