tbm_bufmgr: add tbm_bufmgr_internal_import_bo_with_fd and use it
[platform/core/uifw/libtbm.git] / src / tbm_bufmgr_int.h
old mode 100755 (executable)
new mode 100644 (file)
index e13535a..7776b3c
-/**************************************************************************\r
-\r
-libtbm\r
-\r
-Copyright 2012 Samsung Electronics co., Ltd. All Rights Reserved.\r
-\r
-Contact: SooChan Lim <sc1.lim@samsung.com>, Sangjin Lee <lsj119@samsung.com>\r
-\r
-Permission is hereby granted, free of charge, to any person obtaining a\r
-copy of this software and associated documentation files (the\r
-"Software"), to deal in the Software without restriction, including\r
-without limitation the rights to use, copy, modify, merge, publish,\r
-distribute, sub license, and/or sell copies of the Software, and to\r
-permit persons to whom the Software is furnished to do so, subject to\r
-the following conditions:\r
-\r
-The above copyright notice and this permission notice (including the\r
-next paragraph) shall be included in all copies or substantial portions\r
-of the Software.\r
-\r
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\r
-IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR\r
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
-\r
-**************************************************************************/\r
-\r
-#ifndef _TBM_BUFMGR_INT_H_\r
-#define _TBM_BUFMGR_INT_H_\r
-\r
-#include <tbm_bufmgr.h>\r
-#include <pthread.h>\r
-#include "tbm_bufmgr_backend.h"\r
-\r
-#define TBM_LOG(...)  fprintf (stderr, __VA_ARGS__)\r
-\r
-typedef union _tbm_bo_cache_state tbm_bo_cache_state;\r
-\r
-struct list_head\r
-{\r
-    struct list_head *prev;\r
-    struct list_head *next;\r
-};\r
-\r
-union _tbm_bo_cache_state\r
-{\r
-    unsigned int val;\r
-    struct {\r
-        unsigned int cntFlush:16;    /*Flush all index for sync*/\r
-        unsigned int isCacheable:1;\r
-        unsigned int isCached:1;\r
-        unsigned int isDirtied:2;\r
-    } data;\r
-};\r
-\r
-/**\r
- * @brief tbm buffer object\r
- *  buffer object of Tizen Buffer Manager\r
- */\r
-struct _tbm_bo\r
-{\r
-    tbm_bufmgr bufmgr; /**< tbm buffer manager */\r
-\r
-    int ref_cnt;       /**< ref count of bo */\r
-\r
-    int flags;         /**< TBM_BO_FLAGS :bo memory type */\r
-\r
-    unsigned int tgl_key; /**< global key for tizen global lock */\r
-\r
-    /* for cache control */\r
-    unsigned int map_cnt; /**< device map count */\r
-    tbm_bo_cache_state cache_state; /**< cache state */\r
-\r
-    int lock_cnt; /**< lock count of bo */\r
-\r
-    struct list_head user_data_list; /**< list of the user_date in bo */\r
-\r
-    void *priv; /**< bo private */\r
-\r
-    struct list_head item_link; /**< link of bo */\r
-};\r
-\r
-/**\r
- * @brief tbm_bufmgr : structure for tizen buffer manager\r
- *\r
- */\r
-struct _tbm_bufmgr\r
-{\r
-    int ref_count; /**< ref count of bufmgr */\r
-\r
-    pthread_mutex_t lock; /**< mutex lock */\r
-\r
-    int fd;  /**< bufmgr fd */\r
-\r
-    int lock_fd; /**< fd of tizen global lock */\r
-\r
-    int lock_type; /**< lock_type of bufmgr */\r
-\r
-    int use_map_cache; /**< flag to use the map_cahce */\r
-\r
-    struct list_head bo_list; /**< list of bos belonging to bufmgr */\r
-\r
-    void *module_data;\r
-\r
-    tbm_bufmgr_backend backend; /**< bufmgr backend */\r
-\r
-    struct list_head link; /**< link of bufmgr */\r
-};\r
-\r
-#endif  /* _TBM_BUFMGR_INT_H_ */\r
+/**************************************************************************
+
+libtbm
+
+Copyright 2012 Samsung Electronics co., Ltd. All Rights Reserved.
+
+Contact: SooChan Lim <sc1.lim@samsung.com>, Sangjin Lee <lsj119@samsung.com>
+Boram Park <boram1288.park@samsung.com>, Changyeon Lee <cyeon.lee@samsung.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+#ifndef _TBM_BUFMGR_INT_H_
+#define _TBM_BUFMGR_INT_H_
+
+#include <sys/time.h>
+#include <unistd.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dlfcn.h>
+#include <dirent.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <pthread.h>
+#include <dlog.h>
+#include <tbm_bufmgr.h>
+#include <tbm_bo.h>
+#include <tbm_surface.h>
+#include <tbm_surface_internal.h>
+#include <tbm_surface_queue.h>
+#include <tbm_log.h>
+#include <tbm_bufmgr_backend.h>
+#include <tbm_backend.h>
+#include <tbm_error.h>
+#include <hal/hal-tbm.h>
+
+extern tbm_bufmgr gBufMgr;
+extern int b_dump_queue;
+extern int trace_mask;
+
+#define TBM_BO_MAGIC 0xBF011234
+
+#define C(b, m)                (((b) >> (m)) & 0xFF)
+#define B(c, s)                ((((unsigned int)(c)) & 0xff) << (s))
+#define FOURCC(a, b, c, d)     (B(d, 24) | B(c, 16) | B(b, 8) | B(a, 0))
+#define FOURCC_STR(id)         C(id, 0), C(id, 8), C(id, 16), C(id, 24)
+#define FOURCC_ID(str)         FOURCC(((char*)str)[0], ((char*)str)[1], ((char*)str)[2], ((char*)str)[3])
+
+/* check flags */
+#define RETURN_CHECK_FLAG(cond) {\
+       if ((cond)) {\
+               return;\
+       } \
+}
+#define RETURN_VAL_CHECK_FLAG(cond, val) {\
+       if ((cond)) {\
+               return val;\
+       } \
+}
+
+#define TBM_TRACE_BO(fmt, args...) \
+       do { \
+               if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_BO) { \
+                       struct timespec ts; \
+                       clock_gettime(CLOCK_MONOTONIC, &ts); \
+                       tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+                                                 (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                                 (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+               } \
+       } while (0)
+
+#define TBM_TRACE_SURFACE_INTERNAL(fmt, args...) \
+       do { \
+               if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_INTERNAL) { \
+                       struct timespec ts; \
+                       clock_gettime(CLOCK_MONOTONIC, &ts); \
+                       tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+                                                 (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                                 (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+               } \
+       } while (0)
+
+#define TBM_TRACE_SURFACE(fmt, args...) \
+       do { \
+               if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE) { \
+                       struct timespec ts; \
+                       clock_gettime(CLOCK_MONOTONIC, &ts); \
+                       tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+                                                 (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                                 (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+               } \
+       } while (0)
+
+#define TBM_TRACE_SURFACE_QUEUE(fmt, args...) \
+       do { \
+               if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_QUEUE) { \
+                       struct timespec ts; \
+                       clock_gettime(CLOCK_MONOTONIC, &ts); \
+                       tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+                                                 (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                                 (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+               } \
+       } while (0)
+
+#define TBM_TRACE(fmt, args...) \
+       do { \
+               if (trace_mask&0x1) { \
+                       struct timespec ts; \
+                       clock_gettime(CLOCK_MONOTONIC, &ts); \
+                       tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+                                                 (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                                 (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+               } \
+       } while (0)
+
+
+/* check validation */
+#define TBM_BUFMGR_IS_VALID(mgr) (mgr && mgr == gBufMgr)
+#define TBM_BO_IS_VALID(bo) (bo && \
+                           TBM_BUFMGR_IS_VALID(bo->bufmgr) && \
+                           bo->item_link.next && \
+                           bo->item_link.next->prev == &bo->item_link)
+#define TBM_SURFACE_IS_VALID(surf) (surf && \
+                                  TBM_BUFMGR_IS_VALID(surf->bufmgr) && \
+                                  surf->item_link.next && \
+                                  surf->item_link.next->prev == &surf->item_link)
+
+
+#define TBM_SNRPRINTF(p, len, count, fmt, ARG...)  \
+       do { \
+               if (p) { \
+                       int rest = len - count; \
+                       int s = snprintf(&p[count], rest, fmt, ##ARG); \
+                       while (s >= rest) { \
+                               len *= 2; \
+                               p = realloc(p, len); \
+                               rest = len - count; \
+                               s = snprintf(&p[count], rest, fmt, ##ARG); \
+                       } \
+                       count += s; \
+               } \
+       } while (0)
+
+struct list_head {
+       struct list_head *prev;
+       struct list_head *next;
+};
+
+typedef enum _tbm_module_type {
+       TBM_MODULE_TYPE_NONE,
+       TBM_MODULE_TYPE_HAL_TBM,
+       TBM_MODULE_TYPE_TBM_BACKEND,
+       TBM_MODULE_TYPE_BUFMGR_BACKEND,
+} tbm_module_type;
+
+typedef struct _tbm_module {
+       tbm_module_type type;
+
+       void *module_data;                         /* backend module */
+       tbm_bufmgr_backend   backend;              /* bufmgr backend (will be DEPRECATED) */
+
+       tbm_backend_module       *backend_module_data;  /* backend module data */
+       tbm_backend_bufmgr_data  *bufmgr_data;          /* backend data of the backend module */
+       tbm_backend_bufmgr_func  *bufmgr_func;          /* backend functions for bufmgr */
+       tbm_backend_bo_func      *bo_func;              /* backend functions for bo */
+
+       int use_hal_tbm;                                /* use hal-api-tbm */
+       int auth_wl_socket_created;                     /* create wayland socket for authenticated drm_fd */
+       int auth_fd;
+       hal_tbm_backend          *hal_backend;          /* hal-api-tbm backend */
+       hal_tbm_bufmgr           *hal_bufmgr;           /* hal-api-tbm bufmgr */
+} tbm_module;
+
+/**
+ * @brief tbm_bo : buffer object of Tizen Buffer Manager
+ */
+struct _tbm_bo {
+       unsigned int magic;              /* tbm bo magic number */
+       tbm_bufmgr bufmgr;               /* tbm buffer manager */
+       int ref_cnt;                     /* ref count of bo */
+       int flags;                       /* TBM_BO_FLAGS :bo memory type */
+       struct list_head user_data_list; /* list of the user_date in bo */
+       void *priv;                      /* bo private  (will be DEPRECATED) */
+       struct list_head item_link;      /* link of bo */
+       tbm_surface_h surface;           /* tbm_surface */
+       int lock_cnt;                    /* lock count of bo */
+       unsigned int map_cnt;            /* device map count */
+
+       tbm_backend_bo_data *bo_data;    /* bo data of the backend module */
+       int get_from_hal_surface;        /* bo_data has be detroyed by hal backend */
+};
+
+/**
+ * @brief tbm_bufmgr : structure for tizen buffer manager
+ *
+ */
+struct _tbm_bufmgr {
+       int ref_count;                    /* reference count */
+       int fd;                           /* bufmgr fd */
+       tbm_bufmgr_bo_lock_type bo_lock_type;  /* lock_type of bufmgr */
+       int capabilities;                 /* capabilities of bufmgr */
+       int display_server;               /* used by display server */
+       unsigned int bo_cnt;              /* number of bos */
+       struct list_head bo_list;         /* list of bos belonging to bufmgr */
+       struct list_head surf_list;       /* list of surfaces belonging to bufmgr */
+       struct list_head surf_queue_list; /* list of surface queues belonging to bufmgr */
+       struct list_head debug_key_list;  /* list of debug data key list belonging to bufmgr */
+
+       //TODO: tbm_module *module;
+       tbm_module *module;               /* tbm module */
+
+       //TODO: replace this to data in tbm_module *module
+       void *module_data;                         /* backend module */
+       tbm_bufmgr_backend   backend;              /* bufmgr backend (will be DEPRECATED) */
+
+       tbm_backend_module       *backend_module_data;  /* backend module data */
+       tbm_backend_bufmgr_data  *bufmgr_data;          /* backend data of the backend module */
+       tbm_backend_bufmgr_func  *bufmgr_func;          /* backend functions for bufmgr */
+       tbm_backend_bo_func      *bo_func;              /* backend functions for bo */
+
+       int use_hal_tbm;                                /* use hal-api-tbm */
+       int auth_wl_socket_created;                     /* create wayland socket for authenticated drm_fd */
+       int auth_fd;
+       hal_tbm_backend          *hal_backend;          /* hal-api-tbm backend */
+       hal_tbm_bufmgr           *hal_bufmgr;           /* hal-api-tbm bufmgr */
+};
+
+/**
+ * @brief tbm_surface : structure for tizen buffer surface
+ *
+ */
+struct _tbm_surface {
+       unsigned int magic;         /* tbm surface magic number */
+
+       tbm_bufmgr bufmgr;                      /* tbm buffer manager */
+
+       tbm_surface_info_s info;        /* tbm surface information */
+
+       int flags;
+
+       int num_bos;                            /* the number of buffer objects */
+
+       tbm_bo bos[4];
+
+       int num_planes;                         /* the number of buffer objects */
+
+       int planes_bo_idx[TBM_SURF_PLANE_MAX];
+
+       int refcnt;
+
+       unsigned int debug_pid;
+
+       struct list_head item_link; /* link of surface */
+
+       struct list_head user_data_list;        /* list of the user_data in surface */
+
+       struct list_head debug_data_list;       /* list of debug data */
+
+       struct list_head destroy_funcs; /* list of destory callback function */
+
+       struct {
+               int x;
+               int y;
+               int width;
+               int height;
+       } damage;
+
+       hal_tbm_surface *hal_surface; // hal_tbm_surface
+};
+
+typedef struct {
+       unsigned long key;
+       void *data;
+       tbm_data_free free_func;
+
+       /* link of user_data */
+       struct list_head item_link;
+} tbm_user_data;
+
+typedef struct {
+       char *key;
+       char *value;
+
+       /* link of user_data */
+       struct list_head item_link;
+} tbm_surface_debug_data;
+
+typedef struct _tbm_surface_destroy_func_info {
+       tbm_surface_internal_destroy_handler destroy_func;
+       void *user_data;
+
+       struct list_head item_link;
+} tbm_surface_destroy_func_info;
+
+tbm_bufmgr _tbm_bufmgr_get_bufmgr(void);
+int _tbm_bo_set_surface(tbm_bo bo, tbm_surface_h surface);
+int _tbm_surface_is_valid(tbm_surface_h surface);
+void _tbm_bo_free(tbm_bo bo);
+
+int tbm_surface_internal_get_info(tbm_surface_h surface, int opt,
+                                 tbm_surface_info_s *info, int map);
+void tbm_surface_internal_unmap(tbm_surface_h surface);
+unsigned int tbm_surface_internal_get_width(tbm_surface_h surface);
+unsigned int tbm_surface_internal_get_height(tbm_surface_h surface);
+tbm_format tbm_surface_internal_get_format(tbm_surface_h surface);
+unsigned int _tbm_surface_internal_get_debug_pid(tbm_surface_h surface);
+char *_tbm_surface_internal_format_to_str(tbm_format format);
+char * _tbm_surface_internal_get_debug_data(tbm_surface_h surface, char *key);
+
+tbm_user_data *user_data_lookup(struct list_head *user_data_list,
+                               unsigned long key);
+tbm_user_data *user_data_create(unsigned long key,
+                               tbm_data_free data_free_func);
+void user_data_delete(tbm_user_data *user_data);
+
+int tbm_bufmgr_get_fd_limit(void);
+tbm_bufmgr tbm_bufmgr_get(void);
+
+void _tbm_set_last_result(tbm_error_e err);
+
+char *_tbm_flag_to_str(int f);
+
+/* functions for mutex */
+void _tbm_bufmgr_mutex_lock(void);
+void _tbm_bufmgr_mutex_unlock(void);
+tbm_bo tbm_bufmgr_internal_find_bo(tbm_bufmgr bufmgr, tbm_bo bo);
+
+tbm_bo tbm_bufmgr_internal_alloc_bo(tbm_bufmgr bufmgr, int size, int flags, tbm_error_e *error);
+tbm_bo tbm_bufmgr_internal_alloc_bo_with_format(tbm_bufmgr bufmgr, int format, int bo_idx, int width, int bpp, int height, tbm_bo_memory_type flags, tbm_error_e *error);
+tbm_bo tbm_bufmgr_internal_alloc_bo_with_bo_data(tbm_bufmgr bufmgr, tbm_backend_bo_data *bo_data, int flags);
+tbm_bo tbm_bufmgr_internal_import_bo_with_key(tbm_bufmgr bufmgr, tbm_key key, tbm_error_e *error);
+tbm_bo tbm_bufmgr_internal_import_bo_with_fd(tbm_bufmgr bufmgr, tbm_fd fd, tbm_error_e *error);
+
+/* tbm_module functions */
+tbm_module *tbm_module_load(int fd);
+void        tbm_module_unload(tbm_module *module);
+
+int                  tbm_module_bufmgr_get_capabilities(tbm_module *module, tbm_error_e *error);
+tbm_error_e          tbm_module_bufmgr_bind_native_display(tbm_module *module, void *native_display);
+tbm_error_e          tbm_module_bufmgr_get_supported_formats(tbm_module *module, uint32_t **formats, uint32_t *num);
+tbm_error_e          tbm_module_bufmgr_get_plane_data(tbm_module *module, int format, int plane_idx, uint32_t w, uint32_t h, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx);
+tbm_backend_bo_data *tbm_module_bufmgr_bo_alloc(tbm_module *module, tbm_bo bo, int size, int flags, tbm_error_e *error);
+tbm_backend_bo_data *tbm_module_bufmgr_bo_alloc_with_format(tbm_module *module, int format, int bo_idx, int width, int height, int bpp, tbm_bo_memory_type flags, tbm_error_e *error);
+tbm_backend_bo_data *tbm_module_bufmgr_bo_import_fd(tbm_module *module, tbm_bo bo, tbm_fd fd, tbm_error_e *error);
+tbm_backend_bo_data *tbm_module_bufmgr_bo_import_key(tbm_module *module, tbm_bo bo, tbm_key key, tbm_error_e *error);
+
+#endif /* _TBM_BUFMGR_INT_H_ */