tbm_bufmgr: add tbm_bufmgr_internal_import_bo_with_fd and use it
[platform/core/uifw/libtbm.git] / src / tbm_bufmgr_int.h
index 33eccd2..7776b3c 100644 (file)
@@ -57,11 +57,21 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #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)) {\
@@ -162,10 +172,36 @@ struct list_head {
        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 */
@@ -177,6 +213,7 @@ struct _tbm_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 */
 };
 
 /**
@@ -184,7 +221,6 @@ struct _tbm_bo {
  *
  */
 struct _tbm_bufmgr {
-       pthread_mutex_t lock;             /* mutex lock */
        int ref_count;                    /* reference count */
        int fd;                           /* bufmgr fd */
        tbm_bufmgr_bo_lock_type bo_lock_type;  /* lock_type of bufmgr */
@@ -196,6 +232,10 @@ struct _tbm_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) */
 
@@ -203,6 +243,12 @@ struct _tbm_bufmgr {
        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 */
 };
 
 /**
@@ -210,6 +256,8 @@ struct _tbm_bufmgr {
  *
  */
 struct _tbm_surface {
+       unsigned int magic;         /* tbm surface magic number */
+
        tbm_bufmgr bufmgr;                      /* tbm buffer manager */
 
        tbm_surface_info_s info;        /* tbm surface information */
@@ -230,9 +278,20 @@ struct _tbm_surface {
 
        struct list_head item_link; /* link of surface */
 
-       struct list_head user_data_list;        /* list of the user_date in 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 {
@@ -252,12 +311,18 @@ typedef struct {
        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);
 
-/* functions for mutex */
 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);
@@ -276,4 +341,33 @@ void user_data_delete(tbm_user_data *user_data);
 
 int tbm_bufmgr_get_fd_limit(void);
 tbm_bufmgr tbm_bufmgr_get(void);
-#endif                                                 /* _TBM_BUFMGR_INT_H_ */
+
+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_ */